← Training hub
Partner login Screenshots
← Facilitator Demo users →
Download PDF Partner login Public site
SG
Saving a Generation
Ops · Runbook

Demo → production
Go-live checklist

Use this when green light is given. Portals UX and online training are ready; remaining work is identity, data hygiene, domains, and the email / Paybill flips. Do not execute flips until PO + ops approve.

Live today: Marketing + portals · Training manuals · Partner login

API: Railway Postgres · https://api-production-92a5.up.railway.app/v1

Status: Demo / workshop mode — seed users and simulate forms/payments until flipped.

A. Must-do before inviting real partners

Security and data — complete before real CSR/Host invites.

ItemNotes
Kill or rotate demo accountsDisable *@sag.local / *@acme.local / *@sigona.local or change every password off Password123!
Turn off auto-seedEnsure SEED_ON_BOOT is unset on Railway prod
Invite real ops usersCreate real ops_admin (+ optional ops_readonly); stop shared seed password for invites
Confirm JWT + CORSStrong unique JWT_SECRET; CORS_ORIGINS locked to marketing + portal origins (not *)
Confirm Postgres is SoTHealth shows store: postgres; no MemoryStore / .data/submissions.json in prod
BackupsRailway Postgres daily backup on; document one restore drill
Delete leftover Netlify sitesag-portals-unused-delete-me if still present

B. Domains & deploy posture

ItemNotes
Custom domainsApex → Netlify; api.… → Railway (TLS)
Env matrix filledNEXT_PUBLIC_SAG_API_URL / SAG_PLATFORM_API_URL → prod API; no demo secrets in client
Preview ≠ prodSeparate DB + JWT for preview environments
Deprecate /ops/inboxRedirect or banner; Admin inbox under /portal/admin is canonical
Demo logins stay hiddenKeep NEXT_PUBLIC_SHOW_DEMO_LOGINS unset in production

C. Non-tech gates

ItemNotes
NGO / board registrationClear for sponsor diligence conversations
Child safeguarding policyPublished; hosts can acknowledge in portal
MoU templateReady for first Host Node
Named ops ownerInbox triage hours owned
First real partnersNamed CSR + Host contacts (not seed fixtures)

D. Live flips (only with PO + ops approval)

Until flipped, keep SAG_FORM_CHANNEL=simulate and SAG_PAYMENT_MODE=simulate even on the production URL.

Forms (email)

ItemNotes
Provider readyResend/SMTP + secrets
Flip SAG_FORM_CHANNEL=emailOn Netlify
Smoke public formsCSR / contact / need-support → email + Admin inbox copy
Fail-closed checkBehaviour if provider is down

Payments (Paybill)

ItemNotes
Real Paybill / bank detailsSAG_MPESA_* / SAG_BANK_*
Flip SAG_PAYMENT_MODE=liveOn Netlify
Donate UI no longer simNo simulation rails shown as live
Admin labellingLeftover payment_sim still labelled; no fake settled funds

E. Soft-launch hardening (first week)

ItemNotes
Invite password hygieneReset / forced change, or unique per invite
Login rate-limit smokeConfirm throttle against brute force
Audit spot-checkAfter first real invites / triage
Staff use /training/Paths already online
Error tracking (optional G4)Sentry on API + Next; scrub PII

F. Explicitly not required for first production

Suggested order when green light lands

  1. A + B — secure the running stack
  2. C — ops can staff it
  3. Soft launch with simulate still on for forms/payments if needed
  4. D — email flip, then Paybill flip
  5. E — first-week polish

Pause here

Checklist captured for later execution. Do not flip email/Paybill or delete seed users until green light + owners are assigned.