Method · 8 min read

Headcount and payroll: how much of the gap is people, and how much is pay

Payroll came in 20,900 under plan. That single number covers two completely different stories - a team that costs less per person, and a team that is smaller than planned - and they call for opposite conversations.

The question it answers

Payroll is headcount multiplied by average cost. Split it that way and the gap comes apart into four effects that add up to it exactly: what the average cost did, what the headcount did, positions filled without a plan, and planned positions left unfilled.

The last two are named from presence in a scenario, never from a date. A budget payroll file does not carry hire and leave dates, and inferring them would be inventing an HR fact.

Two factors, and they separate exactly

For a position present on both sides, with headcount F and average cost C, the split is two multiplications and no remainder:

The two add up to the change in payroll for that position, with nothing left over. Where a position has no headcount on one side, the average cost does not exist - it is not zero - so the whole gap sits on the headcount effect rather than on an average the tool would have made up.

The columns you need

Five, and one of them deserves a sentence of its own:

Department, cost centre, entity and grade are optional, and each one groups the reading.

What the browser reads, and what the calculation uses

These are two different things, and saying so plainly matters more than a reassuring sentence. Your browser reads the whole file - every column, every row - because that is how it works out the format and builds the table it computes on. Nothing is sent to Variance Works: there is no upload, no account and no server.

The preview can show every column in the first 20 rows. If your file carries a name, an email address or a free-text note, they appear there, on your screen.

The calculation uses the mapping you confirm, and that mapping has no dedicated field for a name or an email. That is a fact about the contract, not a barrier: every header of your file stays selectable, so a column of names picked as the position key becomes the key the calculation reports, on screen and in the workbook. What you map is your decision, and it is the decision that matters.

The automatic proposal skips the headers whose wording may indicate personal data, and names them on screen. That check is a warning, not a classification, and it is wrong in both directions. It misses what it does not recognise: a column called "Badge number" is read, shown and never flagged. It can also flag ordinary business wording: "Personnel cost" contains "person", and "Nominal grade" contains "nom". Those labels alone do not classify the columns, in either direction - the same header can hold account codes in one export and a person's name in the next. Check their contents against the minimisation guide below. Remove data that should not be in the minimised copy; manually map a flagged business field only when you have decided it belongs in that copy.

The position keys themselves are protected at three different levels:

Grouped values are not a shield. Grouping does not make a payroll extract anonymous. A small department, cost centre, entity, grade or combination of dimensions may still identify someone - a department of one identifies its only position.

What happens to the file afterwards depends on where you are. A one-off analysis keeps it in the tab's memory until you press Start over or close the tab. A temporary monthly review keeps it in the tab until you close the review or the tab. A review you asked to keep stores the original payroll file, its column headers and preview, the mapping, the results and the pack in this browser, on this device. How we handle your data covers all three.

Prepare a minimised payroll extract

Six steps, before you import anything. They take a couple of minutes and they are the only thing that decides what your browser ends up reading.

  1. Duplicate your payroll export and work on the copy, never on the original.
  2. Keep only Period, Scenario, a stable pseudonymised position key, FTE and Payroll cost.
  3. Keep the grouping dimensions you actually need, and only those: Department, Cost centre, Entity, Grade.
  4. Remove names, email addresses, direct employee identifiers, dates of birth, addresses and free-text notes.
  5. Look again at the groups you kept: check whether a very small group, or a combination of groups, still points at one person.
  6. Import that minimised copy rather than the full HR export.

The copy is minimised, and its key is pseudonymised. Neither word means anonymous, and this list does not claim to find every piece of personal data in your file - it names the ones a payroll export usually carries. There is no minimum group size here, and nothing on this page is legal advice.

What it looks like on a small extract

The sample extract has six positions across one quarter, with a budget and an actual. Budget 185,000 for 5.5 full-time equivalents, actual 164,100 for 5.3 - a gap of 20,900 under plan.

The four effects that make it up:

2,100 - 6,000 + 28,000 - 45,000 = -20,900. Exactly the gap. And the story is not "payroll is under control": it is one unfilled position carrying almost the whole variance.

Build yours

Read your own payroll

Drop a payroll extract with pseudonymised position keys and read the four effects. It all runs inside your browser: nothing is uploaded, which you can check in the Network panel while you work.

Open Headcount & Payroll

What it will not do

It makes no judgement about anyone. It compares payroll and headcount against a plan. It does not assess pay fairness, performance or staffing decisions, and that sentence stays next to the figures on screen, in the workbook and in the pack.

That is not the same as saying it can reveal nothing about a person. A position key you mapped can be a name, a department of one identifies its only holder, and both can appear on screen and in the workbook. What the tool refuses to do is judge; what your file contains stays your decision, which is why the minimised copy matters.

It infers no dates. "Filled, not planned" comes from presence in a scenario. It says nothing about when anyone joined or left.

It recommends nothing. A payroll file does not say whether someone is well paid, whether to recruit, or whether to stop.

Dates, bonuses, currency and detailed charges are outside it. The payroll cost is whatever your column contains.

Questions

What should a position key look like?

A code - POS-001, a job reference, anything stable. The tool recommends a pseudonymised key and does not force one: refusing a file would not make it more confidential, it would make it unusable.

Can a position be part-time on one side only?

Yes. Full-time equivalents are decimal, and a position that goes from 0.5 to 0.8 splits into both effects normally.

Does my file leave the browser?

No. The whole calculation runs in the page, on your machine. There is no upload, no account, and no server that could hold your figures. How to verify that in two minutes.