For selling products or subscriptions

The commerce stack

Sell products and subscriptions on infrastructure you actually own — without building a payment processor.

This is the "I need a real storefront, not a Gumroad link" stack. Stripe is the spine — it handles cards, subscriptions, tax, and invoicing — while Next.js gives you server-side rendered product pages and API routes to receive Stripe webhooks in the same codebase. Clerk owns identity, Postgres owns your orders and entitlements, and the two get reconciled through webhooks; that reconciliation is the whole game in commerce, and every tool here is picked to make it boring instead of fragile.

The stack

  • FrameworkNext.jsApp Router gives you fast product pages plus server-side API routes to catch Stripe webhooks — storefront and backend in one deploy.
  • Payments & BillingStripeCheckout for one-off products, Billing for subscriptions, Tax for VAT/sales-tax math — the one component you should never hand-roll.
  • AuthClerkDrop-in accounts and sessions so you can tie a logged-in user to a Stripe customer ID and gate access to what they paid for.
  • DatabaseSupabaseA real relational store for orders, entitlements, and subscription state — the source of truth your webhooks write to.
  • ORMDrizzle ORMTyped SQL that keeps your orders/subscriptions schema honest and makes the webhook-to-DB writes readable and safe.
  • Transactional emailResendReceipts, order confirmations, and renewal/failed-payment notices, written as React components and sent from your webhook handlers.
  • StylingTailwind CSSBuild product cards, pricing tables, and checkout UI fast without fighting a CSS framework's opinions.
  • HostingVercelZero-config Next.js deploys with a stable webhook URL and preview environments to test Stripe events before they hit production.

Tradeoffs

  • Webhooks are the real product. If you drop a customer.subscription.updated or invoice.payment_failed event, someone keeps access they stopped paying for. You must build idempotent handlers and treat your database — not Stripe's dashboard — as the source of truth for who has access.
  • Two systems know your customer: Clerk knows the login, Stripe knows the money, and you have to keep them in sync by stamping the Stripe customer ID onto the Clerk user. That glue code is where most commerce bugs live.
  • Stripe is not merchant-of-record, so global sales tax and VAT remittance are legally yours. If you're a solo dev selling to the EU and don't want that liability, Lemon Squeezy or Paddle handle it for you — at the cost of higher fees and less control.
  • This is overkill for selling three digital downloads. If you don't need accounts, entitlements, or a custom storefront, a Stripe Payment Link or Gumroad ships in an afternoon with none of this.

Cost

$0 to start (every tool has a free tier). Stripe takes 2.9% + 30¢ per transaction from day one. At scale, budget roughly $65/mo in flat SaaS fees once you outgrow free tiers — Supabase Pro $25, Vercel Pro $20, Resend $20 — plus Clerk at ~$25/mo after 10k monthly active users.