Skip to content
Salisbury CFO logoSSALISBURYCFO
Job Costing12 min read

servicetitan payroll overtime and labor cost: 3 reasons your job costing is understated

ServiceTitan tracks labor well. It cannot verify the three inputs that make job labor cost wrong: a burden rate someone typed in, overtime priced off base pay instead of the FLSA regular rate, and hours nobody allocated to a job.

Cory Salisbury
Cory Salisbury
Founder & Fractional CFO • Salisbury CFO
Former Tesla Master Technician (prior experience at SpaceX and Rivian), now a construction CFO bringing that engineering discipline to the books.
Last updated

If you run ServiceTitan with QuickBooks behind it and you still cannot answer "did we make money on that job" without a fire drill, the problem is almost never that ServiceTitan fails to track labor. It tracks labor well. The problem is three inputs it cannot verify for you: a burden rate somebody typed into a technician profile and never revisited, an overtime premium that the FLSA regular-rate rule makes larger than base pay suggests, and the hours nobody allocated to a job at all. I do construction books for a living, and those three things explain most of the distance between a job costing report that looks fine and a profit and loss statement that does not.

Start by being fair to ServiceTitan

A lot of writing in this category is quietly dishonest about what the platform already does, so let me be precise before I criticize anything.

ServiceTitan Timesheets and Performance Pay capture gross pay for payroll, support hourly and performance pay, and account for idle time and drive time. The job costing tool breaks a job into materials, equipment, purchase orders, commissions, and labor burden. There is a labor burden section listing payroll and overhead costs for technicians on an invoice. You can set pay rules so different technicians earn different rates for the same activity, and those rules feed job costing and the payroll dashboard.

That is a real capability. If you allocate every hour, and your burden rate is current, and your overtime model accounts for incentive pay, you may not have the problem in this article. Check before you assume you do. What follows is what happens in the ordinary shop where at least one of those three is not reliably true, which in my experience is most shops.

Leak 1: your burden rate is a number somebody typed in

This is the one almost nobody audits, and it is usually the biggest.

ServiceTitan help documentation is explicit that you can edit a technician burden rate in their profile. Read that carefully, because it tells you the failure mode: burden is a configured assumption, not a reconciled actual. Somebody entered it. Maybe it was carefully calculated. Maybe it was 20 percent because that felt about right during onboarding.

Since that day your health premiums renewed, your workers compensation experience modifier moved, your state unemployment rate changed, and you handed out raises. The number in the profile did not move. Every job costed since has carried a labor figure drifting further from reality each quarter, and nothing in the system raises a hand about it.

Here is the scale of what burden actually is. Bureau of Labor Statistics data for construction in Q4 2025 puts total employer compensation at $50.93 per hour worked: $35.47 in wages and $15.45 in benefits. Benefits are 30.3 percent of total compensation, which for job costing purposes is the wrong way to read it. Against base wages, that benefit load is about 43.6 percent, before you add anything specific to your shop.

Per field hourAmount
Base wage (BLS construction average)$35.47
Real benefit load (43.6% of base wage)$15.45
Burden actually configured in the profile (20%)$7.09
Understated per field hour$8.36

Run that across a crew. Forty field technicians at 1,800 job hours each is 72,000 hours, and $8.36 of understatement per hour is roughly $602,000 a year of labor cost that never lands in job margin. That is arithmetic on published national averages, not a measured client result, and your real number depends entirely on your wages, your benefit elections, and the rate currently sitting in each profile. The point is the size of the category, not that specific figure.

Leak 2: overtime costs more than base pay suggests

This one is a compliance problem and a costing problem at the same time, which is what makes it expensive twice.

Under the Fair Labor Standards Act, overtime is one and one-half times the regular rate for hours over 40 in a workweek, and the regular rate is not the base hourly wage. Department of Labor guidance is clear that nondiscretionary bonuses must be included in the regular rate. Production bonuses, safety bonuses, attendance bonuses, and similar incentive pay that technicians know about and expect all raise the regular rate, and therefore raise the overtime premium owed on every overtime hour in that period.

Performance pay is how most good trades shops compensate technicians. It is also, mechanically, the thing that pushes overtime cost above what a base-rate calculation shows.

One technician, one week with a spiffAmount
Base rate$32.00 per hour
Hours worked44
Straight-time earnings (44 x $32)$1,408.00
Nondiscretionary spiff that week$200.00
Regular rate ($1,608 divided by 44 hours)$36.55 per hour
Overtime premium owed (0.5 x $36.55 x 4 hours)$73.09
Premium if computed on base rate alone$64.00
Understated per technician per week$9.09

Nine dollars looks like nothing until you multiply it across a forty-technician crew for a year, and note that the same understatement is simultaneously a wage-and-hour exposure, not merely a costing error.

There is a second-order version that catches shops badly. When a nondiscretionary bonus covers more than the current pay period, such as a quarterly or annual incentive, Department of Labor guidance requires recalculating the regular rate across the entire period the bonus covers and paying additional overtime premium on the overtime hours worked in it. That true-up is a real payroll event. It almost never gets pushed back onto the individual jobs those hours were worked on, so it lands as a lump on the profit and loss statement with no job to explain it.

Leak 3: the hours that never land on a job

Payroll pays for every clocked hour. Job costing only carries the hours somebody allocated to a job. Everything in that gap is real money leaving your bank account.

Drive time between calls. Shop time. Staging and loading. Idle time. Training. Warranty callbacks. Rework. When those hours do not attach to a job, two things happen at once: every job looks slightly more profitable than it was, and the total gap surfaces as an unexplained variance nobody can trace to a cause. That is the precise shape of the complaint I hear most, which owners usually phrase as revenue being up while they still feel broke.

Callbacks deserve their own line. A warranty callback is paid labor, often at an inconvenient hour, attached to a job whose revenue you already recognized and whose margin you already reported. If that hour never gets charged back to the original job, the job margin in your history stays permanently wrong, so every future estimate built off that job type inherits the error. Worse, the pattern of which work generates callbacks never becomes visible, and that pattern is usually worth more than the hours themselves. It tells you which crews, which equipment lines, or which install types are quietly expensive, which is a purchasing and training decision rather than an accounting one.

The one number that exposes all three

Here is the diagnostic. It takes an afternoon the first time, and it is the most useful number most contractors have never calculated.

Take one month and compute two totals.

  1. Total labor paid. From payroll in QuickBooks: gross wages, plus employer payroll taxes, plus benefit costs, plus the overtime premium. This is what actually left the bank account for labor.
  2. Total labor allocated to jobs. From ServiceTitan job costing for the same period: every labor dollar, including burden, that landed on a job.

Subtract. The difference is labor you paid for that no job is carrying.

A shop with clean allocation and a current burden rate lands within a few percent. A shop with a stale rate and unallocated drive and callback hours can find a double-digit percentage of its labor spend sitting outside job cost entirely. Either way you now know, and because the reconciliation breaks down by cause, you know which of the three leaks is doing the damage.

How to close it, in the order that works

  1. Recompute burden from your real numbers. Employer taxes, workers compensation by class code, health and retirement contributions, paid time off, vehicle and phone allowances. Separate the costs that scale with hours from the fixed monthly costs that do not, because blending them is exactly what makes overtime hours look cheaper than they are.
  2. Set burden per role, not one blended rate. A blended rate that is right on average is wrong on nearly every individual job. An install lead and a maintenance technician do not carry the same load, and the job you are asking about was worked by one of them, not by the average of them.
  3. Model overtime on the regular rate, including incentive pay. Follow the FLSA method rather than base wage. This makes your job cost correct and your wage-and-hour position defensible at the same time.
  4. Account for unallocated hours explicitly. Drive, shop, training, callbacks, and rework either get allocated to jobs or get tracked as a named overhead category. What they must not do is silently disappear.
  5. Reconcile weekly, not at month end. Weekly, the variance is small enough to trace and early enough to change something. At month end it is history, and the only available action is explaining it.

Who actually runs this every week

The honest obstacle is not the math. The math is arithmetic. The obstacle is that the math has an owner problem.

In most shops this size the entire back office rests on one person. She knows where every number lives, she is already handling collections and permits and payroll questions, and she is the reason the place functions. Adding a weekly payroll-to-job-cost reconciliation to that list is asking for the task that gets dropped first in a busy week, then dropped permanently after the second one.

That is why this fails as a spreadsheet project. A reconciliation that only happens when somebody has a quiet Friday is not a control, it is a good intention. It also concentrates risk in the worst possible place: if the person holding the process leaves, the visibility leaves with her.

Where Top Builder AI fits

Top Builder AI is our sister brand. It installs an AI back office alongside the ServiceTitan and QuickBooks a contractor already runs, and labor cost is one of the things we build into that install.

Being straight about what that is: it is done-for-you work, not a self-serve app you sign up for tonight. It starts with a Teardown, where we run the payroll-versus-job-labor reconciliation against your actual data and hand you the number broken down by which of the three leaks is causing it. You see the size of the problem, measured on your own books, before committing to fixing anything. If it turns out your allocation is clean and your burden is current, that is a legitimate result and we will tell you so.

If the gap is real, the install builds that reconciliation as a standing weekly report against the systems you already run. Nothing gets ripped out. ServiceTitan stays your system of record for operations, your payroll provider keeps running payroll, and your technicians keep the timesheet workflow they already know. That last part matters more than it sounds, because the fastest way to make labor data worse is to ask forty technicians to learn a new way to clock in.

On the question every owner asks about AI touching the books: every figure comes from deterministic, tested arithmetic reading your live data. A language model explains a variance in plain language. It never computes one. Payroll and the general ledger are the last place a probabilistic system belongs, and any tool that cannot show you exactly which rows produced a number has no business near your books.

Find out what your labor gap actually is

Top Builder AI runs the payroll-versus-job-labor reconciliation on your own ServiceTitan and QuickBooks data and shows you the number, broken down by cause. Operator engagements start at $3,000 per month, the $8,000 install is $0 this quarter, and the guarantee is board-ready numbers in 30 days or it is free.

Book a 30-minute fit call

Sources: ServiceTitan help documentation on payroll features and the job costing tool; U.S. Bureau of Labor Statistics, Employer Costs for Employee Compensation (construction, Q4 2025); U.S. Department of Labor Wage and Hour Division Fact Sheets 56A and 56C; 29 CFR Part 778. Dollar examples marked illustrative are arithmetic on published national averages, not measured client results.

Frequently Asked Questions

Does ServiceTitan already track payroll and labor cost?
Yes, and it does it well. ServiceTitan Timesheets and Performance Pay capture hourly and performance pay and account for idle time and drive time, and the job costing view breaks a job into materials, equipment, purchase orders, commissions, and labor burden. The question is not whether it tracks labor, it is whether the labor number equals what that labor actually cost, which depends on inputs a human configures and hours a human remembers to allocate.
Where does the technician burden rate come from?
From a field someone filled in. ServiceTitan help documentation states you can edit a technician burden rate in their profile, which makes burden a configured assumption rather than a reconciled actual. If it was set during onboarding and payroll taxes, health premiums, or workers compensation rates have moved since, every job costed against that rate has carried the wrong labor number, and nothing flags the drift.
How wrong can a stale burden rate be?
Potentially by a wide margin. Bureau of Labor Statistics data for construction in Q4 2025 puts total employer compensation at 50.93 dollars per hour worked, split into 35.47 in wages and 15.45 in benefits. Benefits therefore run about 43.6 percent of base wages before anything shop-specific. A company carrying a 20 percent burden rate against a real load near 44 percent understates roughly 8 dollars per field hour, and that lands directly in reported job margin.
What is the FLSA regular rate and why does it change overtime cost?
Under the Fair Labor Standards Act, overtime is one and one-half times the regular rate for hours over 40 in a workweek, and the regular rate is not simply base hourly wage. Department of Labor guidance states nondiscretionary bonuses must be included in the regular rate. Production, safety, and attendance bonuses that technicians know about and expect all raise the regular rate, which raises the overtime premium owed.
Does a spiff really change what overtime costs?
Yes. A technician paid 32 dollars per hour who works 44 hours and earns a 200 dollar nondiscretionary spiff has straight-time compensation of 1,408 plus the 200 bonus, so the regular rate is 1,608 divided by 44 hours, about 36.55. The half-time overtime premium on 4 overtime hours is about 73.09 rather than the 64.00 a base-rate calculation produces. Small per technician per week, material across a full crew for a year.
What happens if a bonus is paid retroactively across several weeks?
The overtime math has to be reopened. Department of Labor guidance on nondiscretionary bonuses covering more than the current pay period requires recalculating the regular rate for the entire period the bonus covers and paying additional overtime premium on overtime hours worked in it. Quarterly and annual incentive programs are the common trigger, and that true-up rarely finds its way back onto the individual jobs those hours were worked on.
What is the difference between payroll hours and booked hours?
Payroll pays for every clocked hour. Job costing only carries hours somebody allocated to a job. The difference is drive time, shop time, idle time, training, warranty callbacks, and rework. Those are real payroll dollars, but if they never attach to a job they never appear in job margin, so every job looks slightly better than it was and the gap surfaces only as an unexplained variance.
How do I find my own labor gap number?
Run two totals for the same period and subtract. First, total labor dollars actually paid from payroll in QuickBooks, including employer taxes, benefits, and the overtime premium. Second, total labor dollars allocated to jobs in ServiceTitan job costing for that period. The difference is labor you paid for that no job is carrying. Most shops have never run this comparison, and the first run is usually the most uncomfortable number of the quarter.
Is this a ServiceTitan problem or a QuickBooks problem?
Neither system is broken. It is a reconciliation problem in the space between them. ServiceTitan knows the operational truth of which technician worked which job for how long. QuickBooks knows the financial truth of what those people cost after taxes, benefits, and the overtime premium. Nothing standard runs a weekly comparison, so the two truths drift apart quietly and meet at month end when the numbers are already history.
Can I just fix this by raising my burden rate?
Raising a stale rate helps, but a single blended rate still hides the variance that matters. Burden differs by role, by workers compensation class code, by benefit election, and by who is actually working overtime that week. A blended rate that is correct on average is wrong on almost every individual job, which is the specific problem when you are trying to answer whether one particular job made money.
Will AI be calculating my payroll numbers?
No. Every figure comes from deterministic, tested arithmetic reading your actual ServiceTitan and QuickBooks data. A language model is used to explain a variance in plain language, never to compute one. Payroll and the general ledger are the last place a probabilistic system belongs, and any tool that cannot tell you exactly which rows produced a number does not belong near your books.
Do you replace ServiceTitan or my payroll provider?
No. ServiceTitan stays your system of record for operations and your payroll provider keeps running payroll. The reconciliation layer reads both and reports the difference. Nothing gets ripped out, your technicians keep using the app they already know, and no crew has to learn a new timesheet workflow to get an accurate labor number.
What does it cost to have this built?
Engagements start with a paid Teardown that measures your actual labor gap against your own data before anything is built, so you see the size of the problem before committing to a fix. The ongoing Operator engagement starts at 3,000 dollars per month and the 8,000 dollar install is waived to zero this quarter. The guarantee is board-ready numbers in 30 days or it is free.