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.
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.
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.
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.
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.
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.
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.
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.
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.
On-call and leave are the same records the member of staff sees in their own portal.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
| Capability | Route | Model / API | Status |
|---|---|---|---|
| Week view, shifts, sign-off | /rostering | API /rota/week · /rota · /rota/sign-off | ● Live |
| Templates, rotations, self-rostering, on-call | /rostering | API /rota/templates · /rota/rotations · /rota/on-call | ● Live |
| Leave requests, balances, entitlements | /rostering · /staff-portal | API /rota/leave-requests · /rota/leave-balance | ● Live |
| Bank pool and agency requests | /rostering | API /bank-staff · /rota/agency-requests | ● Live |
| Working time, rest periods, Bradford, skill mix | /rostering | API /rota/compliance · /rota/bradford-factor · /rota/skill-mix | ● Live |
| Planned-hours and compliance tiles on the roster header | /rostering | Fixed 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 | /rostering | API /rota/gap-prediction · reads unfilled shifts from the live roster · deterministic fallback | ● Live |
| CHPPD computation and occupancy | API only | /safe-staffing/chppd · derived, never stored · returns no measurable ward on the demonstration data | ● Live |
| Roster to ward reconciliation | API only | /safe-staffing/phase0/reconciliation · names unresolved staff and non-ward locations | ● Live |
| CHPPD dashboard, staffing board, professional judgement, board return | /safe-staffing | Seeded ward content held in the page | ☉ Demonstrated |
| Live workforce position (vacancy, sickness, agency share) | /workforce-intelligence | API /workforce/metrics · contracts, payroll, absence · prints ND with its reason | ● Live |
| Establishment and absence register | API only | /workforce/establishment (effective dated) · /workforce/absence | ● Live |
| Planning view: turnover, time to hire, staff group gap | /workforce-intelligence | Seeded, labelled on the page | ☉ Demonstrated |
| Fill heatmap, skill-mix treemap, agency reliance | /workforce-visuals | Seeded; control surface and accessible table are real | ☉ Demonstrated |
| Bank and agency cascade, rate cards, working-time board | /bank-agency | Seeded cascade and rate cards | ☉ Demonstrated |
| Contracts, cost centres, payroll runs, service line P&L | /hr-finance | API /hr/contracts · /hr/payroll-runs · /hr/service-line-pl | ● Live |
| Training compliance, care-group heatmap, audit pack | /learn | API /learn/cg-compliance · /learn/audit-pack; care-group figures are seeded in this build | ☉ Demonstrated |
| Staff record integration: snapshot, vacancies, training sync | /esr-integration | Seeded content behind /esr/; no feed wired | ☉ Demonstrated |