Back to Blog
developmentOctober 6, 20268 min read

Guard Payroll Hours vs. Client Billed Hours: How to Find the Gap Every Month

The short answer: reconcile one shift at a time, not by comparing totals.

Saidul Islam

Author

Guard Payroll Hours vs. Client Billed Hours: How to Find the Gap Every Month

Guard Payroll Hours vs. Client Billed Hours: How to Find the Gap Every Month

The short answer: reconcile one shift at a time, not by comparing totals. Give every worked shift its own row with four numbers: scheduled, clocked, paid and billed. Cut payroll and billing at the same date boundary. Then give every difference a reason code. A gap in the totals only shows that something is wrong. The shift rows show which hours you can still invoice, which hours your contract says you absorb, and which hours are plain errors. Once this setup exists, the monthly work is mostly reviewing exceptions instead of rebuilding a spreadsheet from scratch.

The rest of this article covers how to set it up and what to look for.

Why the totals never match

In contract security, paid hours and billed hours drift apart for structural reasons. That is normal, and expecting them to match exactly leads to bad conclusions. The usual causes are:

  • Holdovers. A relief guard is late, so the outgoing guard stays two extra hours. You pay those hours, often at an overtime rate. Whether you can bill them depends on the contract.
  • Training and orientation. A new guard shadows a post for a shift. Payroll records the hours. Many contracts do not allow you to bill them.
  • Supervisor coverage. A field supervisor fills an open shift. The hours land on a salaried or differently coded employee and sometimes never reach the invoice.
  • Rounding and breaks. The time clock rounds one way, the invoice uses scheduled hours, and paid or unpaid meal periods are treated differently on each side.
  • Period mismatch. Payroll often runs weekly or biweekly while invoices go out monthly. An overnight shift that starts on the 31st and ends on the 1st can land in different periods on each side.
  • Rate events. Holiday shifts, short notice requests and added posts may carry a different bill rate, and nobody updates the invoice.
  • Late edits. A timecard gets corrected after the invoice has already gone out.

Some of these are revenue you are owed. Others are costs you agreed to absorb. You cannot sort one from the other by looking at a monthly total.

The four numbers every shift needs

Every worked shift should carry these values:

  1. Scheduled hours: what the post schedule called for.
  2. Clocked hours: what the guard actually punched.
  3. Paid hours: what went to payroll, including any overtime split.
  4. Billed hours: what appeared on the client invoice for that post and date.

The key that ties them together is client, site, post, date and shift. Guard name alone is not enough, because one guard can work several posts in a week and one post can be covered by several guards in a day.

Step 1: Cut both periods at the same boundary

Choose a single reconciliation period, usually the billing month. Then pull payroll by shift date, not by pay date. When a shift crosses midnight at the period boundary, either split it at midnight or assign it to its start date. Which rule you pick matters less than applying the same rule on both sides every month. Many monthly "gaps" are just shifts that one system counted in this month and the other counted in the next.

Step 2: Build one row per shift

Export the schedule, the time clock data, the payroll register and the invoice detail. Join them on the shift key. You will end up with three kinds of rows:

  • Rows that appear in all four sources (most of them, ideally).
  • Rows that were paid but not billed.
  • Rows that were billed but not paid.

The last two groups are where the money is. If your invoice only shows a monthly lump sum per post, rebuild the billed side from the contract coverage (for example, one guard, 24 hours a day, for every day in the month). That gives you an expected billed number for each shift.

Step 3: Calculate two gaps, not one

Most teams compare hours and stop there. That misses half the problem.

  • The hours gap: paid hours minus billed hours, per shift.
  • The premium gap: the overtime or holiday pay premium you paid, compared with any premium you billed.

Paid and billed hours can match exactly while your margin on a post is quietly shrinking. If 40 of a post's hours went through payroll as overtime because of a scheduling problem, and the client pays straight time, the hours reconcile perfectly and the margin does not. Track both numbers.

Step 4: Give every variance a reason code

Each row with a gap gets one code. Keep the list short enough that people actually use it:

  • BILLABLE, NOT BILLED: extra coverage the client requested or the contract allows. Recover it.
  • NON-BILLABLE BY CONTRACT: training, a holdover the contract does not cover, supervisor overlap. Accept it, but track it.
  • BILLED, NOT PAID: a missed punch, a no-show that was invoiced anyway, or a payroll error. Investigate immediately. This is a client credit risk and possibly an underpaid guard.
  • TIMING: the shift belongs to the other period. Carry it forward and confirm it clears next month.
  • DATA ERROR: wrong post code, duplicate punch, keying mistake. Fix it at the source.

When a variance has no code, the month is not closed.

Step 5: Recover, accept, or fix upstream

The reason codes tell you what to do next.

Recover billable hours with backup the client can check: the date, post, hours, the reason, and who approved the extra coverage. Clients dispute vague line items. They rarely dispute a specific shift with an approval attached.

For non-billable hours, the useful question is whether they keep coming back. Two training shifts a month at a site with high turnover is a pricing input for the next renewal, not a reconciliation problem.

For anything billed but not paid, fix it before the client finds it. Being the vendor who catches its own invoice errors builds trust you cannot get any other way.

A worked example (hypothetical)

Take one post with 24 hour coverage in a 30 day month. Contract coverage is 720 hours. Payroll shows 741 paid hours for that post. The total says the gap is 21 hours. At the shift level:

  • 8 hours: a new guard's orientation shift. Non-billable by contract.
  • 6 hours: three holdovers of 2 hours each when relief arrived late. Non-billable, and paid at overtime.
  • 4 hours: the client asked for extra coverage during a delivery window and a site manager approved it by email. Billable, not billed.
  • 3 hours: an overnight shift on the last night of the month, counted in this month by payroll and in the next month by billing. Timing.

The outcome: 4 hours to invoice now, 3 hours to confirm next month, and 14 hours of real cost. The 6 holdover hours also tell you the relief schedule at this post needs attention. The total of 21 hours told you none of this.

What to watch over time

After a few months, look at trends by site and by reason code instead of individual shifts:

  • Non-billable hours as a share of paid hours, per site.
  • How often billable hours are missed, and who approves extra coverage.
  • Holdover frequency by post and by time of day.
  • Billed but not paid occurrences (this number should stay near zero).

These trends are what you take into contract renewals, scheduling changes and staffing conversations.

FAQ

Should paid hours and billed hours ever match exactly? Rarely, and that is fine. The goal is not zero difference. The goal is that every hour of difference has a reason you agree with.

How often should this run? At least once per billing period, before the invoice goes out if you can manage it. A weekly pass on the paid but not billed rows catches recoverable hours while the approvals are still easy to find.

Who should own it? One named person, usually in billing or operations finance, with a site manager signing off on reason codes for their posts. When a reconciliation is shared by everyone, nobody actually does it.

Is a spreadsheet good enough? For a small number of posts, yes, as long as the shift key and reason codes stay consistent from month to month. The method matters more than the tool. Once the joins take longer than the review, it is time to automate the data pull.

What if the client invoice is a flat monthly amount? Rebuild the expected billed hours from the contract coverage terms and reconcile against those. Flat billing hides the gap. It does not remove it.

Free tool

Get The 2026 Developer Tool Stack

One PDF with the tool worth switching to in every category, terminal, CLI, editor AI, API testing, database GUI, and more, with the honest reason why. Privacy-first picks flagged.

Free PDF. No spam. Unsubscribe anytime.