233 lines
7.1 KiB
Markdown
233 lines
7.1 KiB
Markdown
|
|
# 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 Session
|
||
|
|
- `stripePaymentIntent` - For refunds/payment verification
|
||
|
|
- `stripeCustomerId` - Reusable customer ID
|
||
|
|
- `baseAmount` - Pre-fee amount (from metadata)
|
||
|
|
- `processingFee` - Stripe processing fee (from metadata)
|
||
|
|
|
||
|
|
**Billing Address (6 fields):**
|
||
|
|
- `billingCity`
|
||
|
|
- `billingCountry`
|
||
|
|
- `billingLine1`
|
||
|
|
- `billingLine2`
|
||
|
|
- `billingPostalCode`
|
||
|
|
- `billingState`
|
||
|
|
|
||
|
|
**B2B Customer Support (3 fields):**
|
||
|
|
- `businessName` - Business name for B2B purchases
|
||
|
|
- `taxIdType` - 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 with `businessName`
|
||
|
|
- `paymentReference` - Redundant with `stripePaymentIntent`
|
||
|
|
|
||
|
|
#### Made Optional
|
||
|
|
All vessel and trip fields (since not all orders are yacht trips):
|
||
|
|
- `vesselName`, `imoNumber`, `vesselType`, `vesselLength`
|
||
|
|
- `departurePort`, `arrivalPort`, `distance`, `avgSpeed`, `duration`, `enginePower`
|
||
|
|
|
||
|
|
### 3. Real-World Data Verification
|
||
|
|
Analyzed actual business payment from Stripe (event: `evt_1SPPa3Pdj1mnVT5kscrqB21t`):
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
{
|
||
|
|
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
|
||
|
|
|
||
|
|
1. **Test Enhanced Logging**
|
||
|
|
- Run test payment through Stripe
|
||
|
|
- Verify all fields appear in logs
|
||
|
|
- Document any missing fields
|
||
|
|
|
||
|
|
2. **Create NocoDB Table**
|
||
|
|
- Use schema from `docs/NOCODB_SCHEMA.md`
|
||
|
|
- Configure field types (String, DateTime, etc.)
|
||
|
|
- Set required field validation
|
||
|
|
|
||
|
|
3. **Implement Database Integration**
|
||
|
|
- Create `nocodbClient.createOrder()` method
|
||
|
|
- Map Stripe session data to NocoDB fields
|
||
|
|
- Call from webhook handler after payment confirmation
|
||
|
|
|
||
|
|
4. **Add Webhook Handler**
|
||
|
|
- Extract all fields from `session` object
|
||
|
|
- Handle B2B vs individual customer logic
|
||
|
|
- Store complete record in NocoDB
|
||
|
|
- Add error handling and retry logic
|
||
|
|
|
||
|
|
5. **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 }`
|
||
|
|
|
||
|
|
## 📚 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
|
||
|
|
|
||
|
|
1. **Business Customers:** Stripe clearly distinguishes business vs individual:
|
||
|
|
- `business_name` populated for B2B
|
||
|
|
- `individual_name` populated for B2C
|
||
|
|
- `name` serves as display name (either business or individual)
|
||
|
|
|
||
|
|
2. **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)
|
||
|
|
|
||
|
|
3. **Phone Numbers:** Available when `phone_number_collection.enabled: true`
|
||
|
|
|
||
|
|
4. **Processing Fees:** Must be calculated and passed in metadata (not automatic)
|
||
|
|
|
||
|
|
5. **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)
|