/api/mdk route once during initial setup, and that’s it—no webhook event handling code required.
Key Differences
No Webhook Handlers to Write
With Stripe, your backend typically relies on webhooks to know when a payment succeeds:What About the /api/mdk Route?
The initial setup includes an /api/mdk route:
The
/api/mdk route may handle additional functionality in the future, but payment confirmation will always be available directly via useCheckoutSuccess.Linking Checkouts to Your Users
moneydevkit has first-class support for linking checkouts to your authenticated users viacustomer.externalId.
Using externalId for Authenticated Users
When a user is logged into your app, pass their ID via customer.externalId:
externalId is provided:
- The checkout is linked to a customer record in moneydevkit
- If the customer already exists (matched by
externalId), their stored data is used - Returning customers won’t be asked for information you already have
- All checkouts and orders are linked to the same customer record
Using metadata for Custom Data
For other custom data (like a registration ID, order reference, or plan type), use the metadata field:
Quick Comparison: Checkout Flow
1
Stripe: Create PaymentIntent
2
moneydevkit: Create Checkout
1
Stripe: Write Webhook Handler
2
moneydevkit: Check on Success Page
Summary
- No webhook handlers to write - One-time
/api/mdkroute setup, then you’re done - Payment status available directly - Use
useCheckoutSuccessinstead of waiting for webhook events externalIdis first-class - Link checkouts to your authenticated users, with automatic data backfill for returning customers- Use
metadatafor custom checkout data (registration IDs, order references, etc.)

