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>
7.1 KiB
Stripe Integration & Database Schema - Summary
📋 Overview
This document summarizes the database schema updates and Stripe webhook logging enhancements completed on 2025-11-03.
✅ Completed Tasks
1. Enhanced Webhook Logging
File: server/routes/webhooks.js
Added comprehensive logging function logStripeSessionData() that displays:
- Session information (ID, payment intent, status, timestamps)
- Payment amounts (total, subtotal, currency)
- Customer details (name, business name, individual name, email, phone)
- Billing address (all fields)
- Business customer fields (business name, tax IDs)
- Payment method types
- Metadata (custom fields)
- Additional fields (locale, customer ID, etc.)
Output Format:
╔════════════════════════════════════════════════════════════════╗
║ STRIPE CHECKOUT SESSION - COMPREHENSIVE DATA ║
╚════════════════════════════════════════════════════════════════╝
📋 SESSION INFORMATION:
💰 PAYMENT AMOUNT:
👤 CUSTOMER DETAILS:
📬 BILLING ADDRESS:
💳 PAYMENT METHOD:
🏷️ METADATA:
... (and more)
2. Updated Database Schema
Files:
docs/NOCODB_SCHEMA.md(comprehensive documentation)src/types.ts(TypeScript interfaces)
Added Fields (19 new fields)
Payment & Stripe Integration (5 fields):
stripeSessionId- Link to Stripe Checkout SessionstripePaymentIntent- For refunds/payment verificationstripeCustomerId- Reusable customer IDbaseAmount- Pre-fee amount (from metadata)processingFee- Stripe processing fee (from metadata)
Billing Address (6 fields):
billingCitybillingCountrybillingLine1billingLine2billingPostalCodebillingState
B2B Customer Support (3 fields):
businessName- Business name for B2B purchasestaxIdType- Tax ID type (eu_vat, us_ein, gb_vat, etc.)taxIdValue- Tax identification number
Customer Details (1 field):
customerPhone- Customer phone number (if collected)
Removed Fields (2 fields)
customerCompany- Redundant withbusinessNamepaymentReference- Redundant withstripePaymentIntent
Made Optional
All vessel and trip fields (since not all orders are yacht trips):
vesselName,imoNumber,vesselType,vesselLengthdeparturePort,arrivalPort,distance,avgSpeed,duration,enginePower
3. Real-World Data Verification
Analyzed actual business payment from Stripe (event: evt_1SPPa3Pdj1mnVT5kscrqB21t):
{
amount: $165,042.96,
baseAmount: $160,235.88,
processingFee: $4,807.08,
businessName: "LetsBe Solutions LLC",
taxIdType: "eu_vat",
taxIdValue: "FRAB123456789",
customerPhone: "+33633219796",
billingCountry: "FR"
// ... all other fields
}
4. Documentation Created
-
docs/NOCODB_SCHEMA.md- Complete field reference with:- Field definitions table
- Required vs optional indicators
- Stripe webhook mapping guide
- Real-world example data
- Field type notes
- Change log
-
docs/TESTING_STRIPE_WEBHOOK.md- Testing guide with:- Three testing methods (Stripe CLI, real payments, dashboard)
- Expected log output examples
- Verification checklist
- Common issues & fixes
- Test data to use
-
docs/STRIPE_INTEGRATION_SUMMARY.md- This file
📊 Final Schema Statistics
Total Fields: 42 fields
- Required: 10 fields
- Optional: 32 fields
Categories:
- Core Identification: 6 fields
- Payment Information: 8 fields
- Carbon Offset Details: 6 fields
- Customer Information: 13 fields
- Vessel Information: 4 fields (optional)
- Trip Details: 6 fields (optional)
- Administrative: 1 field
🎯 Key Features
B2B Support
- Full business customer information capture
- Tax ID collection (VAT, EIN, etc.)
- Business name separate from individual name
- Reusable customer profiles via Stripe Customer ID
Payment Transparency
- Separate base amount and processing fee tracking
- Full Stripe payment references for refunds
- Multiple payment method support
- Currency conversion tracking (amountUSD)
Comprehensive Billing
- Complete billing address capture
- Phone number collection (optional)
- Country/region support for international customers
Flexible Use Cases
- Yacht trip calculations (vessel/trip fields optional)
- Direct offset purchases (no vessel required)
- Multiple order sources (web, mobile-app, manual, api)
🔄 Data Flow
Checkout Form
↓
Stripe Checkout Session
↓ (metadata)
Stripe Payment Success
↓ (webhook)
Server Webhook Handler
↓ (logStripeSessionData)
Enhanced Logging
↓ (session data)
NocoDB Database
↓
Admin Portal Display
🧪 Testing Status
✅ Webhook Logging Enhanced - Comprehensive data display implemented ⏳ Pending: Live webhook testing with real payment ⏳ Pending: NocoDB table creation ⏳ Pending: Webhook-to-database mapping implementation
📝 Next Steps
-
Test Enhanced Logging
- Run test payment through Stripe
- Verify all fields appear in logs
- Document any missing fields
-
Create NocoDB Table
- Use schema from
docs/NOCODB_SCHEMA.md - Configure field types (String, DateTime, etc.)
- Set required field validation
- Use schema from
-
Implement Database Integration
- Create
nocodbClient.createOrder()method - Map Stripe session data to NocoDB fields
- Call from webhook handler after payment confirmation
- Create
-
Add Webhook Handler
- Extract all fields from
sessionobject - Handle B2B vs individual customer logic
- Store complete record in NocoDB
- Add error handling and retry logic
- Extract all fields from
-
Enable Phone & Tax Collection
- Update checkout session creation in
server/routes/checkout.js - Add
phone_number_collection: { enabled: true } - Add
tax_id_collection: { enabled: true }
- Update checkout session creation in
📚 Reference Files
- Schema:
docs/NOCODB_SCHEMA.md - Testing:
docs/TESTING_STRIPE_WEBHOOK.md - Types:
src/types.ts:147-202(OrderRecord interface) - Webhook:
server/routes/webhooks.js:15-124(logStripeSessionData) - NocoDB Client:
src/api/nocodbClient.ts
💡 Key Insights from Real Data
-
Business Customers: Stripe clearly distinguishes business vs individual:
business_namepopulated for B2Bindividual_namepopulated for B2Cnameserves as display name (either business or individual)
-
Tax Collection: When enabled, provides structured tax IDs:
- Type (eu_vat, us_ein, gb_vat, etc.)
- Value (actual tax number)
- Multiple tax IDs possible (array)
-
Phone Numbers: Available when
phone_number_collection.enabled: true -
Processing Fees: Must be calculated and passed in metadata (not automatic)
-
Customer IDs: Stripe creates reusable customer objects for future purchases
Status: ✅ Schema finalized and documented Last Updated: 2025-11-03 Real Data Verified: Yes (business purchase with VAT)