Why this month's payroll is not last month's
April closed at 4,551,330.00. May closed at 4,663,142.08. Somebody will ask why before Friday. The bridge below names the whole 111,812.08 in five rows, and the owned model rebuilds it every month without a spreadsheet.
◆ Two right numbers and an argumentthe question is not which is wrong.
Both months closed clean, both tie to the ledger, and the delivered reports show each one perfectly. What they do not show is the road between them. That gap gets filled by hand each month: someone exports both runs, matches workers in a spreadsheet, and produces a story that cannot be reproduced next month.
This page is about movement between two closed periods. When a closed period itself changes after the fact, that is a different mechanism with its own page, the retro restatement. The bridge here compares each month as it stands.
◆ The bridge, workedApril to May, five drivers, residual zero.
| Driver | Amount |
|---|---|
| April 2026, as closed | 4,551,330.00 |
| Five new starts, first May pay | 41,238.00 |
| Merit increases effective 1 May | 48,090.00 |
| Overtime above the April level | 14,760.22 |
| Benefit enrollments added in May | 9,120.00 |
| April leavers, final pay behind them | -1,396.14 |
| May 2026, as closed | 4,663,142.08 |
Add the five drivers to April and you land on May to the cent. The 9,841.93 that May reports as unassigned is not a driver: it is the same cost wearing no department, a classification problem, not new money. Sample values are illustrative, never client data.
◆ Where each driver is provedevery row traces to a page that already exists.
| Driver | Proved by |
|---|---|
| Five new starts | The recruiting funnel's May fills, see the time to fill report |
| Merit increases | The compensation cycle, effective 1 May, from the compensation module |
| Overtime | Hours in the overtime report, priced through payroll |
| Benefit enrollments | Employer cost in the benefit cost report |
| Leavers | Terminations in the turnover report |
A bridge is only as good as its receipts. Each driver above is not an estimate: it is the summed pay lines of a named group of workers, and each group is visible in another module of this catalog, built on the same shared tables.
◆ The owned answerthe bridge as a query, not a spreadsheet.
The build compares two periods of the payroll fact worker by worker and component by component, then classifies every non-zero difference: a worker present only in May is a start, present only in April a leaver, same worker with a higher base a merit change. The bridge assembles itself from those classifications each month.
-- May vs April, per worker and component: the raw bridge
SELECT worker_id, component,
SUM(CASE WHEN period = '2026-05' THEN amount ELSE 0 END)
- SUM(CASE WHEN period = '2026-04' THEN amount ELSE 0 END) AS delta
FROM fct_payroll_line
WHERE period IN ('2026-04','2026-05')
GROUP BY 1, 2
HAVING delta <> 0
Every delta gets a classification and every classification sums into a driver row. When the drivers stop summing to the move, the bridge fails loudly instead of hiding the residual in the biggest row.
- bridge
- An explanation that walks from one period's total to the next in named steps.
- driver
- One named cause of movement: starts, merit, overtime, enrollments, leavers.
- residual
- The part of a move the drivers fail to explain; the target is zero.
- as closed
- The period total as it stood at close, before any later restatement.
- run
- One execution of payroll for a period.
- merit increase
- A base pay raise from the compensation cycle.
- final pay
- A leaver's last, usually partial, payment.
- unassigned
- Cost whose department mapping is missing; a classification, not a driver.