There's a specific moment every builder knows: the product works. On localhost. Logged in as you, with your seeded test data, on your machine, where the Stripe keys say sk_test_ and the emails print to the console. Between that moment and a stranger typing their card number into your checkout sits a gap that nobody's app builder generates for you — and it's where most side projects stall out. This is a production launch checklist for crossing that gap: the actual, concrete list of things that separate "works on my machine" from "strangers pay for it." None of it is intellectually hard. All of it is fiddly, unforgiving, and invisible until it breaks at 2am. Copy the checklist, work it top to bottom, and check boxes instead of vibes.
Infrastructure: secrets, domain, DNS, SSL
This is the layer where mistakes are either embarrassing (site down) or catastrophic (keys leaked), so it goes first.
- [ ] Secrets out of the repo. Every API key, database URL, and token lives in your host's environment variables — not in
.envcommitted "just for now," not hardcoded in a config file. Grep your git history forsk_live,AKIA, andpassword; if anything turns up, rotate the key, don't just delete the line. A leaked key in git history is leaked forever. - [ ] Separate prod and dev environments. Different database, different Stripe keys, different email credentials. If your local script can truncate the production users table, you don't have 2 environments — you have 1 environment and a loaded gun.
- [ ] Domain bought and DNS pointed. A and AAAA (or CNAME) records to your host, with TTLs you understand. Set up the
www→ apex redirect (or the reverse) so both resolve to 1 canonical URL. - [ ] SSL working everywhere. Most hosts (Vercel, Netlify, Fly, Render) handle certificates automatically — verify it anyway, including on the redirect domain. A browser padlock warning on a checkout page ends the purchase, full stop.
- [ ] Domain email records. SPF, DKIM, and DMARC configured before you send a single email from the domain. More on why below.
Money: payments and webhooks
- [ ] Live Stripe keys, and a real test purchase. Switch from test to live mode, then buy your own product with a real card. You'll catch the broken redirect, the wrong currency, the tax setting you forgot. Refund yourself after; the ~30¢ in fees (hedged — fees vary by region) is the cheapest QA you'll ever run.
- [ ] Webhooks wired and verified. This is the one everyone skips. Checkout isn't done when the card clears — it's done when your server hears about it. Handle at minimum
checkout.session.completed,invoice.payment_failed, andcustomer.subscription.deleted, and verify webhook signatures. An unhandled failed-payment webhook is a customer who pays nothing and keeps access forever, and you won't notice for months. - [ ] Failed payment flow. Stripe's smart retries plus a dunning email beat silently cancelling someone whose card expired.
- [ ] Customer portal. Let users update cards and cancel without emailing you. Stripe's hosted portal takes ~20 minutes to wire and prevents the worst support tickets.
Communication: email, auth edge cases
- [ ] Transactional email through a real provider. Resend, Postmark, SES — anything but your Gmail. You need, at minimum: signup confirmation, password reset, receipt, and failed-payment notice. Send each one to yourself and read it on a phone.
- [ ] Deliverability checked. This is what SPF/DKIM/DMARC were for. Send to a Gmail and an Outlook address; if the password reset lands in spam, your product has a locked front door. Password reset is the email that cannot fail.
- [ ] Auth edge cases. The happy path works — now try the unhappy ones: wrong password 5 times, expired reset token, signup with an email that already exists, OAuth account colliding with a password account for the same address, logout on 1 of 2 open tabs. Each of these will happen in week 1; better they happen to you tonight.
- [ ] Rate limiting on auth endpoints. Login, signup, and reset endpoints get hammered by bots within days of going live. A basic rate limit is 10 lines and saves you a credential-stuffing headache.
Visibility: analytics, error tracking, backups
You can't operate what you can't see, and the whole point of launching is to start learning.
- [ ] Analytics events on the moments that matter. Not just pageviews — signup started, signup completed, checkout started, payment succeeded, key feature used. 5–8 events is plenty to start; what matters is covering the funnel so you can later tell where people drop, which is the entire subject of know your funnel performance.
- [ ] Error tracking from day 1. Sentry or similar, on both client and server, with alerts to somewhere you actually look. Strangers will hit errors you've never seen; the difference between a fixable bug and a silent churn machine is whether you find out.
- [ ] Database backups — tested. Automated daily backups, and you've done 1 actual restore to confirm they work. An untested backup is a hope, not a backup.
- [ ] Uptime monitoring. A free pinger that texts you when the site's down. You want to hear it from a robot, not from a refund request.
The boring-but-mandatory layer
- [ ] Privacy policy and terms of service. Required by Stripe, by app stores, and by GDPR/CCPA the moment you collect an email. Generated templates beat nothing; this isn't legal advice, but shipping a paid product with neither is asking for trouble.
- [ ] Cookie/consent handling if you're serving EU visitors and running analytics that need it.
- [ ] A support channel. An email address on the site is enough —
support@yourdomainforwarding to your inbox. What's not enough is nothing. - [ ] A way to communicate downtime. Even a pinned tweet or a static status page. Day-1 you won't need it; the day you need it, you'll really need it.
- [ ] Legal pages linked in the footer, receipts carrying your business name, and a real reply-to on transactional email. Small trust signals, but checkout pages live and die on trust.
That's roughly 25 boxes, and a focused builder can clear them in a few evenings — the catch is that every box is its own little rabbit hole of docs, dashboards, and DNS propagation delays. If you'd rather see the minimal tool stack that covers all of this, the minimum viable launch kit maps each box to a concrete service.
Or — the honest alternative — don't work the checklist at all. This list is, almost line for line, what LaunchBuddy's harness already is: payments, auth, email, analytics, domain, error tracking, cost caps, and a kill switch, pre-built and verified, the same rails under every launch. LaunchBuddy is a launch studio: submit your unlaunched project, and if it's picked, it gets built onto those rails, shipped live, and operated — while you keep ownership and pay a flat fee or a revenue share.
If your product works on localhost and nowhere else, that's exactly the gap we exist for. Free honest assessment; if it's a no, you get the why. 60 seconds to submit at launchbuddy.app.