checklists / launch-ready

Launch Ready cyber security Checklist for client portal: Ready for scaling past prototype traffic in B2B service businesses?.

For a client portal, 'ready' does not mean 'it works on my laptop.' It means a customer can log in, see only their own data, complete key tasks, and trust...

What "ready" means for a B2B client portal

For a client portal, "ready" does not mean "it works on my laptop." It means a customer can log in, see only their own data, complete key tasks, and trust the system under real traffic without exposing secrets, leaking records, or falling over during a sales push.

If you are trying to scale past prototype traffic, I would define ready like this:

  • No critical auth bypasses.
  • Zero exposed secrets in the repo, logs, or frontend bundle.
  • p95 API latency under 500ms for core portal actions.
  • LCP under 2.5s on a mid-tier mobile connection.
  • SPF, DKIM, and DMARC all passing for domain email.
  • Cloudflare and SSL configured correctly across apex, www, app, and portal subdomains.
  • Uptime monitoring is live before launch, not after an outage.
  • A rollback path exists if deployment breaks onboarding or login.

If any of those are missing, you do not have a launch-ready portal. You have a prototype with production risk.

Quick Scorecard

| Check | Pass criteria | Why it matters | What breaks if it fails | |---|---|---|---| | Auth hardening | No auth bypasses; session expiry works; MFA enabled if supported | Prevents account takeover and cross-client data leaks | Customer data exposure, support escalations | | Authorization | Users only access their own org and records | Core B2B trust boundary | One client sees another client's data | | Secrets handling | Zero secrets in frontend code or public repos | Stops credential theft | API compromise, email abuse, cloud spend loss | | Email authentication | SPF, DKIM, DMARC all pass | Keeps portal emails out of spam and reduces spoofing | Login emails fail delivery, phishing risk rises | | DNS and redirects | Correct apex/www/app redirects; no loops; TLS enforced | Prevents broken entry points and mixed content | Lost traffic, login failures, SEO damage | | Cloudflare setup | WAF rules active; DDoS protection on; caching tuned | Reduces attack surface and absorbs traffic spikes | Downtime during bot traffic or campaigns | | Deployment safety | Production deploy is reproducible with rollback plan | Limits blast radius of bad releases | Broken onboarding, emergency firefighting | | Monitoring | Uptime checks and error alerts active 24/7 | Detects failures before customers do | Silent outages, missed revenue | | Performance baseline | LCP under 2.5s; p95 API under 500ms for core flows | Keeps conversion stable as traffic grows | Drop-off during login and dashboard load | | Logging hygiene | No passwords, tokens, or PII in logs | Protects customer data and compliance posture | Data leakage through observability tools |

The Checks I Would Run First

1. Authentication cannot be bypassed

Signal: I try direct links to protected pages without a valid session. If I can reach the dashboard, invoices, documents, or settings from an unauthenticated browser window, the portal is not safe.

Tool or method: Incognito browser testing plus basic request inspection in DevTools or Burp Suite. I also test session expiry by waiting for timeout and reloading protected routes.

Fix path: Enforce server-side auth on every protected route and API call. Do not rely on frontend route guards alone. Add session expiry checks and make sure logout invalidates tokens immediately.

2. Authorization is tenant-safe

Signal: I change object IDs in URLs or API requests and look for cross-account access. In B2B portals this is where prototype apps usually fail.

Tool or method: Manual ID tampering plus API tests against common endpoints like `/clients/:id`, `/projects/:id`, `/files/:id`. I verify every response is scoped to the current org.

Fix path: Apply organization-level authorization at the query layer. Every read and write should filter by tenant ID before returning data. If your backend cannot prove ownership at the database boundary, it is too easy to leak data.

3. Secrets are not exposed anywhere public

Signal: I scan the frontend bundle, repo history, deployment logs, environment files, and error pages for API keys, webhook secrets, SMTP credentials, Stripe keys, and admin tokens.

Tool or method: `git grep`, secret scanning tools like Gitleaks or TruffleHog, browser source inspection, and log review in your hosting platform.

Fix path: Move secrets into environment variables managed by the host or secret manager. Rotate anything already exposed. If a secret has been committed publicly once, assume it is compromised.

4. Email authentication passes cleanly

Signal: Portal emails arrive in inboxes instead of spam folders. Login links, invites, password resets, invoices notifications, and support messages must authenticate properly.

Tool or method: Check DNS records for SPF/DKIM/DMARC using MXToolbox or your email provider's validation tool. Send test mail to Gmail and Outlook accounts.

Fix path: Publish correct SPF records with one authorized sender path only. Enable DKIM signing from your provider. Set DMARC to at least `p=none` during validation and move toward `quarantine` once aligned.

A minimal example looks like this:

v=spf1 include:_spf.google.com include:sendgrid.net -all

That line only works if those services are truly your senders. If you guess here, delivery breaks later.

5. Cloudflare is actually protecting the app

Signal: The app sits behind Cloudflare with SSL enforced end to end. Bot traffic gets challenged where needed and static assets are cached safely without caching private pages.

Tool or method: Review DNS proxy status in Cloudflare dashboard plus header checks in browser devtools or `curl -I`. Test that `http` redirects to `https` once only.

Fix path: Put the zone behind Cloudflare proxy mode where appropriate. Enable WAF rules for login endpoints and obvious abuse patterns. Cache only public assets; never cache authenticated HTML responses unless you know exactly what you are doing.

6. Monitoring catches failures before clients do

Signal: A failed deploy triggers an alert within minutes. Login errors spike? You know immediately. Uptime checks hit every critical route from outside your network.

Tool or method: Configure uptime monitors for homepage, login page, auth callback if relevant via SSO/OAuth providers like Better Stack or UptimeRobot. Add error tracking such as Sentry for frontend and backend exceptions.

Fix path: Monitor the actual business flow: home page -> login -> dashboard -> core action -> logout. Alert on downtime plus elevated error rate so you catch partial failures that still look "up" from the outside.

Red Flags That Need a Senior Engineer

1. You have no idea where secrets live right now.

  • That usually means they are scattered across code files, `.env` copies, CI logs, old branches, and team laptops.

2. Your portal uses role-based access control but has never been tested with ID tampering.

  • This is how one client sees another client's records without anyone noticing until a complaint lands in your inbox.

3. Deployments are manual and risky.

  • If one bad release can take down onboarding for hours because there is no rollback plan or staging parity check, you need senior help.

4. Email deliverability is inconsistent.

  • If invites land in spam today but not tomorrow while sales keeps sending prospects into the portal flow,, that will hurt conversion fast.

5. You are expecting traffic growth from ads or outbound but have no monitoring.

  • Prototype apps often survive small usage because nobody notices when they fail. Paid traffic exposes every weak point immediately.

DIY Fixes You Can Do Today

1. Rotate any obvious secrets you can find.

  • Start with API keys used by email services,, payment tools,, analytics,, and storage buckets.
  • If a key is visible in frontend code,, treat it as public already.

2. Turn on MFA for every admin account.

  • This is low effort protection against account takeover through stolen passwords or reused credentials.

3. Check your DNS records manually.

  • Confirm there is one clear canonical domain,, correct redirects from `www` to apex or vice versa,, and no broken subdomain entries for `app`, `portal`, `api`, or `mail`.

4. Test login from three separate environments.

  • Use Chrome incognito,, Safari mobile,, and one external Gmail account.
  • If password reset,, invite emails,, or magic links fail anywhere,, fix that before launch ads go live.

5. Review logs for sensitive data.

  • Search recent application logs for emails,, tokens,, passwords,, SSNs,, invoices,, file URLs,, or internal IDs that should not be public in observability tools.

Where Cyprian Takes Over

When founders come to me with this service request,,, I map failures directly to launch work instead of giving them a vague audit report they still have to decode later.

Here is how Launch Ready covers the common gaps:

| Failure found | Deliverable included | Timeline impact | |---|---|---| | Broken DNS / redirect chain / subdomain confusion | DNS cleanup,,, redirects,,, subdomain routing,,, canonical domain setup | Hours 1-8 | | Missing SSL / mixed content / insecure entry points | SSL enforcement,,, HTTPS redirect fixes,,, certificate validation || Hours 1-8 | | Weak perimeter protection / bot noise / abuse risk | Cloudflare setup,,, DDoS protection,,, caching rules,,, WAF tuning || Hours 4-16 | | Email delivery problems / spoofing risk | SPF/DKIM/DMARC configuration test pass || Hours 4-16 | | Exposed secrets / unsafe env handling / config drift || Environment variables cleanup,,, secret rotation guidance,,, production config review || Hours 8-24 | | Risky deploy process / broken handover || Production deployment,,, smoke tests,,, rollback notes,,, handover checklist || Hours 16-36 | | No visibility after launch || Uptime monitoring setup,,, alert routing,,, basic incident checklist || Hours 24-48 |

My recommendation is simple: if the portal handles client data,, billing,, documents,, schedules,, approvals,, or private messaging,, do not self-launch if any of the first six checks fail more than once.

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 roadmap: https://roadmap.sh/cyber-security
  • OWASP Top 10: https://owasp.org/www-project-top-ten/
  • Cloudflare docs on SSL/TLS overview: https://developers.cloudflare.com/ssl/

---

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.