commvita
Connected care platform
Workforce & rostering

Workforce and rostering: the roster, the gap and the bank

Who is working, where the hole is, and what it cost to fill it, on one set of records — with the safe-staffing return rated exactly as the code holds it.

Live vs demonstrated: Live — real, API-backed platform logic (wired end-to-end today) Demonstrated — representative control surface with seeded data / illustrative UI mock-up
© 2026 Commvita Digital Health Solutions Ltd. All rights reserved.

1 The roster, the gap and the bank

Three questions run a service: who is working, where is the hole, and what did it cost to fill it. Most organisations answer them in three systems and reconcile in a spreadsheet. commvita answers them from one set of records, so the shift a manager filled on Tuesday is the row the pay bill counts and the row a safe-staffing return is built from.

First to market
Payroll runs against the contract register, with no separate HR system. A pay period reads the same contracts that hold the whole-time equivalent, the band and the pension scheme, so the run carries headcount and WTE with the gross, the employer national insurance and the pension. No system we assessed does payroll and the clinical operating record on one platform; the alternative is an HR system, an interface and a monthly reconciliation somebody owns.From commvita’s own competitive assessment of this module against the systems it competes with. Our assessment, not an independent one.

Build it

Week view · templates · rotations · self-rostering

Shifts by person and day, with the skill mix counted underneath. Patterns come from a template, doctors run on rotations, and staff put in preferences before sign-off.

Fill it

Bank pool · agency requests · tiers · rates

A bank of known people with their skills and hourly rate, then an agency request with a tier, a cost code and a rate if the bank can’t cover it. Filled or unfilled is a state on the record.

Answer for it

Working time · skill mix · CHPPD · pay

Working-time breaches and rest-period gaps come out of the same shifts, care hours per patient day are derived from them, and the pay bill sits next to both.

2 Building a roster

The week view is the roster as it stands: every person, every day, the shift code and its start time, with a qualified-staff count on the bottom row. It’s written and read through the platform’s own rota records, so a change here is the change everything else sees.

Rostering, eRostering tab, week of Monday 7 to Sunday 13 September. Eighteen staff rows with band and role, each day carrying a shift pill such as E 07:00, D 09:00, L 13:00 or OFF. The bottom Skill Mix row counts qualified staff per day: 5, 6, 6, 6, 6, 1, 1.
eRostering · week view with skill mixCaptured from the running system, build B-591 · seeded data
1

Start from a pattern rather than a blank grid

A template holds a pattern and is applied to a chosen week. Doctors in training sit on rotations with a start and end date instead of being typed in each time. Neither is clever; both stop a week being rebuilt by hand.

/rostering/rota/templates/rota/rotations
2

Let staff say what they want before it’s fixed

Self-rostering preferences go in against a week and come back accepted or not. Leave requests run against a live balance and the same week, so the two are never out of step.

/rota/self-roster-preferences/rota/leave-requests
3

Sign it off, and keep the provisional state visible

Until a roster is signed off it says so on the header. Sign-off is an action against the week, so “the roster was provisional when that shift ran” is a fact on the record.

/rota/sign-off

On-call and leave are the same records the member of staff sees in their own portal.

3 Filling a gap: bank first, then agency

A gap is only interesting once you know what it costs to close. commvita holds a bank pool of known people with skills and hourly rate, and an agency request register with a tier, a cost code, a rate and who filled it. The order matters: bank before agency, and the cost of getting that order wrong is in the same table.

Rostering, Bank and Agency tab. Four tiles: 4 bank available, 2 agency requests open, 2 filled this month, 1 unfilled. A Bank Staff Pool table lists four people with role, skills, phone and hourly rate from 18.00 to 23.00 pounds. An Agency and Bank Requests table lists five references from AGY-2026-1001 to AGY-2026-1005 with date, role, tier, cost code, rate from 18 to 32 pounds, who filled it and a status of filled, open or unfilled.
Bank & Agency · pool and open requestsCaptured from the running system, build B-591 · seeded data

The two rates say more than a policy does. A bank clinician is on £22.50 an hour; the tier-one agency fill for the same role is £32. Both carry a cost code and both roll into the spend on the roster header. A separate cascade board at /bank-agency lays the escalation out with rate cards and working-time checks; it’s a demonstrated surface with seeded content.

4 The rules the roster breaks

A roster that can’t tell you when it breaks the working-time rules is a diary. The compliance tab reads the same shifts over a seventeen-week reference period and marks breaches by name: contracted hours against hours this week, the seventeen-week average, the exception count, and a separate table of rest periods under eleven hours.

Skill mix is counted the same way: planned and actual whole-time equivalent, qualified against unqualified, and the bank and agency share of the week, all from the rostered shifts. Sickness is scored on the Bradford factor from the sick leave recorded.

Where the header is softer than the grid. On the strip of tiles above the roster, the fill, unfilled, bank and agency counts and the spend are counted from the records. Two of them, planned hours and roster compliance percentage, are fixed values returned by the platform not computed from the week in front of you. Better said here than quoted at a board meeting as something the roster produced.

5 CHPPD, and the honest state of the safe-staffing return

Care hours per patient day is the number a board reads and the one most often typed. In commvita it’s derived and never stored: care hours come from shifts keyed to a ward, the denominator from occupied bed days, and the period is half open so the discharge day isn’t an occupied day.

Safe Staffing CHPPD dashboard. Four tiles: overall CHPPD today 5.8 hours, registered nurse hours per patient day 3.4, healthcare assistant hours per patient day 2.4, planned CHPPD 6.2 target hours. A red-amber-green summary reads 2 red, 2 amber, 4 green. A table of eight wards from Acacia to Holly shows beds, occupied, RN planned and actual, HCA planned and actual, CHPPD from 4.0 to 6.9, a RAG rating and an Escalate button on the two red wards. The footnote gives the formula: CHPPD equals total RN hours plus total HCA hours divided by occupied beds, target 6.2 hours.
Safe Staffing · CHPPD dashboard (seeded)Captured from the running system, build B-591 · seeded data

Now the part this library has rated two different ways. That screen is a demonstrated surface: the ward rows, the RAG ratings and the escalations are seeded content held in the page, and the staffing board, the professional judgement log and the board return are the same. Rating them as live overstates what a buyer gets on day one, and this document settles it the other way.

1

The computation is real, and on this data it returns nothing

Ask for CHPPD over a week of the demonstration data and it returns an empty ward list, 840 care hours it won’t attribute, and the reason: not one of the four hundred rostered shifts is keyed to a ward, because the seeded shifts sit at ambulance stations, clinics and community bases. A shift with no ward key contributes to nothing, and spreading it across wards would manufacture the number.

/safe-staffing/chppd/safe-staffing/occupancy
2

It tells you what is unkeyed and why

The reconciliation return names the staff it couldn’t resolve and the shift locations that aren’t wards, so the gap is something an organisation can close instead of a percentage on a slide. A name held by two people resolves to nobody instead of to the first row.

/safe-staffing/phase0/reconciliation
3

What it refuses to report

There’s no registered and support split, and it says so with its reason: the role on a shift is free text, and inferring a classification from a pay band would be a guess presented as a measurement. commvita ships none of the licensed acuity instruments either. It holds the judgement and the variance and never declares a shift safe.

NQB 2014NHS England 2019

6 Workforce intelligence, split down the middle

Vacancy, turnover, sickness and agency spend are the four numbers a workforce committee lives on. The page carries them twice: a live band computed from the record at the top, and an illustrative planning band underneath, labelled as seeded.

Workforce Intelligence dashboard. A live workforce position panel marked LIVE 2026-09 shows vacancy rate ND with the note that no funded establishment is recorded so there is no denominator, sickness absence 0 percent with 0 WTE-days lost, and agency share of pay ND because no payroll run is recorded for the period. Below it a strip labelled ILLUSTRATIVE PLANNING VIEW SEEDED shows total WTE 821.0, vacancy rate 8.6 percent, turnover 14.2 percent, agency and bank spend 2.4 million pounds, sickness 5.8 percent and time to hire 94 days, with a staff-group table and a twelve-month headcount chart.
Workforce Intelligence · live position above, seeded planning view belowCaptured from the running system, build B-591 · seeded data

The live band reads contracted WTE from the contract register, the pay bill from payroll and sickness from recorded absence. Where nothing has been recorded it prints ND and not nought, because a vacancy rate of nought per cent reads as a fully staffed organisation, and it names the fix: set a funded establishment for the period. It also refuses to estimate. Two filled agency requests carry a rate but no hours, so they’re excluded from the cost, not guessed at.

The seeded band is the planning view a buyer sees in a demonstration: turnover, time to hire, staff group against funded establishment, twelve months of headcount. It shows the shape of the reporting and it isn’t a read of the record. The page says so itself, in a banner at the top.

7 The visual boards

Ward by day is where a fill problem is visible. The heatmap puts roster fill for each ward against each day with a sickness marker on the shifts that carried one. Two more views sit behind it: a skill-mix treemap of substantive against bank and agency by staff group, and per-ward agency reliance against an eighty per cent substantive target.

Workforce Heatmaps and Skill-Mix page. A banner reads Seeded — illustrative: every figure on this page is illustrative and is not read from the record, the control surface is real, the numbers demonstrate it. Tiles show total WTE 1,660, substantive fill 84 percent against a target of 80, agency WTE 99, average roster fill 84 percent and 75 sickness shifts this week. A roster fill heatmap grids eight wards from AMU to MH Acute against Monday to Sunday with fill percentages from 65 to 101 coloured red through green, and a red dot marking sickness on shift.
Workforce Visual Boards · roster fill heatmapCaptured from the running system, build B-591 · seeded data

Every figure there’s illustrative and the page says so before you read a number. I keep it because the control surface is the thing being bought: the grouping, the thresholds, the accessible table behind the picture. The numbers follow once a deployment keys its shifts to wards.

8 What it costs, and who is trained to do it

Rostering that doesn’t meet pay is half a system. commvita holds legal entities, cost centres with a budget and a named holder, contracts with band, WTE, hours and pension scheme, and payroll runs against those contracts.

HR and Finance, Payroll tab. A Payroll Runs table with two rows: pay period 2026-05, status paid, headcount 10, 8.3 WTE, gross pay 189,420 pounds, net 147,280, employer national insurance 18,940, pension 21,200, with an Export BACs action; and 2026-06, status draft, headcount 10, 8.3 WTE, gross 192,650, net 149,810, employer NI 19,260, pension 21,580, with a Calculate action.
HR & Finance · payroll runs carrying headcount and WTECaptured from the running system, build B-591 · seeded data

These are records instead of a report. A contract can be added, a payroll run moved from draft to paid, and service line profit and loss reads the same cost centres. That’s why the live band on the intelligence page can say there’s no pay bill to express agency spend as a share of: it’s reading this table and finding no row for the month.

First to market
Training compliance drawn on the organisation’s own care-group structure. Mandatory training is reported as a heatmap across the care groups the organisation built in its own hierarchy, so a director sees which part of the structure is behind instead of one trust-wide percentage. No other platform in this market ties the compliance view to the org structure that way. In this demonstration the figures behind the heatmap are seeded.From commvita’s own competitive assessment of this module against the systems it competes with. Our assessment, not an independent one.

The staff member’s side of this, their leave balance, their mandatory training and registration expiry, their CPD log, is one identity away in the Staff Portal. The rota a manager builds here is the rota that person sees there.

One more ceiling, plainly: the staff record integration at /esr-integration is a demonstrated surface. Snapshot, vacancy tracker, training sync and benchmarking run on seeded content and the page says so. No staff record feed is wired in this build.

Where it lives in commvita

CapabilityRouteModel / APIStatus
Week view, shifts, sign-off/rosteringAPI /rota/week · /rota · /rota/sign-off● Live
Templates, rotations, self-rostering, on-call/rosteringAPI /rota/templates · /rota/rotations · /rota/on-call● Live
Leave requests, balances, entitlements/rostering · /staff-portalAPI /rota/leave-requests · /rota/leave-balance● Live
Bank pool and agency requests/rosteringAPI /bank-staff · /rota/agency-requests● Live
Working time, rest periods, Bradford, skill mix/rosteringAPI /rota/compliance · /rota/bradford-factor · /rota/skill-mix● Live
Planned-hours and compliance tiles on the roster header/rosteringFixed values returned by /rota/eroster-kpis; fill and spend on the same strip are counted from records☉ Demonstrated
Seven-day gap forecast and backfill briefing/rosteringAPI /rota/gap-prediction · reads unfilled shifts from the live roster · deterministic fallback● Live
CHPPD computation and occupancyAPI only/safe-staffing/chppd · derived, never stored · returns no measurable ward on the demonstration data● Live
Roster to ward reconciliationAPI only/safe-staffing/phase0/reconciliation · names unresolved staff and non-ward locations● Live
CHPPD dashboard, staffing board, professional judgement, board return/safe-staffingSeeded ward content held in the page☉ Demonstrated
Live workforce position (vacancy, sickness, agency share)/workforce-intelligenceAPI /workforce/metrics · contracts, payroll, absence · prints ND with its reason● Live
Establishment and absence registerAPI only/workforce/establishment (effective dated) · /workforce/absence● Live
Planning view: turnover, time to hire, staff group gap/workforce-intelligenceSeeded, labelled on the page☉ Demonstrated
Fill heatmap, skill-mix treemap, agency reliance/workforce-visualsSeeded; control surface and accessible table are real☉ Demonstrated
Bank and agency cascade, rate cards, working-time board/bank-agencySeeded cascade and rate cards☉ Demonstrated
Contracts, cost centres, payroll runs, service line P&L/hr-financeAPI /hr/contracts · /hr/payroll-runs · /hr/service-line-pl● Live
Training compliance, care-group heatmap, audit pack/learnAPI /learn/cg-compliance · /learn/audit-pack; care-group figures are seeded in this build☉ Demonstrated
Staff record integration: snapshot, vacancies, training sync/esr-integrationSeeded content behind /esr/; no feed wired☉ Demonstrated
It isn’t an acuity tool. It isn’t an acuity instrument and it doesn’t declare a shift safe. commvita reports the establishment, the roster, the variance and the judgement recorded against them; whether a shift can run is decided by the named nurse or manager running it. It isn’t a demand model either: the seven-day gap forecast is operational planning guidance built from unfilled shifts and recent absence. It carries no medical-device claim. Non-SaMD.
© 2026 Commvita Digital Health Solutions Ltd. All rights reserved. NQB Safe Staffing 2014NHS England Safe Staffing 2019NICE SC1 Working Time Regulations 1998 · EWTDNHS Employers Agency Control Framework Agenda for ChangeNHS Long Term Workforce PlanUK GDPR Art. 30 Non-SaMD