Your Gross Margin Is Wrong — You're Miscategorizing Costs
Your Gross Margin Is Wrong — You're Miscategorizing Costs
In 2019, I was part of a due diligence team reviewing a 14-truck residential HVAC shop in the mid-Atlantic. The owner was sharp, his customers liked him, his revenue had grown three years running. His P&L showed gross margin in the high 30s.
We rebuilt the P&L from the job level up. His actual gross margin was in the low 20s. He had been losing money on every install for three years and had no idea.
That is a cost categorization problem, not a careless owner. It starts at the gross margin line before you ever get to pricing.
The Number You're Trusting Is Wrong Before You Touch a Spreadsheet
Gross margin is supposed to tell you what the business earns from its core work before fixed overhead consumes it. Revenue minus cost of goods sold, divided by revenue. What most small shops actually calculate is revenue minus whatever the bookkeeper filed under "job cost" — which may or may not include the real costs of producing the job.
The confusion starts with markup versus margin. A shop marks up equipment 30% and calls that its margin. These are not the same number. Markup is calculated on cost; margin is calculated on price. A 30% markup produces roughly 23% gross margin. When a shop owner tells me he runs 40% margins, I ask whether that's on cost or on revenue. The answer tells me whether the P&L is worth reading.
But markup versus margin is the surface problem. The deeper issue is that the COGS line is missing costs that belong there, so the gross margin percentage is wrong before the owner touches a pricing spreadsheet.
What Belongs Above the Gross Profit Line
The gross profit line separates job-direct costs from period overhead. Job-direct costs are incurred because you ran a specific job — they scale with volume and attach to that work. Period overhead is what you pay whether the truck leaves the lot or not: rent, software subscriptions, the office manager's salary.
Two categories are miscategorized in every shop I audit.
Technician labor burden. The base wage goes above the line. The burden does not. Workers' comp premiums, the employer share of FICA, FUTA and SUTA, and health insurance contributions get filed under operating expense because that's where the payroll processor drops them. But those costs exist because the technician ran a job. They are job-direct. If you're pricing a service call using base wage as your labor cost, you're missing a real portion of what that labor actually costs — pull your policy documents and your payroll processor's burden summary and add the lines yourself.
Truck operating cost per billable hour. Most shops either omit vehicle cost from COGS entirely or apply a composite figure from a pricing guide. Your insurance rate is not the national average. Your fuel consumption is not the national average. Your maintenance costs are not the national average, because your fleet is a specific age with a specific service history in a specific climate. In the mid-Atlantic engagements I've run since 2021, commercial auto premiums have moved significantly — the shops whose pricing still reflects 2020 assumptions are carrying that gap inside COGS, invisibly.
Permit and subcontractor fees belong above the line as well. If you pulled a permit for a job, that cost exists because of that job.
The COGS line doesn't just feed your gross margin percentage — it feeds every pricing decision you'll make this year. If it's wrong once, it's wrong at scale.
The Flat-Rate Book Problem
The major flat-rate pricing vendors sell their product as a margin management tool. It is not. It is a revenue consistency tool — which matters, but it is a different and less useful thing for the purpose of knowing whether you made money on a specific job.
Flat-rate books produce predictable revenue per ticket. They do not produce predictable margin per ticket, because margin depends on your actual costs, and the books are built on averages. The labor rate embedded in the book's pricing reflects an assumed burden rate. If your actual burden rate is higher — and in the shops I've audited recently, it usually is — you're systematically underpricing every flat-rate job without a mechanism to see it.
Commercial auto insurance since 2021 is a clear example. If your flat-rate book was last calibrated before those increases hit, the labor price it generates isn't covering your actual truck cost. The vendor's incentive is to sell the book and renew the subscription, not to rebuild your cost assumptions annually. The book bundles labor and materials into a single ticket price without surfacing the underlying cost structure, so there's no line on the invoice showing you the gap.
When a shop prices from a flat-rate book and also carries a miscategorized COGS line, the errors compound. The book obscures the cost problem; the P&L doesn't surface it either. Revenue looks fine. Margin bleeds quietly.
I'm not saying the books are useless. They are not a substitute for knowing your actual costs, and most shops buy them as if they are.
What I Found When I Rebuilt the P&L
Back to that 2019 audit. Stated gross margin in the high 30s. On paper, the shop was generating enough gross profit to cover overhead and produce a modest net.
The problem emerged when we rebuilt job cost from the shop's own data.
Technician burden had been filed entirely under operating expense — workers' comp, payroll taxes, health insurance contributions, all of it. When we moved those costs above the gross profit line and allocated them by technician hour, the labor cost per job increased substantially. Truck operating cost was being handled with a composite figure from the pricing guide. We pulled 12 months of actual fuel receipts, insurance invoices, registration fees, and maintenance records for each vehicle, then divided by the shop's billable hours per truck. The resulting cost per billable hour was well above what the composite assumed.
When both corrections were applied, gross margin dropped from the high 30s to the low 20s. The shop's SG&A ran at roughly 24% of revenue. At 38% gross margin, the owner thought he had 14 points of cushion before breakeven. At 22%, he was operating below breakeven on the install side.
His reaction: finally, a number I can do something with.
The 38% had felt real because it was consistent. The 22% was real, and real is what you can price from.
How to Rebuild Your COGS Line
You do not need a new accountant. You need a clearer classification framework and then a check against your actual payroll and fleet records.
On labor burden: Start with your technician's base hourly wage. Add the employer FICA share — 7.65% on wages up to the Social Security wage base. Add FUTA and SUTA, which vary by state and by your unemployment history; pull your state's current rate schedule rather than estimating. Add workers' comp — pull your policy and find your HVAC installation classification rate, then apply your experience modification factor. Add your health insurance contribution per employee per hour worked. Add paid time off as a percentage of wages, because you're paying a technician to not produce billable hours.
Then divide the total annual burden cost by actual billable hours, not scheduled hours. A technician on the books for 2,080 hours is not billing 2,080 hours — drive time, callbacks, shop time, and training pull that number down. You need your actual dispatch records to find the real figure.
On truck cost: Pull 12 months of actual data per vehicle. Every fuel receipt, insurance invoice, registration fee, oil change, tire, and repair. Divide by that truck's billable hours for the same period. If you don't track billable hours by truck, start there first — the rest of the calculation needs that denominator.
Both numbers belong in your job cost template as line items above the gross profit line. They are the direct cost of running a job, not overhead.
What to Do Monday Morning
Step one: Pull the last three months of operating expenses. Go through every line and mark each one job-direct or period overhead. Technician wages, payroll taxes, workers' comp premiums, fuel, vehicle insurance, vehicle maintenance — those are job-direct. Circle them. This sort alone shows where the misclassification is largest.
Step two: Pick one completed install from the last 30 days. Build a corrected job cost sheet using your actual burden rate and actual truck cost per hour — rough estimates beat the composite your current P&L uses. Compare that job's real contribution margin to what the P&L shows for the same period.
Step three: Take the circled items from step one and the corrected job cost from step two to your bookkeeper. Ask her to reclassify the job-direct items above the gross profit line going forward. This is a chart-of-accounts change, not a new accounting system.
Your gross margin will go down. That is not bad news. It is accurate news.
FAQ
What's the difference between gross margin and contribution margin, and does it matter which one I use?
Gross margin is revenue minus cost of goods sold, divided by revenue. Contribution margin is revenue minus variable costs only — costs that change directly with each unit of production. For most residential service shops, the practical difference is how you treat semi-variable costs like technician wages. Gross margin is the more useful number for P&L management and SG&A coverage analysis. Contribution margin helps with break-even math on specific jobs. Fix gross margin first.
My accountant set up my P&L and she's a CPA — why would her categories be wrong for running my business?
She set up the P&L for tax compliance and financial reporting. The IRS does not care whether your workers' comp premium is above or below the gross profit line. Your pricing decisions do. A CPA's default chart of accounts is calibrated to produce an accurate tax return, not to tell you whether you made money on a specific install. The books can be technically correct for their intended purpose and still mislead you on job profitability.
If I move technician burden above the gross profit line, my gross margin is going to look terrible. Is that actually better?
Yes. A lower gross margin that reflects real costs is better than a higher number that doesn't. If your corrected gross margin is 22% and your SG&A runs 26% of revenue, you now know you have a pricing problem and roughly how large it is. If your stated gross margin is 38% and the real number is 22%, you have the same pricing problem — you just can't measure it or price your way out of it.
How do I calculate a labor burden rate if my workers' comp and health insurance costs change every year?
Recalculate it every time your policy renews. Build a spreadsheet: base wage at the top, then each burden component as a percentage or fixed dollar amount per hour. When your workers' comp audit comes back, update the rate. When health insurance renews, update the contribution. The number moves, and that's fine. What you want to avoid is using a rate that was accurate in 2021 to price jobs today.
I use a flat-rate pricing book and my close rates are good — why isn't that enough to know whether I'm profitable?
Close rate measures sales performance, not margin. You can close 80% of your calls and lose money on each one if the price doesn't cover your actual costs. The flat-rate book generates a price based on assumptions about your cost structure that may not match your shop. Good close rates tell you customers are buying. They don't tell you what you're making when they do.
What gross margin should a residential HVAC shop target once the COGS line is correctly built?
I'm not going to give you a benchmark number without knowing your market, your fleet age, your benefit structure, and your equipment mix — any number I gave you here would be the same kind of composite fiction the pricing guides use. What I can tell you is this: once you've correctly categorized burden, truck cost, permits, and subs above the line, run that corrected gross margin against your actual SG&A. If corrected gross margin minus SG&A is negative, you have a pricing gap. The size of that gap is your repricing target, and the corrected P&L is the only place you'll find it.
Enjoyed this article?
Get articles like this in your inbox every Monday. Free, no spam.
