puffin-app/docs/NOCODB_INTEGRATION_GUIDE.md
Matt dc4fc45c4f
All checks were successful
Build and Push Docker Images / docker (push) Successful in 2m28s
Add NocoDB integration for order management with comprehensive Stripe webhook logging
Features:
- Complete NocoDB schema with 42 fields supporting B2B and B2C customers
- Server-side NocoDB client (REST API integration)
- Stripe session data mapper with automatic field mapping
- Enhanced webhook handler with comprehensive logging
- Automatic order creation in NocoDB after payment
- Fulfillment data updates with Wren order IDs
- Support for business customers (VAT/EIN, business names)
- Complete billing address capture
- Non-blocking error handling (webhook succeeds even if NocoDB fails)

Files Added:
- server/utils/nocodbClient.js - NocoDB REST API client
- server/utils/nocodbMapper.js - Stripe to NocoDB data mapper
- docs/NOCODB_SCHEMA.md - Complete field reference (42 columns)
- docs/NOCODB_INTEGRATION_GUIDE.md - Testing and deployment guide
- docs/TESTING_STRIPE_WEBHOOK.md - Webhook testing instructions
- docs/STRIPE_INTEGRATION_SUMMARY.md - Project overview

Files Modified:
- server/routes/webhooks.js - Added NocoDB integration and enhanced logging
- src/types.ts - Updated OrderRecord interface with new fields
- src/api/nocodbClient.ts - Added createOrder() method
- .env.example - Added NocoDB configuration template

Schema includes:
- Payment tracking (Stripe session/intent/customer IDs, amounts, fees)
- Carbon offset details (tons, portfolio, Wren order ID)
- Customer information (name, email, phone, business name)
- Tax ID collection (VAT, EIN, etc.)
- Complete billing address
- Optional vessel/trip details for yacht calculations

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 16:35:15 +01:00

9.0 KiB

NocoDB Integration Guide

🎯 Overview

This guide explains how to test and verify the NocoDB integration with Stripe webhooks.

Implementation Summary

Files Created/Modified

New Files:

  • server/utils/nocodbClient.js - NocoDB REST API client
  • server/utils/nocodbMapper.js - Maps Stripe data to NocoDB format
  • docs/NOCODB_INTEGRATION_GUIDE.md - This file

Modified Files:

  • server/routes/webhooks.js - Added NocoDB integration
  • src/api/nocodbClient.ts - Added createOrder() method
  • .env.example - Added NocoDB configuration template

Integration Flow

Stripe Payment Complete
        ↓
Webhook: checkout.session.completed
        ↓
logStripeSessionData() - Comprehensive logging
        ↓
Order.updateStatus() - Update local DB
        ↓
saveOrderToNocoDB() - Save to NocoDB ✨ NEW
        ↓
fulfillOrder() - Create Wren offset
        ↓
updateNocoDBFulfillment() - Update with Wren data ✨ NEW
        ↓
Send receipt email

🔧 Environment Variables

Ensure these are set in server/.env:

# NocoDB Configuration
NOCODB_BASE_URL=https://database.puffinoffset.com
NOCODB_BASE_ID=p11p8be6tzttkhy
NOCODB_API_KEY=Y1thvyr9N53n8WFn7rCgY3ZnLlzPFc4_BdwXCmx-
NOCODB_ORDERS_TABLE_ID=mxusborf4x91e1j

How to find these values:

  1. NOCODB_BASE_URL: Your NocoDB instance URL
  2. NOCODB_BASE_ID: Go to Base → Copy Base ID
  3. NOCODB_API_KEY: User Settings → Tokens → Create Token
  4. NOCODB_ORDERS_TABLE_ID: Open table → URL contains table ID

🧪 Testing the Integration

Setup:

# Forward webhooks to local server
stripe listen --forward-to localhost:3000/api/webhooks/stripe

# In another terminal, start the server
cd server
npm run dev

Trigger Test Payment:

stripe trigger checkout.session.completed

Expected Console Output:

📬 Received webhook: checkout.session.completed

╔════════════════════════════════════════════════════════════════╗
║         STRIPE CHECKOUT SESSION - COMPREHENSIVE DATA          ║
╚════════════════════════════════════════════════════════════════╝
... (all Stripe data logged)

✅ Checkout session completed: cs_test_...
💳 Payment confirmed for order: e0e976e5-...
   Amount: $1649.79

💾 Saving order e0e976e5-... to NocoDB...
✅ Order saved to NocoDB successfully
   NocoDB Record ID: 123
   Order ID: e0e976e5-...
   Customer: Matthew Ciaccio (matt@letsbe.solutions)
   Business: LetsBe Solutions LLC
   Tax ID: eu_vat - FRAB123456789

🌱 Fulfilling order via Wren API...
✅ Order fulfilled successfully
   Wren Order ID: wren_...
   Tons offset: 6.73

💾 Updating NocoDB with fulfillment data...
✅ NocoDB updated with fulfillment data
   Wren Order ID: wren_...
   Status: fulfilled

📧 Receipt email sent to matt@letsbe.solutions

Method 2: Real Test Payment

  1. Start Server:

    cd server
    npm run dev
    
  2. Make Test Payment:

    • Navigate to checkout
    • Use test card: 4242 4242 4242 4242
    • Fill in test billing information
    • Complete payment
  3. Check Logs:

    • Look for NocoDB save confirmation
    • Verify fulfillment update logs
  4. Verify in NocoDB:

    • Open NocoDB Orders table
    • Find the new order by orderId
    • Check all fields are populated

🔍 Verification Checklist

After a test payment, verify:

Server Logs

  • Comprehensive Stripe data logged
  • "Saving order to NocoDB" message
  • "Order saved to NocoDB successfully" with Record ID
  • "Updating NocoDB with fulfillment data" message
  • "NocoDB updated with fulfillment data" message

NocoDB Database

  • New record exists in Orders table
  • orderId matches Stripe order
  • status = "fulfilled" (after Wren fulfillment)
  • stripeSessionId populated
  • stripePaymentIntent populated
  • baseAmount, processingFee, totalAmount correct
  • co2Tons, portfolioId from metadata
  • customerName, customerEmail populated
  • customerPhone populated (if collected)
  • businessName populated (if B2B)
  • taxIdType and taxIdValue populated (if collected)
  • billingLine1, billingCity, billingCountry populated
  • wrenOrderId populated after fulfillment
  • fulfilledAt timestamp set

Error Handling

Test error scenarios:

  • NocoDB temporarily unavailable (should log error but not fail webhook)
  • Invalid NocoDB credentials (should skip gracefully)
  • Wren API failure (should still save to NocoDB with status='paid')

🐛 Troubleshooting

Issue: "NocoDB not configured"

Cause: Environment variables missing or incorrect

Fix:

# Check environment variables
cd server
cat .env | grep NOCODB

# Ensure all 4 variables are set:
# NOCODB_BASE_URL
# NOCODB_BASE_ID
# NOCODB_API_KEY
# NOCODB_ORDERS_TABLE_ID

Issue: "NocoDB request failed: 401"

Cause: Invalid API key

Fix:

  1. Go to NocoDB → User Settings → Tokens
  2. Create new token
  3. Update NOCODB_API_KEY in .env
  4. Restart server

Issue: "NocoDB request failed: 404"

Cause: Incorrect table ID or base ID

Fix:

  1. Open your Orders table in NocoDB
  2. Check URL: https://nocodb.com/nc/BASE_ID/TABLE_ID
  3. Update NOCODB_BASE_ID and NOCODB_ORDERS_TABLE_ID
  4. Restart server

Issue: Order saved but fields are null

Cause: Stripe metadata not passed correctly

Fix: Check checkout session creation includes metadata:

const session = await stripe.checkout.sessions.create({
  metadata: {
    baseAmount: '160174',
    processingFee: '4805',
    portfolioId: '37',
    tons: '6.73',
    // Add vessel/trip data if available
  },
  // ... other settings
});

Issue: Business fields not populated

Cause: Stripe checkout not collecting business information

Fix: Update checkout session to collect business details:

const session = await stripe.checkout.sessions.create({
  customer_creation: 'always',
  tax_id_collection: {
    enabled: true,
    required: 'never' // or 'if_supported'
  },
  // ... other settings
});

📊 Database Record Example

Expected NocoDB Record (Business Customer):

{
  "Id": 123,
  "CreatedAt": "2025-11-03T14:30:00.000Z",
  "UpdatedAt": "2025-11-03T14:31:00.000Z",
  "orderId": "e0e976e5-4272-4f5b-a379-c059df6cb5de",
  "status": "fulfilled",
  "source": "web",
  "stripeSessionId": "cs_test_...",
  "stripePaymentIntent": "pi_...",
  "stripeCustomerId": "cus_TM7pU6vRGh0N5N",
  "baseAmount": "160174",
  "processingFee": "4805",
  "totalAmount": "164979",
  "currency": "USD",
  "amountUSD": "164979",
  "paymentMethod": "card",
  "co2Tons": "6.73",
  "portfolioId": "37",
  "portfolioName": null,
  "wrenOrderId": "wren_order_123",
  "certificateUrl": null,
  "fulfilledAt": "2025-11-03T14:31:00.000Z",
  "customerName": "LetsBe Solutions LLC",
  "customerEmail": "matt@letsbe.solutions",
  "customerPhone": "+33633219796",
  "businessName": "LetsBe Solutions LLC",
  "taxIdType": "eu_vat",
  "taxIdValue": "FRAB123456789",
  "billingLine1": "108 Avenue du Trois Septembre",
  "billingLine2": null,
  "billingCity": "Cap-d'Ail",
  "billingState": null,
  "billingPostalCode": "06320",
  "billingCountry": "FR",
  "vesselName": null,
  "imoNumber": null,
  "vesselType": null,
  "vesselLength": null,
  "departurePort": null,
  "arrivalPort": null,
  "distance": null,
  "avgSpeed": null,
  "duration": null,
  "enginePower": null,
  "notes": null
}

🚀 Deployment Checklist

Before deploying to production:

  • All NocoDB columns created (42 total)
  • Environment variables configured in production .env
  • NocoDB API key has proper permissions
  • Stripe webhook endpoint configured in Stripe Dashboard
  • Webhook signing secret set in production .env
  • Test payment processed successfully
  • Verify data appears correctly in NocoDB
  • Error handling tested (NocoDB unavailable scenario)
  • Logs reviewed for any warnings or errors

📝 Next Steps

  1. Test with Real Payment:

    • Make a test purchase
    • Verify all fields in NocoDB
    • Check fulfillment updates correctly
  2. Enable Additional Features (Optional):

    • Phone number collection in checkout
    • Tax ID collection for B2B customers
    • Vessel/trip metadata for yacht calculations
  3. Admin Portal Integration:

    • Connect admin dashboard to NocoDB
    • Display orders table with filters
    • Add order management functionality
  4. Monitoring:

    • Set up alerts for failed NocoDB saves
    • Monitor webhook processing times
    • Track fulfillment success rate
  • Schema Reference: docs/NOCODB_SCHEMA.md
  • Stripe Webhook Testing: docs/TESTING_STRIPE_WEBHOOK.md
  • Integration Summary: docs/STRIPE_INTEGRATION_SUMMARY.md

Status: Integration complete and ready for testing Last Updated: 2025-11-03