checklists / launch-ready

Launch Ready cyber security Checklist for client portal: Ready for launch in B2B service businesses?.

For a client portal, 'launch ready' does not mean the UI looks finished. It means a paying customer can sign in, access only their own data, complete core...

What "ready" means for a B2B client portal

For a client portal, "launch ready" does not mean the UI looks finished. It means a paying customer can sign in, access only their own data, complete core tasks, and your team can sleep without worrying about exposed secrets, broken email, or a public misconfiguration.

For B2B service businesses, I would define ready as this: zero exposed secrets, authenticated users cannot see other tenants' data, email deliverability is passing SPF/DKIM/DMARC, SSL is enforced everywhere, redirects are clean, monitoring is live, and the deployment can survive real traffic without support chaos. If any of those fail, you do not have a launch problem, you have a production risk problem.

Launch Ready is built for exactly that gap.

Quick Scorecard

| Check | Pass criteria | Why it matters | What breaks if it fails | | --- | --- | --- | --- | | HTTPS everywhere | All pages and APIs force SSL with no mixed content | Protects login sessions and customer data | Browser warnings, stolen sessions, failed trust | | Secrets handling | No API keys or private tokens in frontend code or repo history | Prevents account takeover and data exposure | Leaked Stripe, OpenAI, or database access | | Auth boundaries | Users only access their own org or account data | Stops tenant data leaks | Cross-client data exposure and legal risk | | Email authentication | SPF, DKIM, and DMARC all pass | Improves deliverability and spoof protection | Invoices and portal emails land in spam | | DNS and redirects | Domain points correctly with canonical redirects only | Avoids duplicate URLs and broken login links | SEO loss, auth callback failures | | Cloudflare protection | WAF/CDN/DDoS basics are active where needed | Reduces attack surface and downtime risk | Bot traffic spikes and service instability | | Environment separation | Dev/staging/prod variables are isolated | Prevents test data from hitting real users | Wrong API endpoints or accidental data writes | | Monitoring live | Uptime alerts fire within 5 minutes of outage | Lets you catch failures before clients do | Silent downtime and support tickets | | Error handling | Login, upload, payment, and form errors are clear and logged safely | Reduces user drop-off and debugging time | Broken onboarding and support overload | | Deployment repeatability | Production deploy can be reproduced from documented steps | Makes fixes safe after launch day | Manual mistakes during hotfixes |

A good target for the portal itself is p95 API latency under 500 ms for common requests like dashboard load or client list fetches. If you cannot measure that yet, you are guessing about production readiness.

The Checks I Would Run First

1. DNS points to the right place

Signal: the domain resolves to the correct app host, subdomains are intentional, and old records are not conflicting. I check whether `www`, root domain, portal subdomain, API subdomain, and mail records all line up with the intended architecture.

Tool or method: `dig`, Cloudflare DNS dashboard, browser checks on root domain and subdomains. I also test canonical redirects so there is one public version of each URL.

Fix path: remove stale A or CNAME records, set one canonical host pattern, add 301 redirects for non-canonical routes, and verify auth callback URLs still match after the redirect rules. If this step is sloppy, users will hit login loops or broken password reset links.

2. SSL is enforced end to end

Signal: every public route loads over HTTPS with no mixed-content warnings. The browser should never show insecure asset requests on login pages or inside authenticated views.

Tool or method: browser dev tools security tab, SSL Labs test if needed, Cloudflare edge settings. I also inspect hardcoded asset URLs in code because one old HTTP image can ruin trust on an otherwise secure page.

Fix path: force HTTPS at the edge, update absolute asset links to HTTPS or relative paths if appropriate, turn on HSTS only after confirming all subdomains are safe. If mixed content remains on launch day, some browsers will block critical scripts or images.

3. Secrets are not exposed in code or logs

Signal: no `.env` values in the frontend bundle; no keys committed to git; no sensitive values printed in logs; no test credentials in production config. This is one of the fastest ways founders accidentally create a breach before revenue starts.

Tool or method: search repo history for `sk_`, `pk_`, `secret`, `token`, `api_key`, `.env`, plus runtime log review. I also check build artifacts because some tools inject env values into client-side bundles by mistake.

Fix path: rotate any exposed secret immediately, move private keys server-side only where possible, use environment variables per environment boundary instead of shared files. If a secret has ever been public in GitHub or a deployment log, assume it is compromised.

4. Authentication actually enforces tenant isolation

Signal: a signed-in user cannot fetch another client's record by changing an ID in the URL or API request body. This is the difference between a portal that works and one that leaks customer data.

Tool or method: manual tampering tests in browser dev tools/Postman plus basic authorization tests in CI. I try direct object reference attacks against invoices, files, notes, messages, projects, and admin endpoints.

Fix path: enforce authorization on every server-side read/write route using org membership checks and role checks. Never trust frontend filtering alone. If this fails once in testing at launch time it could fail publicly under normal use.

5. Email deliverability passes SPF/DKIM/DMARC

Signal: outgoing mail from your domain passes authentication checks and aligns with your sending provider. For B2B portals this affects invites, invoices, password resets,,and notifications that customers must receive.

Tool or method: MXToolbox style validation plus provider dashboards from Google Workspace or Microsoft 365 if relevant. I send test emails to Gmail and Outlook because those providers expose alignment issues quickly.

Fix path: publish correct SPF include records only once per sender path count limit where possible; enable DKIM signing; set DMARC to at least `p=none` during verification then tighten later when stable.

v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com; adkim=s; aspf=s

That example is intentionally conservative for rollout verification. Once reports look clean for a week or two you can move toward stricter policy if your mail stack supports it.

6. Monitoring catches outages before clients do

Signal: uptime checks hit login page plus one authenticated health endpoint if available; alerts go to email or Slack within minutes; error tracking captures exceptions with enough context to debug safely. A portal without monitoring becomes invisible until customers complain.

Tool or method: UptimeRobot/Better Stack/Pingdom plus Sentry or similar error tracking. I verify alert routing by forcing a controlled failure during setup so we know notifications work before launch.

Fix path: add health endpoints for app status and dependency checks like database connectivity; configure alert thresholds; make sure logs do not contain personal data but still include request IDs for tracing.

Red Flags That Need a Senior Engineer

If you see any of these five issues before launch day,I would not DIY this unless you want delayed release cycles and avoidable incident risk:

1. You have multiple environments but one shared database. That usually means staging changes can hit real customer records by accident. 2. Your auth was copied from boilerplate without server-side authorization tests. That creates hidden tenant leakage risk. 3. You have secrets scattered across Lovable,Bolt,Cursor,v0 exports,and deployment settings. Cleanup gets messy fast,and rotation mistakes can break production. 4. Your email sender domain has never been authenticated. Expect missed invites,password reset failures,and support tickets. 5. You do not know what happens when the app goes down at midnight. No monitoring means slow recovery,and slow recovery means angry clients.

DIY Fixes You Can Do Today

1. Remove obvious secrets from visible frontend code. Search your repo for private keys,tokens,and connection strings,and rotate anything suspicious immediately. 2. Turn on HTTPS redirects at your host or Cloudflare. Make sure root,www,and portal routes all land on one canonical secure URL. 3. Verify your auth flows manually. Sign in as two different users,and confirm each account only sees its own records. 4. Set up SPF,DKIM,and DMARC now. Even basic alignment is better than sending critical client emails from an unauthenticated domain. 5. Add basic uptime monitoring today. Monitor homepage,status page,and login endpoint so you get alerted before customers open support tickets.

These fixes will not make the product fully safe,but they reduce obvious launch blockers fast.

Where Cyprian Takes Over

Here is how I map common failures to Launch Ready deliverables:

| Failure found in audit | Service deliverable used | Timeline impact | | --- | --- | --- | | Domain misrouting or bad redirects | DNS cleanup,cannonical redirects,new subdomain setup | Fixed inside first 6-10 hours | | Mixed content or weak SSL setup | Cloudflare configuration + SSL enforcement + caching rules | Same day once DNS settles | | Exposed secrets or poor env management | Environment variable audit,secrets cleanup,handover checklist | First priority within hours 1-12 | | Missing email authentication | SPF/DKIM/DMARC setup + sender validation testing | Usually same day | | No monitoring / silent failures risked at launch through dedicated uptime monitoring setup plus handover checklist with alert routing verified before delivery.| Monitoring setup + handover checklist + alert routing verification.| Final phase before handoff| | Production deploy not repeatable / risky hotfixes.| Production deployment hardening plus documented handover steps.| End of sprint|

My approach in this sprint is simple: fix launch blockers first,because every hour spent polishing non-critical UI while auth,email,and deployment are unstable increases support load later. In practice,I would spend hour 1-6 on discovery,DNS/SSL/secrets triage,hour 6-24 on deploy/email/auth hardening,hour 24-36 on monitoring/testing,and hour 36-48 on handover plus final verification.

The result should be clear enough that your team can answer three questions without me:

  • Can clients log in safely?
  • Will important emails arrive?
  • Will we know quickly if something breaks?

If any answer is "not sure",the portal is not ready yet.

References

  • roadmap.sh Code Review Best Practices - https://roadmap.sh/code-review-best-practices
  • roadmap.sh API Security Best Practices - https://roadmap.sh/api-security-best-practices
  • roadmap.sh Cyber Security - https://roadmap.sh/cyber-security
  • OWASP Top Ten - https://owasp.org/www-project-top-ten/
  • Cloudflare Learning Center - https://www.cloudflare.com/learning/

---

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.