A billing kit is a vertical slice. You merge it into an existing app, or you buy a full boilerplate that already includes Stripe. Either way, the webhook story decides whether money becomes access.
Must-have Stripe surfaces
- Checkout Session or PaymentIntent creation from a trusted server route.
- Webhook handler for checkout.session.completed (and subscription events if you sell recurring).
- Idempotent writes so retries are safe.
- A mapping from Stripe customer IDs back to your users table.
- Clear failure paths when signature verification fails.
One-time vs subscription
Indie products often start with one-time Checkout. Subscriptions add proration, failed payments, dunning, and portal flows. Prefer kits that match the billing model you will sell in the next 90 days - not the model you might want someday.
- One-time: simpler entitlement (purchase row), fewer lifecycle events.
- Subscription: need invoice.paid / customer.subscription.* handling or documented equivalents.
- Usage-based: rarely complete in starter kits - assume you will extend meters yourself.
Security checklist before you go live
- Webhook secret is only on the server.
- You never trust client-reported amounts for granting access.
- Test mode keys never ship to production env.
- You have a plan to rotate secrets if they leak in a screenshot.
How to merge a billing kit into an existing app
- Map the kit's user foreign keys onto your users table.
- Port webhook routes without renaming events until tests pass.
- Prove a test purchase end to end before redesigning pricing UI.
- Only then wire your product feature flags to the entitlement table.
Stripe vs Paddle on Twenty
Stripe is the default for builders who want control. Paddle appeals when you want merchant-of-record tax handling. Filter by stack label exactly (Stripe or Paddle) - Twenty matches stored tech stack strings.
Questions to ask on every listing
- Which webhook events are handled?
- Where is access stored after payment?
- Is Billing Portal included?
- Are coupons / trials documented or out of scope?
