Appearance
Customer health
Who this is for: Platform operators
What you'll achieve: See which schools have set up, which are actually using the portal, and who needs a nudge before they cancel
Paid schools that never finish setup, or go live and then go quiet, are the ones most likely to churn. The operator console surfaces that without opening each portal.
Where to look
- Overview has a customer health card: paid-not-live, dormant, actively used, and gone live counts.
- Schools & flags lists every school with one status chip, last sign-in, and last published day. Use Needs attention, Unused, Stuck, Setting up, Live, or Dormant. Filters stay in the URL so you can share a view.
- Open a school for the finer picture: what they need next, sign-in counts, staff seats, published days, assistant messages, open help, and the missing setup steps.
What the badges mean
Setup stage
Taken from the same wizard state the school sees.
| Stage | What it means |
|---|---|
| Not started | They have a tenant and have not begun setup |
| Setting up | Some required steps are done |
| Ready to go live | Required setup is done; they have not published / gone live |
| Live | They completed go-live |
Usage
| Status | What it means |
|---|---|
| Never signed in | No auth.login or auth.login_sso audit event |
| In setup | Someone signed in, but the school is not live |
| Actively used | Live, signed in within 14 days, and published or rebuilt a rota within 21 days |
| Signed in, no recent rota | Live and signing in, but the board has gone stale |
| Dormant | Live, but nobody has signed in for 21 days |
Needs attention
These are the rows to work first.
| Flag | Trigger | Suggested action |
|---|---|---|
| Cancelling | Stripe cancel at period end, or already cancelled | Read the cancel survey on the school page. Offer to unblock them if the reason is product. |
| Paid, unused | Paid plan, not live, created 3 or more days ago | Email or call. Offer a setup session or impersonate to see where they stopped. |
| Trial unused | Trial, still not started, 7 or more days old | Same as unused paid, with less urgency. |
| Stuck in setup | In progress or ready to go live for 7 or more days | Check the remaining wizard steps and inbox. |
| Dormant | Live, no recent sign-in | Confirm they still run a weekly board. A quiet live school is often a cancellation in waiting. |
How we measure it
The chip (Paid unused, Stuck in setup) is only the bucket. The row and school page add the next wizard step, a one-line need, and an offer so you know whether to resend a login, walk through staff upload, sit on first publish, or reply in Inbox.
No extra tracking tables. The list aggregates:
tenants.setupStateandsetupProgress- Active
peoplerows for seat use day_instances.publishedAtfor last publish and published day count- Audit actions
auth.login,auth.login_sso,rota.publish,rota.publish_week,rota.recompute,rota.prepare_week,setup.go_live, andstaff.import - Active portal users, open or waiting help requests, and assistant message count
GET /api/operator/tenants includes a health object on each school. Existing tenant fields are unchanged.
What this is not
School-facing chat does not answer operator health questions. Billing changes stay in Stripe and Admin → Billing. This view is for the platform team only.

