A packed schedule does not always mean you are making money. I have seen too many HVAC and plumbing shops stay slammed with calls and installs while the bank account tells a different story. Usually the cause is job pricing built on half-baked cost numbers, outdated markups, or plain guesses about labor.
The pattern is almost always the same. Costs moved and pricing did not. Equipment prices climbed. Fuel climbed. Payroll pressure climbed. A lot of shops are still pricing from assumptions they set years ago, and that gap quietly eats gross profit.
I worked with a client last year whose gross profit was bouncing around the high 30s and low 40s. We spent months tightening pricing discipline and watching how equipment was being marked up. His GP improved by 6 points. In an $8 million shop that is not a rounding error, because the improvement drops straight to the bottom line.
The worst version of this I have seen was an HVAC company whose service department was losing about $250,000 a year and nobody knew. Installation revenue was large enough to cover the hole, so the company looked fine at the top. Service pricing had not been touched since before COVID. What exposed it was not a pricing review, it was reporting: once the bookkeeper split the business into classes and business units, the first P&L by department made the loss obvious. The pricing fix came after that, and the turnaround was quick once they could see it.
Here is how I walk an owner through pricing a job so the number holds up. Danielle Putnam put the whole problem in an episode title that is hard to improve on: most contractors price themselves broke without realizing it.
Start with numbers you can trust
If the underlying numbers are a mess, the pricing will be too. Before you work out labor rates or set a markup on materials, your books have to be telling the truth.
At a minimum that means transactions coded where they belong, cash accounts tied to the statements, receivables and payables that reflect who actually owes what, inventory that matches the shelves and the trucks, deposits and deferred revenue posted correctly, and payroll landing in the right periods.
If you are in QuickBooks, watch Undeposited Funds. It is meant to be a holding spot on the way to a deposit, and when payments get stuck there your cash, revenue and deposit numbers all go sideways at once. Getting the accounting structure right comes before any of this pricing work.
Practical rule: do not build a pricing model you intend to trust until you are confident in the cost data underneath it.
Know what an hour actually costs you
Owners price off what they pay a technician per hour and forget everything else. That is the fastest way to underprice work.
The loaded cost of a technician includes payroll taxes, benefits, workers’ comp, paid time off, training and meetings, drive time, shop time fetching materials, callbacks and warranty work, and the vehicle and fuel that go with the job. Then there is the other half of the problem: you pay for 40 hours and bill far fewer.
A quick version. Say the wage is $30 an hour, taxes and benefits add $9, and vehicle, fuel and workers’ comp add $11. That is $50 per paid hour. Pay for 40 hours, bill 30 after drive time, meetings, supply runs and warranty work, and your break-even is $2,000 divided by 30, or $66.67 per billable hour. A shop charging $50 is under-recovering labor before overhead and profit are even in the conversation.
Utilization moves the rate more than owners expect. I built a model with an electrical contractor where the business needed roughly $296 an hour at 55 percent billable utilization to hit its profit target. Drop utilization to 40 percent and the same business, with the same costs and the same target, needed about $30 an hour more. Nothing about the cost structure changed. Only how much of the paid day got billed.
I went through the full calculation, including how to work out your own billable hour percentage, in how to know if your technicians are profitable. Get that number from your own payroll before you use it in a price.
Capture every direct cost, not just the equipment
The equipment line is the obvious one. The costs that erode margin are the ones nobody writes down.
- Equipment and parts
- Consumables such as pipe dope, tape and fasteners
- Permits
- Subcontractors
- Freight, delivery and disposal
- Expected waste and scrap
- Equipment rental
- Special order and expedite charges
Job coding decides whether any of this is visible. If technicians buy parts and those purchases land in a general expense account, job profitability looks better than it is, and you will price the next one off a number that was never true.
Keep material pricing current. If supplier costs creep and the estimating sheet does not, margin shrinks before anyone notices what happened.
Overhead has to land somewhere
Labor and materials are not the whole price. Office payroll, rent, insurance, software, phones, recruiting, fleet, small tools, bookkeeping and legal, marketing, licensing: all of it has to be carried by the work you sell. That includes whatever you pay yourself to run the place.
You do not need an academic allocation method. You need one method, applied consistently. Most contractors allocate on labor hours, labor dollars, revenue, or job type. What matters is matching the method to how the business actually consumes resources. A full system replacement with project management, permits, financing and several truck rolls should not carry the same overhead as a 45-minute service call.
How much overhead you should be recovering, and what a healthy overhead percentage looks like by revenue band, is covered in HVAC profit margins: what good actually looks like.
Practical rule: if the price only covers technician time and parts, it is not covering the business that makes the job possible. Treasure Boston says it more directly than I would: stop copying competitor pricing and dig into your own overhead.
Markup and margin are not the same thing
This is the one that costs owners the most money, and it is pure arithmetic.
Markup is what you add on top of your cost. Margin is what is left of the selling price after the job cost is covered. Put a 25 percent markup on a job and you do not walk away with a 25 percent margin. You walk away with 20.
Here is the conversion, running the direction that matters when you are setting a price:
| Gross margin you want | Markup you have to apply | On $1,000 of cost, you charge |
|---|---|---|
| 30% | 42.9% | $1,429 |
| 35% | 53.8% | $1,538 |
| 40% | 66.7% | $1,667 |
| 45% | 81.8% | $1,818 |
| 50% | 100% | $2,000 |
Read the 40 percent row carefully, because it is the one most shops are aiming at. To hold a 40 percent gross margin you have to mark cost up by two thirds. A shop adding 40 percent because it wants 40 percent margin is landing at 28.6, and it will spend a year wondering where the money went.
The formula, if you want it: markup equals margin divided by one minus margin.
One more habit worth stealing. An electrical contractor I work with deliberately leaves material markup out of the labor rate calculation. Labor has to cover labor on its own, and material profit sits on top as a cushion. Most shops do the opposite without realizing it, letting a healthy material markup quietly subsidize a labor rate that was never high enough. That works until a job is labor-heavy and light on materials, which is exactly when you find out. Mike Andes runs the same idea inside his pay structure, splitting labor from material markup so neither one hides the other.
Set the price from a target margin, not from habit
Once you have the loaded labor, the direct costs and the overhead allocation, work backwards from the margin you need rather than adding whatever the shop has always added.
- Start with loaded labor cost
- Add materials and every other direct job cost
- Add the overhead allocation
- Pick the gross margin target for that type of work
- Calculate the selling price that hits it
Use different targets for different work. Repairs, replacements, maintenance and larger projects carry different labor efficiency, materials risk, sales effort and callback exposure. The point is to choose each one deliberately instead of inheriting a number from an old spreadsheet. Brent Garrett works it the same direction, pricing to a 52 to 55 percent gross margin and backing into overhead from there.
Flat rate or time and materials
Flat rate is not a different price, it is a different way of presenting the same arithmetic. Everything above still has to be inside the number. What changes is that the customer sees one figure and you carry the risk of the job running long.
The split that works for most shops I see is this. Repeatable work goes flat rate: equipment replacements, water heaters, water treatment, disposals, fixture installs. Renovations and new construction stay quoted time and materials, because the variability is too wide to carry.
The trap is assuming a flat rate book arrives priced for your market. I sat through a comparison with a plumbing company where a national book priced a 50-gallon gas water heater at about $2,100 using a $150 hourly rate, against roughly $2,900 for the same job on their own time-and-material pricing. That looked like an $800 gap and an argument against the book.
It was not. Adding the book’s own modifiers, $247 for disposal and $415 for the second person the job actually needed, took it to $2,762 before venting or difficulty charges were applied at all. The headline number was never the price. The modifiers were, and a shop that turns the book on without configuring them is the one who ends up underpriced.
Two things make a book safe to use: load it with your own supplier costs rather than national averages, and set the labor times against a technician who is average for your shop rather than your best one. Done properly it can help you sell, not just protect you. Teddy Slack Jr set a flat rate of $1,400 for tank pulls and watched his closing percentage go from about 45 to 75 percent, because the customer finally knew what the number was before anyone started work.
Turn the number into a quote the customer understands
Getting the price right internally is only half of it. Whoever is standing in the customer’s hallway needs a quote with no ambiguity in it.
- Exactly what the scope includes
- Equipment and system detail
- Labor and materials included
- Exclusions, stated plainly
- Warranty terms
- Who pulls and pays for permits
- Payment schedule
- Any assumptions or conditions
That clarity protects the technician in the field and makes change orders straightforward when the job moves. Field service software helps with the workflow, but no system rescues a bad cost assumption. Getting job costing right in ServiceTitan is what makes the software give you back numbers worth pricing from.
Stress-test the price, then review weekly
Before you roll out a new pricing model, run it against the things that actually happen: overtime, callback labor, an extra truck roll, a supplier increase, a technician working slower than estimated, traffic, install complexity you underestimated, warranty work coming back. If any single one of those wipes out the profit, the price was too thin to begin with.
Then watch the results weekly rather than waiting for the month to close. Break gross profit out by install, service and maintenance. A guest on my podcast described reviewing numbers mid-month as halftime in a football game: you still have time to change something. Wait until the game is over and all you can do is read the score.
The monthly income statement still matters. But by the time it tells you a pricing category is weak, you have usually repeated the mistake for three or four weeks.
Where the increase leaks back out
Raising prices is the easy half. Holding them is where it goes wrong, and discounting is almost always how the increase gets handed back.
Two rules worth setting before you raise anything. First, discount parts and materials, not labor. A membership structure of 10, 15 and 20 percent off eligible parts protects the labor rate, which is the number you fought hardest to get right. Give the discount on labor and you have undone the work.
Second, make every concession land somewhere you can count it. Most systems have fixed discount buttons, say 4 and 5 percent, which cannot handle an owner knocking $300 off to close a job. So those concessions get applied some other way and disappear from reporting. Build a manager-approved discount line so a custom dollar concession is recorded as a discount instead of vanishing into a lower price.
If you cannot report on total discount given by month and by technician, you do not know what your realized price is, only what your price list says. Ellen Rohr makes the case for who actually eats the cost when you discount. And Chris Lee argues the better move is the opposite direction entirely, charging $20,000 more by stacking the offer rather than shaving the price.
Common pricing mistakes
- Pricing off the wage rate instead of the loaded labor cost
- Applying one markup to every job regardless of type
- Letting technician purchases hit overhead instead of job cost
- Forgetting drive time and non-billable hours
- Leaving callbacks and warranty work out of the labor assumption
- Treating customer deposits as earned revenue before the work is delivered
- Reviewing profitability monthly when weekly data is sitting right there
Most of these are where accounting meets operations, not where sales happens. The estimate failed because the cost model underneath it was incomplete.
Before you trust your pricing
- Are the books current and reconciled?
- Does the labor number include full burden, not just wage?
- Are materials, permits, freight and disposal all captured on the job?
- Does each job carry a fair share of overhead?
- Are you pricing to a target margin rather than a habitual markup?
- Does the quote define scope, exclusions, warranty and payment terms?
- Have you stress-tested it for callbacks, overtime and supplier increases?
- Are you reviewing gross profit weekly by service line?
If you cannot answer yes to each one, the pricing probably still has a leak in it.
Questions owners ask
How do I price an HVAC job so it is profitable?
Build the price from loaded labor cost, every direct job cost, and a fair share of overhead, then work backwards from the gross margin you need rather than adding a habitual markup. The two places it usually goes wrong are using the wage rate instead of the fully burdened cost of a technician, and confusing markup with margin.
What is the difference between markup and margin?
Markup is what you add on top of cost. Margin is what is left of the selling price once the job cost is covered. They are not the same number. A 25 percent markup produces a 20 percent margin, and holding a 40 percent margin takes a 66.7 percent markup. The formula is markup equals margin divided by one minus margin.
Why is labor burden higher than hourly pay?
Hourly pay is one part of the cost. Payroll taxes, benefits, workers’ comp, paid time off, training, drive time, shop time, callbacks and non-billable hours all sit on top of it. A technician paid $30 an hour often costs $50 per paid hour, and once you divide by billable hours rather than paid hours the break-even rate is higher again.
What markup do I need for a 40 percent gross margin?
66.7 percent. On $1,000 of cost you would charge $1,667. Adding 40 percent to cost gives you a 28.6 percent margin, not 40, which is the single most common pricing error I see.
How often should an HVAC company review pricing?
Weekly, broken out by service line. Monthly financials still matter, but by the time a monthly statement shows a weak pricing category you have usually repeated the mistake for three or four weeks. Weekly review lets you change labor assumptions or material prices before underpriced work stacks up.
Should every job use the same markup?
Usually not. Repairs, replacements, maintenance and larger project work carry different labor efficiency, materials risk, sales effort and callback exposure. Set a target margin per type of work deliberately rather than applying one number across everything.
If your pricing is built on numbers you are not sure about and you would like a second set of eyes on it, book a free intro call.






