Payroll software knows two things about your crew: who they are and how many hours they worked. It does not know that Tuesday's eight hours were split between a kitchen remodel and a roof tear-off. It doesn't know what a job site is at all. So the check comes out right, the taxes come out right, and the one number you actually needed — what that job cost you in labor — never exists anywhere.
For most contractors, labor is the single biggest line on a job. Getting it wrong doesn't just make a report inaccurate. It makes every bid after it wrong too, because you're pricing the next job off a cost number you never really had.
Why generic payroll can't job-cost
The problem isn't that payroll software is bad. It's that it was built to answer a different question. A payroll system asks: what do I owe this person, and what comes out for taxes? That's a per-employee, per-period question. Job costing asks: what did this job cost? That's a per-project question. The two need the same raw data — hours worked — captured at different levels of detail.
Once hours arrive as one weekly total per person, the detail is gone for good. There is no way to split 40 hours back into "18 on the Henderson remodel, 22 on the Oak Street roof" a week later. Owners try anyway, from memory, on a Sunday night. The result is a number that feels precise and isn't.
The three things project payroll needs
1. Hours captured by job, the day they happen
Not at week's end. Not from a text thread. The entry has to name the job while the crew member still remembers which job it was — a daily log where today's hours get tagged to today's job site. Everything downstream depends on this one habit, and no software fixes it if the hours arrive already merged.
2. Burdened rates, not base wage
A crew member paid $28 an hour does not cost you $28 an hour. Payroll taxes, workers' comp, and liability insurance push the real number 35–50% higher depending on your trade and state. If jobs get costed at the base wage, every job on your books looks more profitable than it is — consistently, in the same direction, which is the worst kind of error because nothing ever looks obviously wrong.
3. Overtime charged to the job that caused it
Overtime is where the split gets contentious. A crew member who hits 46 hours in a week worked those last six somewhere specific. Spreading the premium evenly across every job that week makes the easy jobs look worse and the problem job look fine. Charge the overtime to the job that ran long — it's the only version that tells you which jobs are actually eating your margin.
A worked example
Take a five-person crew across two active jobs in one week. Base wages average $28/hour; burdened, they run about $39. Total hours: 212, including 12 hours of overtime that all came from a rain delay pushing the Oak Street roof job into the weekend.
Run through generic payroll, the output is one number: roughly $8,270 in burdened labor for the week, company-wide. Split by job, it's a different story — 128 hours on the Henderson remodel ($4,992) and 84 hours on Oak Street ($3,276), with the $702 overtime premium landing on Oak Street where it belongs.
Henderson was bid with $5,200 of labor for the week, so it's fine. Oak Street was bid at $2,900 and came in at $3,978 with the premium — a 37% overrun on one week of a job that still has three weeks to run. The company-wide number never would have shown that. It would have shown a normal week.
How to set it up
- Record hours daily, tagged to a job — same day, by the person who was there. Weekly reconstruction from memory is the single biggest source of bad labor cost.
- Calculate a burdened rate per crew member once, and cost jobs at that rate. Base wage understates labor by roughly a third.
- Assign overtime to the job that caused it, not spread evenly across the week.
- Reconcile hours before the pay run, not after. Once a pay period is confirmed, fixing an entry means an adjustment instead of a correction.
- Check labor cost per job weekly, while the job is still running and the number can still change something.
This is the point of running payroll tied to the job record instead of alongside it. Pay rules — overtime, deductions, reimbursements — get configured once per company. A daily log records today's work time against a job in the same save as the day's bills and invoices, so labor lands on the project the first time instead of being sorted out later. Pay runs confirm atomically, so there's never a half-finished payroll to clean up, and the results export to Gusto, ADP, or QuickBooks CSV if your accountant wants them there. The hours end up in two places at once: on the paycheck, and on the job's profit and loss.
The check was never the hard part
Any payroll tool can pay your crew correctly. Almost none of them can tell you which job the money went to. That second number is the one that prices your next bid — and if you're rebuilding it from memory every Sunday, you're bidding off a guess.
Common questions
What does it mean to run payroll by project?
It means every hour a crew member works is recorded against the job site it was worked on, not just against the pay period. The paycheck comes out the same either way — the difference is that afterward you can say what each job cost in labor, instead of only what the whole company spent on wages that week.
Why doesn’t regular payroll software track labor by job?
Generic payroll software is built to answer one question: how much do I owe this person and how much goes to taxes. It has no concept of a job site, so hours arrive as a single weekly total per employee. That total is correct for cutting the check and useless for job costing, because there’s no way to split it back out afterward.
How do I split one crew member’s hours across two job sites in a day?
Record the hours as they happen, by job, on the day they happen — four hours at the remodel, four at the roof job — rather than reconstructing a weekly total on Friday. Same-day entry is what makes the split accurate; anything reconstructed later is a guess, and guesses tend to land on whichever job is easiest to remember.
Do I need burdened labor rates to job-cost payroll correctly?
Yes, if you want the number to be real. A crew member at $28/hour costs closer to $38–$42 once payroll taxes, workers’ comp, and insurance are added. Costing jobs at the base wage understates labor by roughly a third, which is enough to turn a job you thought made money into one that didn’t.