A PPM compliance report answers one question for each site on a contract: of the planned maintenance that fell due this period, how much was done on time, and what happened to the rest? Most arguments about the number come from people counting different things, so this template pins down five outcome definitions first, then rolls them up by site and by asset category, with a RAG status and an exception list underneath.
You can download the PPM compliance report template (XLSX). It opens with fictional sample rows already in place, so you can see every formula working before you paste in your own export.
What the report has to show
A client or compliance lead reading the report wants three things, in this order:
- Is anything statutory outstanding? One open fire alarm or emergency lighting task matters more than ten late filter changes.
- Which sites are slipping? A single percentage for the whole portfolio hides the one depot where access keeps failing.
- What is being done about each miss? Every task that was not completed on time needs a line, a reason and a date.
So the layout is fixed: a by-site summary with RAG, the same summary by asset category, then the exceptions. The headline percentage sits at the top but never on its own.
Five outcomes for every task due in the period
Every task instance with a due date inside the reporting period gets exactly one outcome. If a task can land in two buckets, your compliance percentage will drift depending on who ran the report.
| Outcome | Rule | Counts as compliant? |
|---|---|---|
| Due in period | Due date is between period start and period end | The denominator |
| On time | Completed on or before the due date plus any agreed tolerance | Yes |
| Late | Completed, but after the due date plus tolerance | No |
| No access | Visit attempted, task not done, reason recorded | Depends on the contract |
| Carried over | Due in period and still open when the report is run | No |
A few decisions sit behind that table:
- Tolerance. Some contracts allow a window either side of the due date, often wider for longer frequencies. The template uses one tolerance value in Settings. If your windows differ by frequency, set each task's due date to the end of its window in your job system and leave tolerance at zero.
- Carried over is not the same as late. A late task was done. A carried-over task was not, and it moves onto next period's list as overdue. Report carried-in overdue work separately so it does not inflate next month's denominator.
- No access needs evidence. If the contract lets you exclude evidenced no-access visits, you need the reason and ideally a photo or signed note against the job. Without that, treat it as a miss.
The data model
The report needs four sources. Task instances usually come from the job management system (Uptick, Joblogic or similar); the site list and contract terms often live in a CRM or a spreadsheet; the task library carries frequencies and the statutory flag.
Fields on the task row
| Field | Source | Notes |
|---|---|---|
| task_id | Job system | One row per scheduled visit task, not per job |
| site_id | Job system | Must match the site register exactly |
| asset_id | Job system / asset register | Lets you trace repeat misses on one asset |
| asset_category | Asset register | Fire alarm, emergency lighting, water hygiene and so on |
| task_ref | Task library | Your schedule reference for the task |
| frequency | Task library | Weekly, monthly, quarterly, six-monthly, annual |
| statutory | Task library | Y or N; drives the red override |
| due_date | Job system | End of the permitted window if you use one |
| status | Job system | Completed, Open or No access |
| completed_date | Job system | Blank if not completed |
| no_access_reason | Job system | Free text or a picklist |
How the sources join
| From | To | Key | What it adds |
|---|---|---|---|
| Task instances | Site register | site_id | Site name, region, contract |
| Task instances | Asset register | asset_id | Asset category, location |
| Task instances | Task library | task_ref | Frequency, statutory flag |
| Site register | Contract register | contract_id | Tolerance, RAG thresholds, no-access rule |
Most errors in a hand-built report come from these joins: a site renamed in the CRM but not the job system, or an asset recategorised after the tasks were generated. Check unmatched keys before you trust the percentages.
Many FM businesses take task frequencies and statutory flags from SFG20, the building maintenance standard developed by BESA and published by SFG20 Ltd, which flags the tasks it treats as legally required. This template contains no SFG20 content; map your own licensed schedules into the task_ref, frequency and statutory columns.
The formulas
| Measure | Formula |
|---|---|
| Compliance % | On time ÷ Due in period |
| Adjusted compliance % | On time ÷ (Due in period − No access) |
| RAG | Red if any statutory task is carried over, or adjusted % is below the amber threshold; Amber if below the green threshold; otherwise Green |
In the spreadsheet each outcome is a COUNTIFS on site and outcome, so the summary updates as soon as a row changes. The sample thresholds are 95% for green and 85% for amber. Those are placeholders: use whatever your contract states.
PPM compliance report
1 Oct 2026 – 31 Oct 2026
Planned vs completed, by site
105 tasks due across 6 sites. One statutory task is still open, so the portfolio is red even though adjusted compliance is 93.1%.
- Tasks due in period
- 105
- 6 sites
- Compliance (on time ÷ due)
- 89.5%
- 94 on time
- Adjusted (excl. no access)
- 93.1%
- 4 not accessible
- Statutory carried over
- 1
- Makes the report red
By site
| Site | Due | On time | Late | No access | Carried over | Compliance | Adjusted | RAG |
|---|---|---|---|---|---|---|---|---|
| Halden Court Offices | 20 | 19 | 1 | 0 | 0 | 95.0% | 95.0% | Green |
| Brookmere Medical Centre | 18 | 16 | 1 | 1 | 0 | 88.9% | 94.1% | Amber |
| Corran Street Depot | 16 | 12 | 1 | 1 | 2 | 75.0% | 80.0% | Red · statutory open |
| Ashwell Primary School | 19 | 16 | 1 | 2 | 0 | 84.2% | 94.1% | Amber |
| Pellow Retail Unit 7 | 17 | 16 | 0 | 0 | 1 | 94.1% | 94.1% | Amber |
| Fenmoor Library | 15 | 15 | 0 | 0 | 0 | 100.0% | 100.0% | Green |
| All sites | 105 | 94 | 4 | 4 | 3 | 89.5% | 93.1% | Red |
Compliance = on time ÷ due. Adjusted = on time ÷ (due − no access). Green ≥ 95%, amber ≥ 85% (adjusted); any statutory task carried over makes the row red.
Exceptions (11)
Every task not completed on time. Statutory first.
| Task | Site | Asset | Due | Outcome | Detail |
|---|---|---|---|---|---|
| T0042 | Corran Street Depot | Emergency lighting StatutoryS03-EL07 | 19 Oct | Carried over | Open at period end |
| T0059 | Ashwell Primary School | Emergency lighting StatutoryS04-EL02 | 24 Oct | Late | Completed 2026-10-29 (5 days late) |
| T0030 | Brookmere Medical Centre | Fire alarm StatutoryS02-FA06 | 4 Oct | No access | Keyholder not present |
| T0039 | Corran Street Depot | Emergency lighting StatutoryS03-EL08 | 6 Oct | No access | Room in use, client refused access |
| T0046 | Corran Street Depot | Heating and boilers S03-HB01 | 26 Oct | Carried over | Open at period end |
| T0082 | Pellow Retail Unit 7 | Heating and boilers S05-HB06 | 29 Oct | Carried over | Open at period end |
| T0026 | Brookmere Medical Centre | Doors and shutters S02-DS06 | 14 Oct | Late | Completed 2026-10-19 (5 days late) |
| T0040 | Corran Street Depot | Heating and boilers S03-HB08 | 17 Oct | Late | Completed 2026-10-19 (2 days late) |
| T0013 | Halden Court Offices | Air conditioning S01-AC08 | 20 Oct | Late | Completed 2026-10-22 (2 days late) |
| T0062 | Ashwell Primary School | Heating and boilers S04-HB12 | 15 Oct | No access | Keyholder not present |
| T0065 | Ashwell Primary School | Air conditioning S04-AC09 | 22 Oct | No access | Room in use, client refused access |
Worked example: October at two sites
These figures are illustrative and come from the fictional sample in the template. Period: 1 to 31 October 2026, tolerance zero days, green at 95%, amber at 85%.
Corran Street Depot had 16 tasks due.
| Outcome | Tasks |
|---|---|
| On time | 12 |
| Late | 1 |
| No access | 1 |
| Carried over | 2 |
| Total due | 16 |
- Compliance: 12 ÷ 16 = 75.0%
- Adjusted: 12 ÷ (16 − 1) = 12 ÷ 15 = 80.0%
- One of the two carried-over tasks is an emergency lighting test flagged statutory, so the site is red regardless. At 80.0% it would have been red on the threshold anyway.
Ashwell Primary School shows why the no-access rule matters. It had 19 tasks due: 16 on time, 1 late, 2 no access, 0 carried over.
- Compliance: 16 ÷ 19 = 84.2%, below the 85% amber line
- Adjusted: 16 ÷ (19 − 2) = 16 ÷ 17 = 94.1%, which is amber
Same work, two different colours, depending on a contract clause. Agree the rule with the client before the first report goes out, and show both percentages so nobody thinks you are hiding the raw figure.
Across all six sample sites, 105 tasks were due: 94 on time, 4 late, 4 no access and 3 carried over. Portfolio compliance is 94 ÷ 105 = 89.5% and adjusted compliance is 94 ÷ (105 − 4) = 94 ÷ 101 = 93.1%. The portfolio is still red, because of the open statutory task at Corran Street.
Note also Halden Court Offices: 19 of 20 on time is exactly 95.0%, which is green because the test is "at or above". Write the boundary into your definitions.
Building the exception list
The exception list is where the report earns its keep. Include every task whose outcome is anything other than on time, sorted with statutory tasks first, then carried over, late and no access. For each line give the site, asset, due date, outcome and the detail: days late, the no-access reason, or the date it is now booked for.
In the template, filter the outcome column on the Tasks sheet; statutory carried-over rows are shaded so they stand out. Keep the list short by fixing causes, not by widening tolerances.
By asset category
The by-category view often tells a different story from the by-site one. In the sample, heating and boilers has the most misses in absolute terms, while emergency lighting is the only red category because of the open statutory test. If one category is consistently late across sites, look at engineer competence mix or parts supply rather than the sites themselves.
For how this report fits alongside response times, first-time fix and the other measures in a public-sector contract pack, see FM contract KPI reporting. For the wider set of operational measures, see field service KPIs.
Automating it with IVP.ai
The spreadsheet works, but someone still exports tasks, fixes site names and rebuilds the summary every month. IVP.ai connects the job system, CRM and spreadsheets into the IVP.ai Data Layer, a governed warehouse where the joins above are defined once and checked on every load. If you run Uptick, see Uptick reporting for how its jobs and assets map in.
A national fire safety and security company used IVP.ai to bring HubSpot, Uptick and finance spreadsheets into one governed view, saving more than 10 hours a week on reporting (case study). With the data in one place, a scheduled report or agent from Deskless by IVP.ai can produce this PPM compliance report by site each month and flag statutory tasks that are carried over as soon as the period closes. See the platform or the wider field service reporting hub.
To see it on your own data, start the free 48-hour build: we connect up to three of your sources, clean the data and set one report or agent running within 48 hours of read-only access.