Skip to content

Trust overview — cross-academy KPIs at a glance

For admins

The trust overview is the trust IT lead, COO and CEO’s first stop. It shows every academy in the trust as a row, every product module’s headline KPI as a card, and a RAG-coloured cell at the intersection. Click any non-zero cell to drill into the underlying list with the school context already focused.

Find it under Admin → Trust → Trust overview (or /admin/trust/overview).

Each card is one product module’s contribution. Today five sections ship:

SectionColumnsWhat “alert” means
Estates complianceOn schedule / Due soon / OverdueOne or more statutory checks (gas, electrical, water, asbestos, fire, lifts, PAT) past their due date.
SCR — Single Central RecordValid / Expiring / Expired / ActionOne or more KCSIE checks expired, or in failed/pending requiring intervention.
HelpdeskOpen / SLA breachedOne or more open tickets at the academy with a breached SLA timer.
GovernancePolicies overdue / High risksA published policy past its next_review_date, or a residual risk score ≥ 12 on the 5×5 grid.

More sections appear as new product modules ship — Health & Safety (incidents, accidents, COSHH), People (absence, CPD), Assets (refresh cycle, EOL devices) are on the roadmap.

We use two visual cues so the heatmap reads cleanly even with hundreds of cells:

  • Cell tone — green (mark), amber (warn), red (alert), grey (neutral).
  • Dot prefix — same colour as a small indicator inside the cell, so the value is legible at a glance even on small viewports where the cell fill is muted.

Neutral grey doesn’t mean “all good”; it means “nothing in this bucket”. An academy with no statutory schedules at all (a brand-new join, or a setup gap) shows neutral cells everywhere, which is itself a useful signal.

Clicking a non-zero cell does two things:

  1. Switches the school context to that academy (the masthead chip updates to read the academy’s name).
  2. Lands on the relevant list page with the right filter applied (e.g. SCR register filtered to expires=expiring_soon).

Click All on a card header to leave focus open and review the full module across the trust.

Trust admins only. School-pinned users (DSL, school office, individual headteachers — any user with restricted_to_school_id set) get a 403: they wouldn’t see another academy’s data anywhere else, so the rollup view would expose data that’s outside their tier. See School-level access control for the two-tier model.

A user without a specific module’s permission (e.g. a trust admin who isn’t in estates::admin) gets the rollup with that section’s card omitted, rather than a partial render. The rest of the page works normally.

When an academy has zero data in every column for a section, that’s usually one of three things:

  • Brand-new academy in the process of being onboarded — the trust IT lead can spot the gap and chase the local team.
  • A module the academy hasn’t started using — surface for a chase.
  • An academy whose data was imported with school_id = NULL — see trust-level rows in the RBAC doc.

The rollup runs each module’s contributor in turn and assembles the payload server-side. Each contributor uses a single grouped query against the relevant table; total turnaround on a 14-academy trust is typically < 50 ms even with thousands of records per academy. We don’t cache the result — the trust admin opens this page when they want a fresh read, and stale numbers are worse than slightly slower ones.