Trades industry news, updated weekly
Business Tips

Your Price Increase Didn't Fix Your Margins — Here's Why

Maria ChenMaria Chen··11 min read

Your Price Increase Didn't Fix Your Margins — Here's Why

In 2019, I pulled the P&L of a 14-truck residential HVAC shop my firm was preparing to acquire. Eleven years in business. Revenue trending up. Owner had raised prices twice in the previous eighteen months. The blended gross margin sat around 38%, which looked fine.

Forty minutes into the job-level records, the install gross margin was closer to 19% on the jobs we could fully reconstruct. The service side was carrying the business. The install side had been a slow drain for three years. The owner didn't know.

He wasn't careless. He just didn't have job-level costing. When we built it out from his invoices and parts receipts, the problem was obvious: the price increases had gone in, but the cost structure underneath them had never been measured accurately in the first place.


The Revenue Side Fixed Itself. The Cost Side Didn't Move.

A price increase is a revenue fix. Most contractors treat it as a margin fix. Those are not the same thing.

Margin is the relationship between what you charge and what it actually costs you to do the work. When you raise prices without knowing what the work actually costs, you're adjusting a number that was never right to begin with. The top line moves. The gap doesn't close.

There's a compounding error that makes this worse: most shop owners I work with confuse markup with margin. If you're marking up labor and materials at 40% and you think that means a 40% gross margin, you're about eleven points off — a 40% markup is roughly a 29% margin. Apply a 15% price increase to a job that was already mis-marked-up and you produce a larger mis-marked-up job. The gap between what you think you're making and what you're actually making scales with your revenue.


Your Overhead Didn't Get Cheaper When Your Prices Went Up

The cost-of-doing-business calculation is the diagnostic tool I use in almost every engagement. What it does is force a shop to calculate its actual fully loaded overhead per billable hour — not a benchmark, not a national average, but the number from that shop's actual rent, insurance, vehicle costs, administrative salaries, and software subscriptions.

For shops under 25 trucks, that number is almost always higher than the owner believes. Overhead allocation is absent. The owner knows the total overhead line on the P&L. What the owner hasn't done is divide it by actual billable hours — not scheduled hours, not clock hours, but hours generating revenue.

That distinction matters because techs aren't billing every hour they're on the clock. Drive time between calls, callbacks, shop time, permit pulls on install days — these eat into the productive portion. When you don't do that division, you price your labor at a rate that doesn't cover overhead. When you raise prices without doing that division, you raise your labor rate to a number that still doesn't cover overhead.

The price increase goes in. The structural gap stays. You're not improving the margin — you're increasing the revenue the same flawed cost structure is consuming.

Commercial auto insurance is a concrete example. Starting in 2021, I watched renewal premiums hit shops I was working with hard — meaningfully higher year over year for several consecutive cycles. Real cost, real trucks. But when I asked whether they'd updated their overhead allocation when the renewals came in, the answer was almost always no. They noticed the higher premium. They didn't rerun the cost-of-doing-business model. The price increase they put in the following spring was sized against a cost basis that was already outdated before it went live.


Your Labor Burden Number Is Probably Wrong

I ran service calls for six years, four at Bayview Mechanical in Sunnyvale and two at Caldera Heating & Cooling in commercial. I watched shop owners price labor at something close to bare wage rate. Not maliciously. They knew what they paid the tech per hour, and that number went into the pricing.

What didn't go in: payroll tax, workers' comp premium, health insurance contribution, uncompensated drive time between jobs, callbacks absorbing paid labor hours with zero revenue attached, or the recruiting and onboarding cost when a tech washes out at eight months.

The fully loaded cost of keeping a tech in the field is materially higher than base wage — and that's before you account for non-billable hours. When you add drive time, shop time, callbacks, and downtime between calls, the effective cost per billable hour climbs further. In the shops I audit, the number being used to price labor is consistently lower than the number that shows up when you do the actual math. That gap is where margin disappears, and a price increase applied on top of it doesn't close the gap. It widens it at higher revenue.

The working-owner version of this is worse because it's invisible. If you're pulling 20 hours a week on tools or in a truck and you're not charging your own labor at market rate in your management P&L, your gross margin is fictitiously inflated. When you raise prices on top of that fiction, the margin improvement looks real. It isn't. You're undervaluing an input and then congratulating yourself on the output.

The fix: charge your own labor at what you'd pay a journeyman with your skills and certifications. Run that through your internal P&L regardless of what the tax return reflects. If the business isn't profitable after that adjustment, it isn't profitable. The price increase you need is larger than the one you put in.


The Flat-Rate Book Isn't Solving This

The flat-rate pricing books from the major vendors have a real value proposition: consistency. Same price, same task, every time. No tech-to-tech variation, no callbacks turning into pricing arguments. I understand why shops use them.

What they don't produce is predictable margin per ticket. That distinction matters more than almost anything else in job-level profitability.

The structural problem is that those books are built on aggregated cost assumptions — a national average truck operating cost, a regional average labor burden, a blended overhead figure. None of those numbers are your numbers. A shop in Alexandria running three-year-old vans with a high commercial auto rate in a congested metro is not the shop those averages describe. The book's price for a given task doesn't know the difference. It can't.

These books are calibrated to produce predictable ticket revenue the vendor can point to as proof of ROI. They are not calibrated to your overhead, your labor burden, or your truck cost per billable hour. When you apply a percentage bump through the book, you're scaling a number that was already wrong for your market.

The shops I've seen handle this well built their own price book from their own cost-of-doing-business model. Shops that couldn't do that used the vendor book as a floor and applied a shop-specific multiplier they recalculated annually. Both approaches require knowing your actual costs first. That's the step the book skips.


The Install That Looked Like a Win

At Atlantic Comfort Partners, my job as an ops analyst included building job-level P&Ls for shops that had never produced one. The seller would hand over QuickBooks files. Blended margin looked reasonable — 34%, 37%, sometimes higher. Then you'd match the install records against tech time logs, equipment invoices, and subcontractor bills.

The pattern was consistent across multiple acquisitions: service margins were solid, install margins were not, and the blended number was hiding the difference. Shops doing primarily residential replacement installs were often being subsidized by their own service departments without knowing it.

The SEER2 transition made this visible in real time. Equipment costs went up when the efficiency standard changed. About 60% of the independents I was talking to through that period absorbed a meaningful portion of that cost increase without fully passing it through — modest headline price increase, internal assumption that margins were holding. At the job level, they weren't. The equipment cost was sitting in the install margin as a quiet loss, invisible on the blended P&L, and invisible to anyone not tracking cost at the job level.

This is what happens any time a cost input moves faster than your pricing response. Parts costs, refrigerant, equipment surcharges — these hit the job before they hit your pricing model. A price increase applied without job-level costing is a price increase applied without knowing where the margin went in the first place.


What To Do First

Start with the last 90 days of closed installs. Pick a representative sample — not just the biggest jobs, not just the ones you remember going well. For each one, build the actual cost: equipment at invoice price, materials, tech hours at fully loaded labor burden rather than bare wage, subcontractor costs, permit fees, and an overhead allocation based on job hours. Compare that to what you charged.

If you can't run this exercise because the records aren't there — no tech hours logged by job, no job-level materials tracking — that gap is more important than whatever the numbers would have shown. You are pricing without feedback.

Second: run your truck operating cost per billable hour from your own numbers. Pull actual fuel spend for the last 12 months, actual insurance premium at renewal, actual vehicle payment or depreciation, and actual billable hours from dispatch records. Divide total vehicle cost by total billable hours. Then find the number currently embedded in your pricing and compare the two.

In the shops I work with, the embedded number is almost always lower than the actual. When it's off by a material amount per hour and you multiply that across a full year of billable hours per truck, you're looking at real unrecovered cost per truck per year — and a price increase that didn't account for it didn't fix the problem. It temporarily obscured it.

Get those two numbers right before you decide what to charge next.


FAQ

If I raised prices 15% and revenue went up but net didn't, where did the money go?

The increase went into a cost structure with incorrect assumptions, so it produced a larger version of the same problem. Most often it's untracked overhead that grew alongside revenue, or labor burden that was underestimated before and after the increase. Pull job-level actuals versus estimates on your installs from the last quarter. That's where to look — not the blended P&L, which won't show you where the gap lives.

How do I calculate my actual overhead rate per billable hour?

Add up every cost that isn't direct labor or direct materials for a 12-month period: rent, utilities, administrative salaries, software, marketing, general liability, vehicle costs, phone, uniforms, training. Divide that total by your actual billable hours for the same period from dispatch records. If you don't know this number, you're pricing by intuition. That's the math problem to fix first.

What's the right way to include my own labor in my cost structure?

Charge your field labor at what you'd pay a journeyman with your skill set and certifications. Run that through your internal management P&L in cost of goods sold. Your tax return can reflect whatever your CPA recommends for W-2 compensation — that's a separate question. Your internal pricing model needs your labor as a real cost at market value. If the business isn't profitable after that adjustment, it isn't profitable, and the price increase you need is larger than you thought.

Are flat-rate pricing books worth using?

For consistency, yes. For margin accuracy, no — not without additional work on your end. Treat the book as a floor. Recalculate your own cost-of-doing-business at least annually and apply a shop-specific multiplier based on your actual numbers. Or build your own price book from scratch. That requires more upfront work and produces numbers that are actually yours.

How do I know if my labor burden calculation is wrong?

Stack up what you're currently using against actual components: base wage, employer FICA, workers' comp premium at your state classification rate, any health insurance or retirement contribution, and a non-billable hour adjustment for drive time and callbacks. If your fully loaded number isn't materially above base wage before the non-billable adjustment, you're underestimating. Run the actual math against your last policy documents and payroll records. The difference between what you assumed and what you find is the gap your pricing has been ignoring.

What job costing records do I actually need?

At minimum: tech hours logged by job number, equipment and materials at invoice price by job, subcontractor invoices tied to the job, permit fees, and the revenue on that job's invoice. Five data points. With those you can build job-level gross margin and compare it to your target. If you're not capturing tech hours by job, that's the first gap to close — everything else can often be reconstructed from records, but time that isn't logged is gone.

Enjoyed this article?

Get articles like this in your inbox every Monday. Free, no spam.

More from The Backcharge