Once first contracts are signed, this page wires up to POST /api/v1/platform/tenants/health-snapshot and renders per-tenant health KPIs. The skeleton below shows what to expect.
| Tenant | Plan | MRR | Identities | Health score | Renewal | CSM | Risk |
|---|---|---|---|---|---|---|---|
| No tenants yet. First customer onboarding will populate this. | |||||||
Each tenant gets a 0-100 health score with three weighted dimensions:
| Dimension | Weight | Signals |
|---|---|---|
| Engagement | 40% | Distinct DAU, login frequency, feature-breadth (% of nav items visited / month) |
| Operational | 30% | Open tickets, SLA-breach count last 90d, deploy errors |
| Commercial | 30% | NPS, days-to-renewal (proximity weight), invoice age |
Health tiers: 75-100 green ยท 50-74 yellow ยท 25-49 orange ยท 0-24 red (churn risk).
audit_event filtered by event_type LIKE 'login.%' + per-tenant aggregationPlatformTenant (new fields: contract_start, contract_end, renewal_owner)TenantPlan + addonscontract_* fields to PlatformTenant via alembic migrationHealthScoreService.compute_for_tenant() in a new backend/app/domain/customer_health/ module_maybe_compute_health_scores โ 6h interval per tenantGET /api/v1/platform/tenants/health (platform-admin only)