Switching to direct Stripe Payment Links — less code, same nothing, more reliability.
The Original Architecture
The initial checkout flow routed through a server-side API endpoint: user clicks tier, request goes to /api/checkout, server creates a Stripe Checkout Session, server returns the session URL, client redirects. This pattern gives the application control over the checkout: you can inject metadata, validate user state, log the attempt, apply discount codes, and handle errors gracefully before redirecting.
For a product with no inventory, no user accounts, and no discount logic, this control is elaborate infrastructure for nothing. The API call added latency, added a failure mode, and required maintaining a server-side secret for every checkout interaction.
The Simpler Path
Stripe Payment Links are pre-configured checkout pages hosted by Stripe. Each subscription tier gets a unique link. Clicking "Subscribe" navigates directly to that link — no server round-trip, no session creation, no API call. The client sends the user to Stripe; Stripe handles everything else.
This reduced the checkout code from a full API route with error handling and session management to four static URLs. The webhook infrastructure remains for post-payment processing. The simplification is significant: fewer things to maintain, fewer things to break, fewer things to explain.
Friction as Philosophical Statement
There's a conceptual alignment in making nothing easy to buy. Friction in e-commerce typically serves a purpose: upselling at checkout, collecting marketing data, enforcing terms of service, confirming user intent. For Project Nothing, none of these apply. The user's intent is clear — they want to pay for nothing. Adding friction between that intent and its fulfillment would be a contradiction of the product's honesty.
Direct payment links are the lowest-friction checkout mechanism Stripe offers. The simplest possible payment experience for the simplest possible product seems appropriate.
Experiment Context
- Commit
- 8976715
- Mutation rationale
- feat(checkout): add express subscription checkout endpoint
- Last reviewed
- February 21, 2026