Every project I ship gets the same checklist before go-live. It takes 2–3 hours to run through. It's caught issues on every single project — no exceptions.
Here are all 23 items, in the order I run them.
Security (items 1–6)
-
Environment variables are not in the client bundle. Search the built JS for your API keys. If they appear, you have a leak. Only
NEXT_PUBLIC_*vars should be client-visible. -
Auth tokens expire. Infinite-lived tokens are the most common security issue I find. Session tokens should expire in 24h–7d. Refresh tokens in 30d max.
-
Rate limiting on auth endpoints. Login, signup, password reset — all must have rate limits. 5 attempts per minute per IP is a reasonable default.
-
CORS is configured correctly.
Access-Control-Allow-Origin: *in production is a vulnerability. Whitelist your specific domains. -
No secrets in git history. Run
git log --all -p | grep -i "sk_live\|secret\|password\|token"on the repo. If secrets were ever committed, rotate them — deleting from history isn't enough. -
CSP headers are set. Content Security Policy prevents XSS attacks. At minimum:
default-src 'self'with explicit exceptions for your CDN, analytics, and fonts.
Performance (items 7–12)
-
Lighthouse score above 90 on mobile. Run against the production URL, not localhost. I wrote about hitting 98 — the baseline should be 90+.
-
Images are optimized. WebP or AVIF format. Proper
width/heightattributes. Only the hero image haspriority. Check with: no image larger than 200KB on initial load. -
Fonts are self-hosted. No Google Fonts links. WOFF2 format with
font-display: swap. This prevents the Lighthouse drop I debugged. -
No render-blocking resources. Check the Lighthouse "Eliminate render-blocking resources" audit. Move non-critical CSS/JS to async loading.
-
Error pages return correct status codes.
curl -I yoursite.com/nonexistentshould return 404, not 200. Soft 404s cause SEO issues. -
API response times under 500ms (p95). Check Vercel analytics or your monitoring tool. Any endpoint above 500ms needs investigation.
SEO (items 13–17)
-
Sitemap exists and returns XML.
curl -s yoursite.com/sitemap.xml | head -5should show XML, not HTML. This is a real bug I've caught. -
robots.txt is correct. Should allow
/and point to your sitemap. No accidental blocks on/api/or/_next/static/. -
Every page has unique title and meta description. No two pages should share the same title. Descriptions should be under 155 characters and include the primary keyword.
-
hreflang tags for multilingual sites. Each page lists all its language alternatives. Test with: Google Search Console → URL Inspection.
-
Structured data validates. Test JSON-LD with Google's Rich Results Test. Common issues: missing
datePublished, invalidauthorschema.
Monitoring (items 18–20)
-
Error tracking is configured. Sentry with noise filtering or equivalent. Alert on new issues in payment and auth flows.
-
Uptime monitoring is active. External ping (UptimeRobot, Better Stack) checking the homepage and at least one API endpoint every 5 minutes.
-
Analytics is collecting data. Verify events are flowing: visit the site, check your analytics dashboard 5 minutes later. Cookie-free analytics (Plausible) avoids consent issues.
Legal & compliance (items 21–22)
-
Privacy policy is published and linked from the footer. Covers what you collect, why, who you share with, and how to request deletion. GDPR setup guide.
-
Cookie consent (if needed). Only if you use cookies for analytics. If using Plausible or PostHog cookie-free mode, this isn't needed.
Final (item 23)
- Buy your own product. If there's a payment flow, buy something with a real card. This single test catches more integration issues than 50 automated tests. I learned this the hard way.
How I use this list
I run through it on the staging environment 2 days before launch. Items that fail get fixed on day 1. Day 2 is a re-run of failed items plus a full manual walkthrough of the core user flow.
On launch day, I run items 13, 18, 19, 20, and 23 again on the production URL. These are the ones most likely to break during the staging → production transition.
The whole process: 2–3 hours for the initial run, 1 hour for the launch-day re-check. Compare that to the 20+ hours I've spent debugging post-launch fires that any of these items would have caught.
Want this checklist run on your project before launch? Let's talk — I run this on every client go-live, and it's saved every one of them from at least one post-launch incident.