How to Reconcile Security Guard Payroll Hours Against Client Billing Every Week
The short answer: compare payroll hours and billed hours at the shift level, not the weekly total, and do it before the invoice goes out.
- Published
- October 16, 2026
- Reading time
- 7 min

The short answer: compare payroll hours and billed hours at the shift level, not the weekly total, and do it before the invoice goes out. Match each paid shift to a scheduled post and a billed line, sort every difference into a small set of named causes, and fix the causes that repeat. A weekly total can look fine while two errors cancel each other out. A shift-level match cannot hide them.
This article walks through a process you can run in a spreadsheet today. It works the same way at ten guards or a few hundred, though the effort grows with volume.
Why the totals lie
Suppose payroll shows 412 hours for a client site and the invoice bills 412 hours. It looks reconciled. But if one guard was paid for a shift that never got billed, and another shift was billed that nobody worked, the totals match while both mistakes sit there. One is lost revenue. The other is a dispute waiting to happen.
Payroll and billing also measure different things. Payroll counts hours a person worked and the rate they earned. Billing counts hours the contract says the client owes, at the rate the contract sets. These are related but not identical. Reconciliation is the work of explaining every gap between them.
Step 1: Fix the week and the cutoff
Pick one definition of the week and use it everywhere. If payroll runs Sunday to Saturday and the client invoice runs Monday to Sunday, you will chase phantom variances forever. Align them, or build the offset into your process deliberately.
Also fix a cutoff time. Decide when timesheet edits close for the week, who can change hours after that, and how late changes are recorded. A reconciliation run against data that is still moving is wasted work.
Step 2: Pull three sources, not two
Most teams compare payroll to the invoice. Add a third source: the schedule or post assignment. It is the only record of what the client expected.
- Payroll hours: guard, date, clock in, clock out, paid hours, pay category (regular, overtime, holiday).
- Billing hours: site, post, date, billed hours, bill rate, rate category.
- Schedule or post orders: site, post, required coverage window, assigned guard.
With three sources, you can tell the difference between "the guard worked but was not scheduled" and "the guard was scheduled but did not show." Those have different fixes and different owners.
Step 3: Normalize before you compare
Most false variances come from formatting and rules, not from real errors. Clean these first.
- Overnight shifts. A shift from 10 p.m. to 6 a.m. crosses midnight. Decide which date owns the shift, and apply that rule to every source.
- Unpaid breaks. If payroll deducts a meal break and billing does not (or the reverse), you will see a consistent gap on every long shift. Check what the contract says about billable breaks.
- Rounding. Payroll may round to a quarter hour while billing uses the scheduled window. Document each rule and apply it before comparing.
- Time zones and daylight saving changes. A shift that spans a clock change is a common source of an hour that appears or vanishes.
- Guard and site identifiers. If one system spells a name differently or uses a different site code, the match fails for reasons that have nothing to do with hours. Build a simple mapping table and keep it.
Step 4: Match at the shift level
Build one row per shift. Key it on site, post, date, and guard. Put payroll hours, billed hours, and scheduled hours side by side, and compute the differences.
A minimal layout looks like this:
| Site | Post | Date | Guard | Scheduled | Paid | Billed | Pay vs Bill |
|---|---|---|---|---|---|---|---|
| North Plant | Gate | Mon | A | 8 | 8 | 8 | 0 |
| North Plant | Gate | Tue | B | 8 | 9.5 | 8 | +1.5 |
| Mall | Patrol | Tue | C | 8 | 0 | 8 | -8 |
Then filter for any row where the numbers disagree. Everything else you can set aside. Your attention goes only to exceptions, which is the point.
Rows where hours match can still be wrong on rate. Add a second check: for each billed hour, confirm the bill rate matches the contract for that day type and post. Overtime and holiday hours are where rate errors cluster, because pay premiums and bill premiums rarely use the same multiplier.
Step 5: Name the variance, then assign it
Do not leave a variance as "off by 1.5 hours." Give every one a cause from a short, fixed list. A workable starting set:
- Overrun. The guard stayed past the scheduled end, often waiting for relief. Billable only if the contract or the client approves it.
- Late relief or no-show. Coverage gap. May require a replacement, a credit, or a conversation with the client.
- Unscheduled coverage. Someone worked a post that was not on the schedule. Needs approval before it can be billed.
- Edit after cutoff. A manager changed hours late.
- Rule mismatch. Break, rounding, or rate difference between payroll and billing.
- Data error. Wrong guard, wrong site, duplicate entry, missing punch.
Each cause has an owner. Overruns go to the supervisor for client approval. Missing punches go to the field manager. Rate mismatches go to whoever maintains the contract terms. A variance with no owner will still be open next week.
Step 6: Decide what bills and what does not
Not every paid hour is billable. Some are your cost of doing business: training time, travel between sites, a replacement paid at a higher rate than the contract allows. Write down which categories are absorbed and which are passed through, according to the contract. Then the decision is made once, not argued each Friday.
For anything billable but unapproved, such as an overrun, get the client's approval in writing before it appears on the invoice. A line the client first sees at invoice time is a line the client may dispute.
Step 7: Close the loop and track the causes
When the week is clean, record two things: what you corrected, and how many variances fell into each cause. After a few weeks, patterns show. If most variances come from one site, the issue is probably the post orders or the relief schedule there. If they come from late edits, the cutoff is not being respected. Fixing a cause once beats clearing the same variance fifty times.
A realistic weekly rhythm: lock data, build the shift table, review exceptions by owner, resolve or flag, then release the invoice. Keep the record so that if a client questions a line, you can show the punches, the schedule, and the approval.
FAQ
How tight should the match be? Whatever your contract and payroll rules allow. Many teams set a small tolerance for rounding and review everything beyond it. Choose a number you can defend and write it down.
Should I reconcile before or after payroll runs? Before, if you can. A correction to hours before payroll is cheaper than a correction after pay has been issued. If your timing makes that impossible, reconcile right after and track late adjustments as their own cause.
What if the client disputes hours I already billed? Go back to the shift row. The punches, the schedule, and any written approval should settle most disputes quickly. If the evidence is thin, that tells you which step in your process to tighten.
Is a spreadsheet enough? For a small operation, yes. The method matters more than the tool. As volume grows, the manual matching is usually what becomes painful, so judge any tool on whether it removes that step without hiding the variance causes.
What should I automate first? The matching and the normalization rules. Judgment calls, like whether to bill an overrun, should stay with a person.
Early access
Invoice the hours the guard actually worked
We are building the check described above for contract security firms: import the schedule and the timeclock, see every shift where they disagree, and fix it before the client invoice goes out. It is not shipping yet, and early access is open.
Early access. Not shipping yet. No charge.
