Skip to main content
← All notes
Building

Five tiers, one custom field, zero product records

software

The donate page does not use Stripe Products or Prices. Every donation is a one-off Checkout Session created from scratch with a price_data object containing the amount in pence, the currency set to GBP, and a product_data name that reads Donation — £5.00. No pre-created products in the Stripe dashboard. No price IDs stored in environment variables. The DonationTiers component renders five preset buttons — five pounds for a coffee, ten for phone credit, fifteen for infrastructure, twenty-five for pizza and a late night coding session, fifty for new strings or drumsticks. Each button calls the donate API with the amount in pence. Below the presets is a custom amount field — a number input with a minimum of one pound and a maximum of ten thousand. The validation is client-side first and server-side second. The API rejects anything below 100 pence or above 1,000,000 pence before Stripe ever sees it. The success URL points to a dedicated thanks page at /donate/thanks. The page is excluded from search indexing with robots noindex nofollow because there is no reason for a search engine to find a thank-you page. The thanks page has one emoji, one heading, one sentence, and a button back to the homepage. The entire donation flow is one client component, one API route, one Stripe Checkout redirect, and one static thank-you page. No subscription model, no recurring billing, no donor database. Someone wants to buy me a coffee, they pick an amount, pay through Stripe, and land on a thank-you page. That is it.

Comments coming soon

Sign in with TikTok to leave a comment. Coming soon.