{"id":"eej2og9s0ajmnxy","title":"Staging to Production Checklist Before You Launch","slug":"staging-to-production-checklist","summary":"I've seen too many launches go sideways because critical steps were missed. This post covers the non-negotiable checks I run when moving from staging to production, ensuring a smooth deployment and fewer surprises for both the client and the users.","imageUrl":"https://briancrabtree.me/images/journal-staging-to-production-checklist.webp","category":"Engineering","date":"2026-06-09T18:00:00.000Z","featured":false,"likes":17,"author":"Brian Crabtree","content":"<h2>Before You Touch Production</h2>\n\n<p>Before pushing anything live, I always run through a concrete staging to production checklist website owners often overlook. It's not about being paranoid; it's about avoiding preventable outages and lost revenue from a botched launch. Every production deploy is a point of no return for user data; treating it lightly is just asking for trouble.</p>\n\n<p>I've been on calls at 2 AM fixing things that should have been caught hours earlier on staging. That kind of pain teaches you discipline. A robust pre-launch process ensures you're not just deploying code, but deploying confidence and stability for the whole team.</p>\n\n<p>Rushing a launch to hit an arbitrary deadline almost always costs more in the long run than a few extra hours of thorough validation. Take the time, follow your own rules, and prevent the kind of fires that burn up client trust and team morale.</p>\n\n<pre><code>- [ ] Canonical URLs match sitemap\n- [ ] 301 map for retired slugs\n- [ ] PSI mobile + desktop on prod URL\n- [ ] robots.txt + sitemap submitted</code></pre>\n\n<p><figure>\n  <img src=\"/images/journal-inline-staging-prod-checklist.webp\" alt=\"Launch checklist infographic: redirects canonical PSI sitemap robots\" width=\"1200\" height=\"675\" loading=\"lazy\" />\n  <figcaption>Run the checklist on production URLs — staging green does not count.</figcaption>\n</figure></p>\n\n<h2>Data Integrity and Migration</h2>\n\n<p>Database integrity is my first major concern. If you're copying data from production to staging for testing, make absolutely sure you have a fresh, recent backup of the actual production database before you even think about migrating anything. I've seen staging data overwrite live systems, and it's a hellish recovery.</p>\n\n<p>Migrations need to run cleanly. Test them on a staging environment that mirrors production's database schema as closely as possible, including its size. What works on a tiny development DB might choke on a million-row table, locking up the application and creating downtime.</p>\n\n<p>Always clean up test data. Staging often accumulates junk: fake users, test orders, placeholder content. While this might seem minor, it can skew analytics, appear in search results if accidentally indexed, or even expose internal testing artifacts. Production is not a playground for your QA team's temporary accounts.</p>\n\n<h2>Configuration and Environment Checks</h2>\n\n<p>Production environments have specific configurations: API keys, database connection strings, external service endpoints. These are almost never the same as staging. I double-check every single environment variable to ensure it points to the correct live service and not a sandbox or test account.</p>\n\n<p>CDN setup, DNS records, and domain pointing are critical. A misconfigured CNAME or A record can direct traffic to the wrong server, or worse, make your site unreachable. I use tools like dig and nslookup directly from the production server to verify everything resolves as expected.</p>\n\n<p>External integrations – payment gateways, email services, analytics, CRMs – all need their production credentials and settings. It's easy to forget to swap out a Stripe test key for a live one, leading to failed transactions. Verify each one with a small, live test if possible, like a tiny transaction you can immediately refund.</p>\n\n<h2>Performance and Security Audits</h2>\n\n<p>Performance testing isn't just for heavy traffic sites. Even a small app can bog down under unexpected load if caching isn't configured right or database queries are inefficient. I run basic load tests against staging to identify bottlenecks before they hit production users. A slow site is a broken site.</p>\n\n<p>Security is non-negotiable. I ensure all necessary SSL certificates are installed and active, and that Strict-Transport-Security headers are in place. Basic penetration testing and vulnerability scans should be part of your routine. Remember, an open port or an insecure API endpoint is an invitation for trouble.</p>\n\n<p>Accessibility is often an afterthought, but it shouldn't be. A site isn't truly launched until it's usable by everyone. I always include a check for WCAG compliance, often starting with automated tools and then manual keyboard navigation. It's not just good karma; it's often a legal requirement, and good for SEO too, as I covered in <a href=\"/journal/semantic-html-landmarks-beyond-divs/\">Semantic HTML Landmarks Search Engines Actually Read</a>.</p>\n\n<h2>User Acceptance Testing UAT</h2>\n\n<p>UAT is where real users, often the client themselves, put the system through its paces. This isn't just about clicking buttons; it's about verifying business logic, end-to-end workflows, and the overall user experience. I ensure they're testing scenarios that mirror their actual daily operations, not just happy paths.</p>\n\n<p>Cross-browser and cross-device testing is still vital. What looks perfect on a Chrome desktop might be broken on an older Safari mobile, or an obscure tablet. I maintain a small matrix of common devices and browsers to check, focusing on those most used by the target audience.</p>\n\n<p>Ensure there's a clear process for reporting issues during UAT. Bugs will be found; that's the point. A well-defined bug tracking system, clear communication channels, and agreed-upon severity levels prevent confusion and ensure critical issues are addressed before launch.</p>\n\n<h2>Monitoring and Rollback Plans</h2>\n\n<p>Once live, you need to know immediately if something breaks. I set up comprehensive monitoring for server health, application errors, and key business metrics. Alerts should go to the right people, at the right time, with enough context to diagnose the problem quickly.</p>\n\n<p>A clear rollback strategy is essential. No matter how much you test, a deployment can still introduce an unforeseen issue. Knowing exactly how to revert to the previous stable version, and how quickly that can happen, provides a critical safety net and reduces the stress of deployment.</p>\n\n<p>Communication during an incident is paramount. Who informs the client? Who updates the public status page? Having a predefined communication plan, including templates for different severity levels, ensures everyone is on the same page and customer trust isn't further eroded by silence.</p>\n\n<h2>My Final Check and What I Do Next</h2>\n\n<p>My final check is often a quick, gut-level pass. Does it feel right? Did we actually follow every step on our own damn checklist? I look for obvious visual glitches, test a core user flow myself, and check console errors one last time right before the green light.</p>\n\n<p>The launch isn't the finish line; it's the start of observation. I stick around, watching logs, monitoring dashboards, and listening for immediate user feedback. Expect minor tweaks and hotfixes in the first few hours or days. Be ready to react, not just deploy and forget.</p>\n\n<p>Building a robust staging to production process takes work, but it pays off in stability and peace of mind. If you're struggling with your deployment pipeline or need an experienced eye on your pre-launch readiness, let's talk. You can reach out directly at /contact?ref=audit. For a related angle I keep coming back to, see <a href=\"/journal/lighthouse-ci-deploy-pipelines/\">Lighthouse CI in Deploy Pipelines (Catch Regressions Before Users Do)</a>.</p>","tags":["launch","qa","deployment"],"views":50}