Webhook Endpoint
POST /api/webhooks/payments
Receives and processes webhook events from payment providers.
Implementation Overview
Fromsrc/app/api/webhooks/payments/route.ts:10-225, the webhook handler:
- Verifies webhook signature based on active provider
- Parses the event into a standardized format
- Processes the event via payment adapter
- Updates database with customer, subscription, and payment data
Webhook Flow
Signature Verification
All webhook requests are verified using provider-specific signatures to ensure authenticity.
Signature Headers by Provider
src/app/api/webhooks/payments/route.ts:22-42.
Supported Events
Customer Events
event
New customer createdUpdates: Creates new record in
customer tableevent
Customer information updatedUpdates: Updates email and metadata in
customer tableevent
Customer deletedUpdates: Can cascade delete related records
Subscription Events
event
New subscription createdUpdates: Creates record in
subscription table with status active or trialingevent
Subscription modified (plan change, status change, etc.)Updates: Updates subscription status, plan, billing period, amounts
event
Subscription canceledUpdates: Sets status to
canceled, records canceledAt timestampevent
Subscription permanently deletedUpdates: Marks subscription as deleted
Payment Events
event
Payment successfulUpdates: Creates
payment record with status succeededevent
Payment failedUpdates: Creates or updates
payment record with status failed, may update subscription to past_dueevent
Checkout session completedUpdates: Creates customer, subscription, and initial payment records
event
One-time payment completed (Lemon Squeezy)Updates: Creates
payment record for one-time purchasesrc/lib/payments/types.ts:109-120.
Database Updates
Customer Table
Fromsrc/app/api/webhooks/payments/route.ts:96-119:
Subscription Table
Fromsrc/app/api/webhooks/payments/route.ts:122-181:
Payment Table
Fromsrc/app/api/webhooks/payments/route.ts:185-217:
Webhook Event Structure
Fromsrc/lib/payments/types.ts:125-130:
Provider-Specific Parsing
Fromsrc/app/api/webhooks/payments/route.ts:56-80:
Setup Instructions
1
Configure Webhook URL
Add webhook endpoint to your payment provider:
2
Set Webhook Secret
Add the webhook signing secret to your environment variables:
3
Select Events
Configure which events to receive (recommended):
customer.createdcustomer.updatedsubscription.createdsubscription.updatedsubscription.deletedinvoice.payment_succeededinvoice.payment_failedcheckout.session.completed
4
Test Webhook
Use provider’s test mode to verify webhook is working:
Response Format
Success Response
200 OK
Error Responses
Bad Request
Missing or invalid signature
Internal Server Error
Webhook processing error
Idempotency
Fromsrc/app/api/webhooks/payments/route.ts:97-99, 123-125, 186-188:
Debugging
Webhook errors are logged to console:src/app/api/webhooks/payments/route.ts:89, 222.
Related Resources
Database Schema
View customer, subscription, and payment tables
Checkout API
Create checkout sessions
Payment Types
TypeScript type definitions