Topics
System Design

The Production Readiness Checklist

What a well-built app has in place, from a domain glossary to feature flags, error tracking and a changelog, and how it shifts by stage and for B2B vs B2C.

Intermediate·15 min read·Updated Oct 7, 2026

A production-ready app is one where a change is cheap to make, safe to ship, visible when it breaks and recoverable when it does. Every item on the checklist below exists to protect one of those four properties. None of them depends on a framework or a vendor, but how many you need, and how far you take each, depends on the stage of the company and on whether you sell to businesses or to consumers.

Context

Engineering checklists are older than most of today's tools. Joel Spolsky's "Joel Test" (2000) asked twelve yes-or-no questions, such as "Can you make a build in one step?" and "Do you have a bug database?", and argued that a team scoring below ten had serious problems. The Twelve-Factor App (2011) wrote down how Heroku-era services should handle config, logs and processes. Google's SRE (site reliability engineering) teams run a formal PRR (production readiness review) before they take on a service, described in the SRE book (2016), and AWS publishes its Well-Architected Framework (2015) as a set of review questions. Investors and enterprise buyers run the same exercise under other names: technical due diligence and the security questionnaire.

You have met the result whenever a new project felt easy to join: one command to run it locally, a README that was true, a failing test before a broken deploy, and an error report with the exact line before the first support ticket. The opposite is just as recognisable. The smallest possible version of the checklist is a file in the repository that the team actually keeps up to date:

PRODUCTION_READINESS.md
# Production readiness (reviewed 2026-10-07)

- [x] One command starts the app locally (README tested by a new hire)
- [x] CI runs lint, type check and tests on every pull request
- [x] Deploys are automated; rollback is one step
- [x] Errors reach an error tracker with release + stack trace
- [ ] Database restore tested in the last 90 days
- [ ] Feature flags have owners and removal dates
Domain glossary (ontology)
The agreed list of the business concepts the app deals with, their names, relationships and lifecycle states. Domain-driven design calls the shared vocabulary the ubiquitous language.
Feature flag
A runtime switch that turns a code path on or off without a deploy, for a percentage of users, a tenant or an internal team.
RPO / RTO
Recovery point objective (how much data you can afford to lose) and recovery time objective (how long you can afford to be down).
Runbook
Step-by-step instructions for a known operational task or failure, written so that whoever is on call can follow them under stress.
ADR (architecture decision record)
A short dated note recording a significant technical decision, the options considered and why one was chosen.

Why it matters

Missing items rarely hurt on the day they are skipped. They surface later and all at once: during an incident when nobody can tell which release broke checkout, during a due-diligence call when there is no answer to "how do you restore the database?", or when the first enterprise prospect sends a 200-question security questionnaire. Each gap makes every future change a little slower and a little riskier, which is what "technical debt" means in practice. The goal is not to tick every box on day one; it is to know which boxes are empty, why, and when that becomes unacceptable.

The core checklist

The items group into eight areas. Each area answers one question about the app; if you cannot answer it, the corresponding items are missing. The diagram uses PR for pull request and SLO for service level objective.

Domain & data
glossarydata model docsmigrationstested backupsdo we agree what things are?
Delivery
CI on every PRone-step deploy + rollbackfeature flagschangelogcan we ship safely?
Environments
one-command local setupstaging ≈ prodconfig in envcan anyone run it?
Quality
tests on critical pathstypes + lintcode reviewdo we catch regressions?
Observability
error trackingstructured logsmetrics + SLOsproduct analyticsdo we see breakage first?
Security & privacy
central authzsecrets managerdependency scanningdata deletion/exportare users safe?
Reliability
health checkstimeouts + retriesrunbookspostmortemscan we recover?
Product & docs
READMEADRsstatus pageplan limits in one placecan others rely on it?
Eight areas and what each one guarantees. The chips are the concrete practices; the sections below explain why each pays off.

Domain and data

Write down the domain before the code spreads it around. A glossary that says what a "workspace", a "member" and a "seat" are, how they relate and which states each can be in keeps the database, the API, the UI copy and the analytics events using one name per concept. Without it the same thing ends up as team in the schema, "organisation" in the UI and account in billing, and every feature pays a translation tax. Schema changes go through versioned migrations reviewed like code, and backups only count once a restore has actually been tested against an RPO and RTO you have written down.

Delivery

The main branch is always deployable, every pull request runs lint, type checks and tests in CI (continuous integration), deploys are automated and rollback is a single action. Feature flags decouple deploying code from releasing a feature: unfinished work ships dark, a risky change rolls out to 5% first, and a misbehaving feature is turned off in seconds instead of reverted in minutes. Every flag needs an owner and a removal date, or the codebase fills with branches nobody dares to delete. A changelog records what changed for users, and short ADRs record why the big technical choices were made, so the next person does not have to rediscover them.

flags.ts
type Flag = {
  key: string
  owner: string
  removeBy: string            // a date; CI fails once it has passed
  defaultValue: boolean       // what happens if the flag service is down
}

export const flags = {
  newCheckout: {key: 'new-checkout', owner: 'payments',
    removeBy: '2026-12-01', defaultValue: false},
  // kill switch: lets ops disable an expensive feature under load
  aiSummaries: {key: 'ai-summaries', owner: 'platform',
    removeBy: 'permanent', defaultValue: true},
} satisfies Record<string, Flag>

Environments and quality

A new engineer should get a working app with realistic seed data from a clean machine with one documented command, and a .env.example should list every variable. Development, staging and production use separate data and separate credentials, and staging is close enough to production that a green staging deploy means something. Tests concentrate on what breaks expensively: unit tests for business rules, integration tests against a real database for queries and permissions, and a handful of end-to-end tests for the critical paths such as sign-up, payment and the core action, often called E2E tests. Coverage is a useful map of what is untested on those paths; as a company-wide target it rewards tests that assert nothing.

Observability, security and reliability

Errors reach an error tracker with the release version, stack trace and the user or tenant affected, and someone is alerted on new or spiking errors, so the team hears about breakage before customers do. Logs are structured and carry a request ID; metrics and SLOs (service level objectives) cover the user-facing paths. Product analytics events use the names from the domain glossary. Authorization is checked in one place on the server, secrets live in a secret manager, dependencies are scanned and updated automatically, and personal data can be exported and deleted on request. Health checks, graceful shutdown, timeouts and idempotent retries keep failures small; runbooks and blameless postmortems make each one less likely to repeat.

What to do at each stage

The same practice has a different "done" at different sizes. Early on the risk is building the wrong thing slowly, so anything that slows iteration without preventing a likely disaster can wait. At mid-size the risk shifts to breaking things that paying customers depend on. At enterprise scale it is regulatory, contractual and organisational: many teams, audits and customers who negotiate your uptime. In the table, MFA is multi-factor authentication, a11y is accessibility, SOC 2 and ISO 27001 are the two common security certifications enterprise buyers ask for, and SIEM (security information and event management) is the system a security team uses to collect and correlate logs.

Early-stageship fast, never lose data
Mid-sizeship safely, see breakage first
Enterpriseprove it, to auditors and buyers
The direction of travel. Each stage keeps everything from the previous one and makes it more automated, more measured and more auditable.
PracticeEarly-stageMid-sizeEnterprise
Domain glossaryA page in the repoOwned per domain, reviewed with schema changesShared data catalogue, governed definitions
BackupsAutomated, one restore testedRestore drills, written RPO/RTOCross-region, audited, point-in-time
CI/CDCI on PRs, auto-deploy mainPreview envs, canaries, one-click rollbackChange approvals, release trains where required
Feature flagsEnv-var or config flagsFlag service, % rollouts, ownersPer-tenant targeting, audit of flag changes
TestsCritical paths + business rulesIntegration suite, E2E smoke, coverage on coreContract tests between teams, perf and a11y gates
Error trackingOn from day oneAlerts routed to owning teamTied to SLOs and incident tooling
Logs & metricsPlatform defaultsStructured logs, request IDs, SLO dashboardsTracing, retention policies, SIEM feed
On-callFounders get alertsRotation, runbooks, postmortemsFollow-the-sun, incident commander role
SecuritySecret manager, MFA, deps updatesPen test, central authz, audit logSOC 2 / ISO 27001, SSO-only access
ChangelogRelease notes in commits/PRsPublic changelog, versioned APIDeprecation policy, customer notices
DocsREADME that worksADRs, architecture overviewOwned service catalogue

B2B and B2C need different things

Selling to businesses and selling to consumers stress different parts of the same checklist. B2B (business-to-business) customers are few, large, contractual and demanding about control and proof. B2C (business-to-consumer) users are many, anonymous and impatient, so scale, onboarding and privacy dominate. Below, SSO is single sign-on, usually over SAML (Security Assertion Markup Language) or OIDC (OpenID Connect); SCIM (System for Cross-domain Identity Management) lets a customer's identity provider create and remove accounts automatically; an SLA is a service level agreement; a DPA is a data processing agreement; GDPR and CCPA are the EU and California privacy laws.

B2B extras
SSO / SAML + SCIMroles & permissionstenant isolationaudit logSLAsecurity questionnaire
B2C extras
social / passwordless loginspike handlingconsent + privacyexperimentsmobile performanceself-serve support
Where each model concentrates its effort beyond the shared core.
ConcernB2BB2C
Sign-inSSO via SAML or OIDC, SCIM provisioning, enforced MFASocial and passwordless login, account recovery at scale
Data modelTenants first: every row scoped to an organisation, per-tenant configUser-scoped data, sharing and social graphs
PermissionsRoles, custom permissions, admin consoleMostly owner-only; moderation and abuse tooling
ComplianceSOC 2, DPA, data residency, audit logsGDPR/CCPA consent, age rules, app store policies
ReliabilityContractual SLA with credits, status page per regionTraffic spikes, graceful degradation, cost per user
ReleasesAnnounced changes, admin opt-in, API versioning windowsFast experiments, A/B tests, staged mobile rollouts
AnalyticsAccount health, seats, feature adoption per tenantFunnels, retention cohorts, conversion
BillingInvoices, seats, annual contracts, purchase ordersCards, in-app purchases, trials, churn recovery

Running a readiness review

A checklist only helps if it produces decisions. The review below fits in an hour for a small product and works the same way for a single service in a large company.

  1. 1
    Copy the core list into the repository and mark each item done, partial or missing. Be literal: "we have backups" is partial until a restore has been tested.
  2. 2
    For each gap, write the failure it allows in one sentence ("a bad migration loses a day of orders") and rate likelihood and cost. This turns a list into a risk register.
  3. 3
    Pick the three highest risks for your stage and model from the tables above and schedule them like features, with an owner and a date.
  4. 4
    Record conscious exceptions ("no staging environment until we have a second engineer") so that skipping is a decision, not an accident.
  5. 5
    Repeat the review every quarter and before any step change: a funding round, the first enterprise deal, a launch, or a new team taking over.

Pitfalls

  • Copying enterprise practice into a five-person company

    Change advisory boards, a full microservice split or a 90% coverage gate cost a small team weeks of iteration speed and protect against risks it does not have yet. Adopt practices when the failure they prevent becomes likely, except for the few that are cheap only on day one.

  • Coverage as a target

    Once a percentage is mandated, people write tests that execute lines without asserting behaviour, while the risky paths stay thin. Track coverage of the critical paths and the number of production bugs a test would have caught, not one global number.

  • Flags that never die

    Every flag doubles the code paths that must work. Without owners and removal dates, old flags accumulate, combinations go untested, and someday flipping a forgotten one breaks production. Treat flag removal as part of finishing the feature.

  • Backups nobody has restored

    Backups fail silently: wrong database, missing permissions, expired retention, a restore that takes eleven hours. The only proof is a restore into a fresh environment, timed, done on a schedule.

  • Alerting on everything

    Hundreds of noisy alerts train people to ignore the channel, and the real incident drowns. Alert on user-facing symptoms (error rate, latency, failed payments) and send the rest to dashboards.

Interview questions

Q1You join a five-person startup with no process. What do you put in place first?

The things that are cheap now and impossible to recover from later: automated backups with one tested restore, error tracking, secrets out of the repository, CI running tests on every pull request, and a one-command local setup. Then a short domain glossary so the team names things consistently. I would leave staging environments, on-call rotations and formal approvals until the team or the customer base makes their absence painful.

Q2Walk me through releasing a risky feature safely.

Merge it behind a feature flag that defaults off, so deploying and releasing are separate. Turn it on for the internal team, then for a few percent of users or one friendly customer while watching error rates, latency and the business metric it affects. Ramp up in steps, keep the flag as a kill switch until it has run at full traffic for a while, then delete the flag and the old code path.

Q3What happens in a well-run team when a deploy breaks production at 2 a.m.?

An alert fires on a user-facing symptom and reaches whoever is on call, the error tracker shows which release introduced the errors, and the first action is to roll back or flip the flag rather than debug live. Once users are safe, the team investigates calmly and writes a blameless postmortem whose action items close the gap, such as a missing test or a migration that was not backward compatible.

Q4Why maintain a domain glossary or ontology?

Because names leak into everything: schema, API, UI copy, analytics and support macros. One agreed name and definition per concept, with its relationships and states, removes a constant translation cost and a whole class of bugs where two parts of the system mean different things by the same word. It is also the fastest onboarding document a new engineer can read.

Q5How is test coverage useful, and how is it misleading?

It is useful as a map of what is not tested, especially on critical paths. It is misleading as a measure of quality, because executing a line is not asserting its behaviour, and a mandated number invites tests that pass regardless. I care more about whether the tests would have caught the last few production bugs.

Q6What changes when a B2B product starts selling to enterprises?

Proof and control become product features: SSO and SCIM, roles and an audit log, data residency, an SLA, a status page, and a security programme that can pass a questionnaire or a SOC 2 audit. Releases slow down for customers who need notice and admin opt-ins, so feature flags, API versioning and a deprecation policy matter more. Tenant isolation, if it was not there from day one, becomes urgent.

Q7Who is a changelog for, and how do you keep it honest?

There are two audiences: users who want to know what changed for them, and engineers and support who need to map a behaviour change to a release. I generate the engineering side from merged pull requests and write the user-facing entries by hand, grouped by benefit, as part of the release. If it is a separate chore after the fact, it stops being written within weeks.

Key takeaways
  • Production-ready means changes are cheap, shipping is safe, breakage is visible and failures are recoverable; every checklist item protects one of these.
  • Four items belong in every app from day one: tested backups, error tracking, secrets out of the repo and a one-command local setup.
  • A domain glossary keeps schema, API, UI and analytics speaking one language and is the cheapest architecture document you will write.
  • Feature flags separate deploy from release, but each needs an owner and a removal date.
  • Early-stage, mid-size and enterprise share the list; what changes is how automated, measured and auditable each item is.
  • B2B adds SSO, roles, tenant isolation, audit logs and SLAs; B2C adds scale, onboarding, consent and experimentation.

Preparing for interviews? DevRecall turns a job description into a prep plan that points at topics like this one.

Start free