Launch Knowledge Base
Full-Stack Web App Launch Checklist
A launch checklist for web apps with server runtime behavior, APIs, authentication, production configuration, databases, and logs.
A full-stack web app has more launch risk than a static site because more systems must work together at request time. The frontend must load, the server must start, the API must respond, environment variables must be correct, authentication must trust the production domain, and the database must be reachable.
This checklist focuses on the first public release. It is not a complete production maturity model, but it covers the mistakes that most often block beginners.
Identify the runtime boundary
First, name what runs in production. Is it a Node.js server, a Next.js app, a Fastify API, a serverless function, a container, or a static frontend that calls a separate backend?
The runtime boundary matters because it decides what must be deployed together and what can fail independently. A single full-stack app may include frontend rendering and API routes in one process. A split app may have a static frontend hosted separately from an API service. Both can work, but debugging is easier when you know the shape.
Write down:
- public frontend URL
- API base URL
- server entrypoint
- expected port or platform-provided port
- health check path if available
- database or service dependencies
Confirm the server starts in production
Many apps work locally because the development server fills in gaps. Production usually runs a different command, reads different environment variables, and serves optimized output.
Check that the production command is explicit. The app should not depend on an interactive terminal, local files outside the artifact, a globally installed tool, or a development-only watcher.
If the platform expects the server to listen on a provided port, the app should read that value from the environment. Hardcoding a local port is a common reason container and serverless deployments fail health checks.
Separate frontend and backend configuration
Frontend code and backend code read configuration differently. Browser-exposed values are bundled or served to the client. Server-only secrets should never be sent to the browser.
Common production variables include:
| Setting | Why it matters |
|---|---|
| Public app URL | Used in links, redirects, emails, and callbacks |
| API base URL | Lets the frontend call the right backend |
| Database URL | Lets the server connect to production data |
| Auth secret or session key | Protects sessions and tokens |
| OAuth client credentials | Lets login providers trust the app |
| CORS allowed origins | Allows browser calls from the production frontend |
| Cookie domain and secure flag | Controls whether sessions persist correctly |
Do not copy local .env values blindly. Production is a different deploy, not a larger localhost.
Check authentication and CORS
Authentication problems often appear only after deployment. OAuth and hosted auth providers usually require exact callback URLs. Cookie-based sessions may fail if the domain, HTTPS, or same-site settings are wrong. APIs may reject browser requests if CORS does not include the production frontend origin.
Before launch:
- add production callback URLs to the auth provider
- remove unused localhost callbacks from production apps where possible
- confirm cookies are secure on HTTPS
- confirm frontend origin is explicitly allowed by the API
- test login, logout, refresh, and a protected page
Authentication proves identity. Authorization decides access. Test both.
Prepare the database
A full-stack launch is not ready until the database state matches the code. The server may start and still fail because migrations were never applied, seed data is missing, or the connection string points to the wrong target.
Check:
- production database exists
- credentials are stored as secrets
- schema migrations have run
- required indexes exist
- connection limits match the runtime model
- backup or export path is known
- admin tooling does not expose production data to the wrong users
For serverless or autoscaling runtimes, connection pooling matters. Too many short-lived database connections can take down a small database even when traffic is modest.
Add logs before users arrive
For a first launch, logs should answer basic questions. Did the server boot? Which route failed? Which request id was involved? Was the failure auth, validation, network, or database?
Log useful context, but do not log passwords, tokens, full credit card data, private keys, or unnecessary personal data. Structured logs are easier to search than long prose messages.
At minimum, inspect logs immediately after deploying and after running a smoke test. Waiting until users report errors is too late.
Run a full-stack smoke test
Test the public system from a clean browser session:
- home page loads over HTTPS
- API health or basic endpoint responds
- login works
- protected route blocks anonymous users
- protected route allows the right user
- create, read, update, or delete path works for core data
- form validation returns useful errors
- direct refresh on app routes works
- logs show the smoke-test requests
- rollback target is known
Flash Launch note
Flash Launch is strongest when it turns these layers into visible project state: deploy status, domain status, database status, jobs, logs, and rollback history. The user should not have to guess which layer is waiting or broken.