Go-Live Hardening — 2026-07-15
| Field | Value |
|---|---|
| Status | Pre-production hardening pass |
| Scope | Central + Tenant + Billing (Stripe/Creem) + Leads + Tasks |
| Recommended | Tag after smoke on staging, then ship |
What this pass fixed
See CHANGELOG.md section Go-live hardening (2026-07-15).
Highlights:
- Gateway cancel on module cancel (charge-continuation fix)
- Failed webhook retry reclaim
- Renewal invoice ledger for recurring provider charges
- Tenant-bound email verification
- Production boot guards (
APP_DEBUG, HTTPS, secure headers, trusted proxies) - Staff UX: no spurious users.list 403 on Leads/Tasks
- CSV formula injection escape
Remaining risks (accepted for v1 or follow-up)
| Risk | Severity | Notes |
|---|---|---|
| In-app plan upgrade/downgrade (monthly↔yearly swap) | Medium | Cancel + repurchase only; document as unsupported for now |
| Staff role is view-mostly for Leads | Low | Product choice; tasks.complete only on Tasks |
| Bearer tokens in web storage | Medium | SPA design; already tracked in RC1 |
| Crash telemetry (Sentry) not wired | Medium | Follow-up: client + Laravel Nightwatch/Sentry |
| Dual Stripe webhook ingress | Info | Shared idempotency; prefer /webhooks/gateways/stripe |
| Creem refunds | Info | Dashboard-only; capability no longer advertises API refunds |
| Central Billing placeholder screens | Low | Refunds/coupons/taxes/logs nav still “coming soon” |
Verification
bash
cd SaaS-Backend && php artisan test --compact
# Expected: 331+ passedStaging smoke: Central login → create tenant → Stripe/Creem test checkout → cancel module (confirm provider subscription cancelled) → Leads/Tasks as admin + staff.