Your Material Markup Is a Habit — Not a Margin Strategy
Your Material Markup Is a Habit — Not a Margin Strategy
In 2019, I pulled the P&L of a 14-truck residential HVAC shop my firm was evaluating for acquisition. The owner had been in business for eleven years. He knew his service agreement count, his close rate on diagnostic calls, his average ticket. He was proud of his markup — a consistent 30% on materials across the board, equipment included. The numbers looked fine at the ticket level.
He had been losing money on every install for three years. Not bleeding out. Just quietly, steadily wrong. The flat markup on equipment produced a number that felt like margin without being margin. Nobody had ever separated the labor from the materials and run the math on each side independently. When we did, the install gross margin on labor alone was negative.
He was not an outlier. In the acquisitions I ran at Atlantic Comfort Partners, this was the pattern — not the exception.
The Markup Isn't the Margin: Why a Flat Percentage Fails at Both Ends
Markup is calculated on cost. Margin is calculated on revenue. If you buy a part for $100 and mark it up 30%, you sell it for $130 and your gross margin is 23%, not 30%. Across a full year of installs, the gap between 23% and 30% is often the difference between a profitable shop and one that's funding operations with the owner's forgone salary.
The flat percentage also fails differently at each end of the cost spectrum. On cheap consumables it bleeds you quietly. On expensive equipment it lets the ticket carry bad labor math. A single markup figure won't fix both directions, because the problems aren't the same problem.
Most shops I've seen carry an inherited markup number — 30%, 40% — that survived not because it was validated, but because the invoices kept going out and the bank account stayed positive enough.
The Low-Cost End: Where Consumables Bleed You Quietly
When I was running service calls out of a Sprinter at Bayview Mechanical in Sunnyvale, the small-parts problem was tactile. A multi-repair diagnostic call might have a parts list totaling $34 in cost — wire nuts, a contactor, a pound of refrigerant, a 24-volt transformer. At 30% markup, that's $44.20 billed, $10.20 in materials gross profit. Forty minutes of pulling, staging, invoicing, and entering line items.
That $10.20 is supposed to represent the margin on materials handling. It does not.
The handling cost per line item is nearly fixed regardless of part price. A $4 part and a $40 part take the same technician and CSR time to manage. A flat percentage ignores this. On consumables under $20, you are almost certainly collecting less in materials gross profit than you are spending to handle them — the overhead math makes it close to unavoidable.
This doesn't mean you stop selling small parts. It means consumables under $50 need a recovery rate calibrated to handling cost, not to a percentage of an already-low number.
A flat markup on a $4 part produces a number that feels like margin until you run the overhead allocation against it.
The High-Cost End: Letting the Equipment Ticket Carry the Job
On a $4,800 condensing unit, 30% markup produces $1,440 in materials gross profit. That looks like the job is covered. So the install labor estimate gets written loosely — five hours when the real number, with startup and verification, is closer to seven — and nobody worries because the equipment ticket will absorb it.
This is what I watched inside Atlantic Comfort Partners, across roughly thirty shop acquisitions over two years. Independent shops systematically inflated combined install margin by letting equipment revenue subsidize underpriced labor. A shop would show 38% combined gross margin on installs. Separate the labor and materials, price the labor at market cost, and the actual install margin was closer to 19%. The equipment markup was doing work the labor rate should have been doing.
This is also where Manual J connects. Most residential installs in existing homes are sized by rule of thumb rather than heat load calculation — I've seen this in audits, I've seen it in the field, and the callback pattern on first and second seasons confirms it. Oversized equipment means longer line sets, more refrigerant, higher equipment cost, and higher callback exposure. When the equipment ticket is already carrying loose labor math, oversizing compounds the loss. The P&L shows thin margin on the job. You write it off as a difficult install and move on.
The labor on an install is not a rounding error. Price it separately, with its own margin target, every time.
The Flat-Rate Price Books Aren't Fixing This — They're Hiding It
The flat-rate pricing books produce consistent revenue per ticket. What they don't produce is consistent margin per ticket — they bundle the materials-versus-labor confusion into a single number that looks clean until you pull it apart by job type.
The vendors who sell these books operate on annual renewal revenue. The price book is calibrated to that model. It doesn't account for your overhead allocation, your supplier terms, or your diagnostic error rate by product category.
One thing it definitely doesn't account for: your days sales outstanding. If your supplier terms are net-30 but your average install ticket with a GreenSky or Synchrony settlement runs 45 days, you are floating the materials cost for 15 days out of operating cash. That carrying cost is real. It's not in the flat markup and it's not in the price book. It shows up as a slightly tighter cash position at month-end and you file it under "slow week."
Know your DSO. It changes the equipment markup math more than most shop owners expect.
What a Materials Margin Structure Actually Looks Like
The cost-of-doing-business template I use in my engagements breaks materials into three bands, each with different margin logic.
Consumables under roughly $50 — wire, fittings, capacitors, refrigerant by the pound — need a recovery rate that floors at the handling cost. In practice that often means a minimum dollar margin per line item rather than a percentage. The percentage that achieves adequate recovery on a $4 part can look startling, which is why shops resist it. Run the overhead math first. The number will make sense.
Mid-range parts — motors, boards, TXVs, metering devices — are where percentage markup works reasonably well, provided you've set it against your actual overhead allocation rather than an inherited figure. Most shops are closest to functional here.
High-cost equipment — condensing units, air handlers, furnaces — needs markup that accounts for return risk and carrying cost. At Caldera, a tech returned a $1,100 ECM motor after a misdiagnosis. The restocking fee came to $85. A second truck roll at fully-loaded cost ran about $160. The correct diagnosis and reinstallation added another $95 in tech time. Total unrecovered cost: roughly $340, which hit no line item and was absorbed into overhead.
That is one return event. Price the average job to carry its proportional share of that risk. The math is not complicated once you know your diagnostic error rate by product category.
Labor margin stays separate. Always. The moment equipment revenue subsidizes labor recovery, you've lost the ability to see whether the install business is profitable on its own — and the 14-truck shop from 2019 is what that looks like three years later.
What to Run Before Friday
Pull one week of invoices. Separate materials revenue from labor revenue on each ticket and calculate gross margin on each independently. Do not combine them — the combination is where the problem hides.
Take your two highest-ticket equipment installs from that week. Run labor gross margin in isolation: what did you charge, what did it actually cost including burden and overhead allocation, what's left. Then take your smallest-dollar consumable-heavy tickets from the same week and run the handling math: overhead allocation per hour, time spent managing small parts, markup collected.
If your invoices don't have materials and labor broken out — which I see regularly in shops under 15 trucks — start simpler. Pull three invoices. Rebuild the cost side manually. Find the gap between the markup you intended and what was actually applied.
The one number worth finding first: on your last five installs, what was your labor gross margin percentage, isolated from equipment? If you can answer it, you know something real about your business. If you can't, that's where to start. The tier structure, the carrying cost adjustment, the return risk allocation — all of it depends on first knowing whether the labor is covering itself.
In my experience working through this with shop owners, the answer the first time is usually no.
FAQ
I've been using 30% markup on everything for six years and my shop is profitable. Why change it?
Profitable and structurally sound are different things. If 30% flat markup has worked, one of these is probably true: your labor pricing is compensating for the materials gap, equipment ticket volume is masking the consumables bleed, or your supplier terms are unusually favorable. The problem is you likely don't know which one. When labor costs rise — and in most metros, they've risen significantly since 2021 — whichever cushion was hiding the materials problem shrinks. The shops I've seen absorb that hit without adjusting were the ones that didn't know where their margin was actually coming from.
Is there an industry-standard markup for equipment versus consumables?
No. Anyone offering you a universal benchmark is selling you their overhead structure, not yours. What I can tell you from the shops I've worked through is that consumables under $50 almost always need a higher markup percentage than shops apply, and high-cost equipment markup needs a return-risk component that flat-rate books don't include. Build from your own overhead allocation, your actual supplier terms, and your real DSO.
How do I separate labor from materials if I've been writing combined flat-rate tickets?
Start with the next job. Build your invoice template to have two sections: materials with individual line items and a subtotal, labor with hours, rate, and a subtotal. In ServiceTitan or Jobber, this is a template configuration — your CSR or the software admin can set it up in an afternoon. On historical tickets, rebuild a sample of ten to fifteen manually to understand the pattern. You don't need to restate your full history. Forward visibility is the goal.
What does carrying cost mean here, and how do I calculate it?
It's the cost of having your money tied up in materials between when you pay your supplier and when the customer pays you. If your supplier terms are net-30 and your average install ticket — especially with a financing partner's settlement timeline in the picture — closes at 45 days, you've floated the materials cost for 15 days out of operating cash. Annualized at your line-of-credit rate, it's small on one ticket. Across a full install season it's real. Find your actual DSO and run it against your equipment markup to see whether you're recovering that float.
Should I raise my consumables markup right away?
Run the math before you move the number. Calculate your overhead allocation per billable hour, estimate the handling time per small-parts line item, and find the minimum dollar margin you need to recover that cost. In some cases 60% markup gets you there. In others you need a flat minimum-dollar floor per line item. The answer is specific to your shop. Picking a new number because it sounds better is how you end up with a different habit instead of an actual structure.
What if customers push back on higher materials pricing?
Residential customers rarely compare the materials line against a competitor's quote. They compare total ticket price. If your total ticket is competitive and your labor is priced correctly, the internal split between materials and labor is largely invisible. Pushback on equipment cost happens when the unit price is Googleable — which is a quoting-presentation problem, not a markup problem. The shops I've seen lose jobs on price were losing on labor rate transparency or close rate, not on what they charged for a contactor.
Enjoyed this article?
Get articles like this in your inbox every Monday. Free, no spam.
