checklists / launch-ready

Launch Ready API security Checklist for internal admin app: Ready for app review in B2B service businesses?.

For this kind of product, 'ready' does not mean polished. It means the app review will not fail because of broken auth, exposed data, unstable deployment,...

What "ready" means for an internal admin app in B2B service businesses

For this kind of product, "ready" does not mean polished. It means the app review will not fail because of broken auth, exposed data, unstable deployment, or missing production basics.

If I were self-assessing, I would want all of these to be true before launch:

  • Every admin route requires authentication and role checks.
  • No critical auth bypass exists, including direct object access to other clients' records.
  • Secrets are out of the codebase and out of the browser.
  • The API has rate limits, validation, and safe logging.
  • Production DNS, SSL, redirects, email authentication, and monitoring are live.
  • The app can survive real usage without leaking data or timing out.

For B2B service businesses, app review usually fails for boring reasons: a webhook breaks onboarding, an admin can see the wrong account, a password reset email lands in spam, or the deployment points to staging. If your p95 API latency is above 500ms on common admin actions, or you have even one exposed secret in a public repo or client bundle, I would not call it ready.

Launch Ready is the 48-hour fix for that gap.

Quick Scorecard

| Check | Pass criteria | Why it matters | What breaks if it fails | | --- | --- | --- | --- | | Auth required on every admin route | No unauthenticated access to admin pages or APIs | Prevents data exposure | Review rejection, account takeover risk | | Role-based authorization | Users only see records they own or are allowed to manage | Stops cross-client leakage | Wrong customer data exposed | | Input validation on all API inputs | Invalid payloads return 4xx before business logic runs | Reduces bugs and abuse | Bad writes, crashes, injection risk | | Secrets stored server-side only | Zero secrets in frontend code or public repos | Protects credentials and tokens | API compromise, billing abuse | | Rate limiting enabled | Abuse endpoints capped by IP/user/session | Protects login and admin actions | Brute force, spam, downtime | | CORS locked down | Only approved origins can call the API from browsers | Prevents cross-site abuse | Token theft paths widen | | Logging excludes sensitive data | No passwords, tokens, SSNs, or full card data in logs | Limits blast radius of incidents | Compliance issues and support risk | | Production DNS and SSL live | Domain resolves correctly over HTTPS with valid certs | Required for trust and review links | Browser warnings and failed callbacks | | SPF/DKIM/DMARC passing | All three pass for sending domain email auth | Improves deliverability and trust | Password reset emails hit spam | | Uptime monitoring active | Alerts fire on downtime and failed checks within minutes | Keeps launch support under control | Silent outages and missed reviews |

The Checks I Would Run First

1. Auth coverage on every endpoint

Signal: any GET, POST, PUT, PATCH, DELETE route that works without a valid session or token.

Tool or method: I inspect the route map in the backend framework, then test with an incognito session and a curl request with no auth header.

Fix path: add middleware first at the router level so protection is default-on. Then add tests that prove unauthenticated requests get 401 and unauthorized roles get 403.

2. Object-level authorization

Signal: a user can change an ID in the URL or payload and access another client's record.

Tool or method: I test direct object reference cases like `/api/admin/invoices/1234` versus `/api/admin/invoices/1235`, using accounts from two different tenants.

Fix path: enforce tenant scoping in every query. Do not trust frontend filters. Add server-side checks that bind every record fetch and update to the authenticated tenant.

3. Secret handling audit

Signal: API keys appear in frontend bundles, `.env` files committed to git history, logs, CI output, or browser network responses.

Tool or method: search the repo for key patterns, inspect build artifacts in DevTools source maps if present, and scan recent commits with secret detection tools.

Fix path: move all secrets to environment variables on the server only. Rotate any leaked key immediately. If a secret has shipped once publicly, I treat it as compromised.

4. CORS and browser access control

Signal: wildcard CORS with credentials enabled, or broad origin lists that include staging domains and localhost in production.

Tool or method: inspect response headers from browser requests and test from an unrelated origin.

Fix path: lock CORS to exact production origins only. If you do not need browser-to-API access from third-party sites, keep it narrow. Here is what good looks like:

{
  "origin": ["https://app.yourdomain.com"],
  "methods": ["GET", "POST", "PATCH", "DELETE"],
  "credentials": true
}

5. Rate limiting on login and sensitive actions

Signal: unlimited login attempts or repeated admin action retries without throttling.

Tool or method: run a simple burst test against login/reset/update endpoints and watch whether requests get slowed or blocked after a small threshold.

Fix path: apply per-IP plus per-account limits on login and password reset flows. For admin APIs tied to expensive operations, cap bursts tightly enough that one bad actor cannot burn your quota or freeze the app.

6. Production readiness of domain,email,and monitoring

Signal: app loads on staging URLs only; SSL warnings appear; email authentication is incomplete; no uptime alerts exist.

Tool or method: verify DNS records at the registrar and Cloudflare dashboard; check certificate status; send a test email; confirm alert delivery by simulating an outage check.

Fix path: finalize DNS cutover with redirects from apex to canonical domain. Enable SSL everywhere. Set SPF,DKIM,and DMARC correctly. Add uptime monitoring for homepage,useful API routes,and critical webhooks so failure shows up fast instead of through customer complaints.

Red Flags That Need a Senior Engineer

1. You have multiple environments but no clear separation between staging and production secrets. 2. Admin users can edit other clients' records by guessing IDs. 3. Password reset,email verification,and invite flows are unreliable or land in spam. 4. The app depends on hidden vendor keys inside frontend code. 5. Nobody can explain what happens when an API call fails halfway through a write operation.

These are not cosmetic issues.

DIY Fixes You Can Do Today

1. Remove any secret from client-side code now.

  • Search your repo for `sk_`, `pk_`, `Bearer`, SMTP passwords,and webhook signatures.
  • Rotate anything that has already been pushed publicly.

2. Turn off wildcard CORS unless you truly need it.

  • Replace `*` with exact production domains.
  • Keep localhost only for local development builds.

3. Add basic rate limits to login,password reset,and invite endpoints.

  • Start with conservative caps like 5 attempts per minute per account plus IP-based throttling.

4. Check tenant scoping on your most dangerous queries.

  • Look at update/delete routes first.
  • Make sure every query includes both record ID and tenant/org ID from session context.

5. Verify DNS,email,and SSL before you ask anyone else to review it.

  • Confirm HTTPS works on your final domain.
  • Test SPF,DKIM,and DMARC with a real mailbox provider,test send,and inbox placement check.

Where Cyprian Takes Over

If your checklist fails in more than two areas,I would stop patching randomly and fix the foundation in one sprint window.

Launch Ready maps directly to those failures:

  • Domain setup,DNS,and redirects fix broken canonical URLs and staging leaks.
  • Cloudflare setup adds SSL,DDoS protection,caching where safe,and cleaner edge security.
  • Email authentication fixes SPF,DKIM,and DMARC so operational mail reaches inboxes.
  • Deployment cleanup makes sure production points at the right build with correct environment variables.
  • Secret handling removes exposed credentials from code,bundles,and logs.
  • Monitoring gives you uptime alerts so failures are caught before customers do.
  • Handover checklist gives your team a clear list of what is live,wherethe risks remain,and what to watch after launch.

My delivery window is 48 hours because this work should be tight,specific,and low-drama: 1. Hour 0-8: audit domain,deployment,secrets,email,and monitoring gaps. 2. Hour 8-24: fix DNS,CNAMEs,CSP basics,rewrite rules,and production config. 3. Hour 24-36: lock down env vars,secrets,CORS,rate limits,and SSL checks. 4. Hour 36-48: verify handover,test alerts,and confirm launch readiness for review.

Delivery Map

References

  • roadmap.sh API Security Best Practices: https://roadmap.sh/api-security-best-practices
  • roadmap.sh Cyber Security Roadmap: https://roadmap.sh/cyber-security
  • OWASP API Security Top 10: https://owasp.org/www-project-api-security/
  • Cloudflare Docs on DNS and SSL/TLS: https://developers.cloudflare.com/ssl/
  • Google Postmaster Tools help for email deliverability basics: https://support.google.com/postmaster/answer/9008080

---

Take the next step

If this is a problem in your product right now, here is what to do next:

  • [Use the free Cyprian tools](/tools) - estimate cost, score app risk, check launch readiness, or pick the right service sprint.
  • [Book a discovery call](/contact) - I will tell you honestly whether you need a sprint or if you can DIY the next step.

*Written by Cyprian Tinashe Aarons - senior full-stack and AI engineer helping founders rescue, launch, automate, and scale AI-built products.*

Next steps
About the author

Cyprian Tinashe AaronsSenior Full Stack & AI Engineer

Cyprian helps founders rescue, secure, deploy, and automate AI-built apps with production-grade engineering, launch systems, and AI integration.