Your Labor Burden Is Wrong and It's Wrecking Your Margins
Your Labor Burden Is Wrong and It's Wrecking Your Margins
In 2019, I pulled the P&L of a 14-truck residential HVAC shop in the mid-Atlantic that my firm was preparing to acquire. The owner had been in business for eleven years. His QuickBooks showed consistent net margins in the 18-22% range. He was proud of them, and he should have been — those numbers would have been real.
They weren't real. The shop had been losing money on every install for three years. Not a little money. Enough that the correct fully loaded margin on installs was negative 4%, which meant every time the crew rolled out to put in a system, the company was paying for the privilege. Nobody could see it because the cost structure was distributed across line items that each looked defensible on their own. Wages looked acceptable. Vehicle expense looked acceptable. Overhead looked acceptable. The problem was invisible at the line-item level and only visible in aggregate — and only if you knew to look.
The mechanism was indirect labor. Non-billable technician hours that never made it onto a job card, never got allocated back to the jobs that caused them, and sat quietly in the overhead bucket making the gross margin on every invoice look cleaner than it was.
That shop is typical.
The Math You're Missing: What Labor Burden Actually Includes
Most small contractors price labor the same way. They take the technician's hourly wage, add a rough burden percentage — I see this ranging from 25% to 35% in nearly every shop I audit — and call it done. The burden percentage covers payroll taxes, maybe workers' comp, sometimes benefits. Then they apply a markup and produce a billable rate.
The overhead allocation never makes it onto the job card. It stays up at the P&L level as a fixed monthly number, absorbed across all revenue rather than assigned to the work that generated it. Job costing done this way produces reports that are structurally optimistic. Every job looks profitable. The bank account reads differently.
Getting a technician to a job and through a job involves more hours than the ones on the invoice. The question is whether those extra hours are costed to the job or quietly buried somewhere they can't do any analytical work.
What's Actually Inside a Labor Burden Rate (And What Your Bookkeeper Is Probably Missing)
A correct labor burden calculation starts with the obvious inputs: base wages, employer-side payroll taxes (FICA, FUTA, SUTA), workers' compensation premiums, health insurance contributions, and the dollar value of any paid time off the company is actually honoring. That's the foundation.
Most shops get those. What they miss is the indirect labor layer.
Indirect labor is technician hours that are paid but not billable: drive time to and from jobs, time spent in the shop prepping materials or loading the van, callback hours on jobs that already closed, training time, time spent waiting on parts at a supply house. A tech with 2,100 paid hours in a year might log 1,550 billable hours. The other 550 hours aren't free. They're paid at the same wage rate as the billable hours. They just don't appear on any job card.
The difference between gross margin and contribution margin is where this gets expensive. Indirect labor that never gets assigned to a job collapses contribution margin while gross margin on the invoice looks clean. You're reading a number that doesn't include all the costs that produced it.
The bookkeeper categorization problem makes this worse. Most small shops have one person coding everything, often part-time, often without a construction or trades background. The path of least resistance is to code all technician wages as a single flat overhead line. That works for tax accounting. It makes your management P&L useless. The job-costed reports become unreliable, and the owner doesn't know it because the job reports and the P&L are both generated from the same misallocated data.
The Contrarian Take: Your Flat-Rate Book Isn't Fixing This
When shops realize their margins are thin, the standard industry answer is to adopt a flat-rate pricing system. Load the prices, close at the kitchen table, let the book do the math. What the flat-rate vendors won't tell you: if the labor burden feeding the formula is wrong, the flat rate is just a wrong number printed with more confidence.
I've stated my position on the flat-rate books plainly before. They're calibrated to produce predictable revenue per ticket, not predictable margin per ticket. The formula may be sound. The inputs are the problem. A flat-rate book cannot correct for indirect labor you haven't measured, because it has no way of knowing what your shop's actual non-billable hour ratio is. It uses an assumed figure that is almost certainly more favorable than your reality.
When equipment costs jumped with the SEER2 changeover, about 60% of independent shops I worked with absorbed the increase rather than repriced — partly because repricing conversations are uncomfortable, partly because the flat-rate book didn't surface the gap automatically. The book printed a number, the number felt authoritative, and the equipment cost increase quietly compressed the margin underneath it. Indirect labor works the same way. The shop absorbs the cost of non-billable hours. The flat-rate book doesn't show the gap. The margin erodes in a place the reporting system wasn't designed to find.
What This Looks Like in a Real Shop
A seven-truck residential HVAC shop in Northern Virginia — owner still on the tools Tuesday through Thursday, solid reputation, real customers. The internal P&L showed net margin in the low twenties. Eight years in business, reasonable confidence in the number.
When I rebuilt the management P&L using corrected cost allocations, actual margin was closer to 6%. The difference wasn't fraud or bad intentions. It was specific categories of cost disappearing into overhead rather than being costed to jobs.
Callbacks were one. A reversing valve callback that February took a tech 2.4 hours to diagnose and correct. It was coded as warranty and written off as a cost of quality. It didn't hit the job cost report for the original install. So the install looked profitable, and the 2.4 hours of labor cost appeared as a vague overhead expense.
Training time was another. Two techs attended NATE recertification that same month. Eight hours each, expensed as a lump sum under "professional development." The billable efficiency calculation for February looked fine, because nobody captured those hours as indirect labor against the period.
Administrative rework on a single oversized install — the system had been sized on rule-of-thumb rather than a Manual J — consumed eleven dispatcher hours over three days: rescheduling the return visit, coordinating the equipment swap, managing the customer. None of those hours appeared on a timesheet. The install job card showed a margin.
None of it hit the job cost report. All of it was real cost.
How to Calculate the Number Your Shop Actually Needs
Start with total annual compensation cost per technician: base wages, employer payroll taxes, workers' comp premium allocated per employee, health benefit contributions, and the dollar value of paid time off. That's your fully loaded annual cost for that employee.
Next, pull total paid hours for the year and separate them into billable and non-billable. Billable hours are the ones that appear on a job card and get invoiced. Non-billable includes drive time, shop time, callbacks, training, parts runs, and anything else the tech was on the clock for but that didn't produce direct revenue. Calculate your billable efficiency ratio: billable hours divided by total paid hours.
Now divide total annual compensation cost by billable hours only. Not scheduled hours. Not total paid hours. Billable hours. That ratio is the starting point for your fully loaded labor cost per billable hour. If you're running 62% billable efficiency and pricing as if you're at 80%, you're underpricing every job in the system by a calculable amount.
Then add the vehicle. Truck operating cost per billable hour is the single most underpriced line I see in residential HVAC, and I come back to it in almost every engagement. Most shops are using a number they calculated two or three years ago. Commercial auto premiums in the shops I work with have been running 14-22% annually since 2021. I check this against my own clients' renewal invoices, not an industry average. Fuel and maintenance costs have moved in the same direction. The number from your last calculation is probably wrong. Run your own, from your own invoices and your own insurance renewal.
Divide annual vehicle operating cost — insurance, fuel, maintenance, registration, and a depreciation or replacement reserve — by annual billable hours for that truck. Add it to the labor number. That is the floor for your billable rate before overhead allocation and profit.
Most shop owners, when they see this number for the first time, tell me it's higher than what they're charging.
What to Do This Week
Pull your technician hours for the last 90 days. Use whatever system you have — timesheets, your field management software, paper logs if that's what exists. Separate billable hours from total paid hours. Calculate the ratio. If you're below 65% billable efficiency and you've been pricing as if you're at 75% or 80%, every job cost report you've looked at in the last year understates your actual labor cost.
Run one completed install through a corrected burden calculation. Pick a job that closed in the last 60 days. Apply the fully loaded hourly cost using the method above: compensation cost divided by actual billable hours, plus vehicle operating cost per hour. Compare it to what the job card shows. Bring that gap to your bookkeeper and say: we need to reclassify how indirect labor gets coded, because this gap is in every job we've run this year.
One job, one comparison, one conversation with the bookkeeper. That is the week.
FAQ
My bookkeeper says our labor burden is already in the system — how do I know if it's right?
Ask one question: are indirect labor hours — callbacks, drive time, training, shop time — allocated back to individual jobs, or do they sit as a flat overhead line? If it's the latter, your job cost reports are overstating margin. Correct burden allocation requires the non-billable hours to be costed and distributed, not just the direct wages on the invoice. If your bookkeeper can't show you that allocation in the job cost report, the number in the system is incomplete regardless of what it shows.
What's a realistic billable efficiency target for a residential HVAC tech, and how do I calculate mine?
In the shops I work with, 65-72% billable efficiency is where residential service tends to stabilize once scheduling and dispatch are reasonably clean. Installs often run higher because the hours are concentrated. Calculate yours by dividing invoiced labor hours by total paid hours over 90 days. Anything below 60% in a service-heavy shop points to scheduling, dispatch, or callback problems that are costing you before pricing even enters the conversation.
Should callbacks and warranty work be included in the burden calculation or tracked separately?
Both. Track them separately — you want to see the cost of quality and identify patterns by tech, by equipment type, by install conditions. But include them in the burden calculation too, because those hours were paid and produced no billable revenue. Pulling them out of the burden math makes your labor cost look lower than it is. The shop paid for those hours. They belong in the cost structure whether the customer saw an invoice or not.
We use a flat-rate pricing book — does that mean our burden rate is already baked in?
The flat-rate book uses an assumed burden rate, not your actual burden rate. If your non-billable hour ratio, vehicle costs, and benefits structure happen to match the book's assumptions, you're fine. In my experience they rarely do, especially on vehicle costs, which have moved significantly since most of the major books were last recalibrated. Run your own number and compare it to the labor cost embedded in the book's formula. If your actual cost is higher, the book is underpricing your labor regardless of how the revenue-per-ticket looks.
How do I handle the owner's labor if I'm still on the tools three days a week?
Charge your labor to jobs at the market rate for a journeyman tech with your skill set — what you'd pay someone to do what you're doing. If you're not taking that as W-2 wages, run two P&Ls: the tax-reporting version and a management version that includes your labor at market cost. The management P&L is the one that tells you whether the business is actually profitable or whether it's profitable only because you're subsidizing it with underpriced owner labor. Most owners who discover the 6% margin problem I described earlier find at least half the gap here.
We're on ServiceTitan — can't I just pull this from the reporting suite?
The job costing tools in ServiceTitan will show you what you put in. If indirect labor hours aren't being logged against jobs — callbacks marked warranty and closed without a labor entry, training time not clocked against a cost code, drive time not captured — the reports will look clean and exclude half the costs that matter. Fix the hour separation and categorization first. Then the reporting suite gives you something worth reading.
Enjoyed this article?
Get articles like this in your inbox every Monday. Free, no spam.
