HVAC Profit Margin: The Number Your P&L Is Hiding

One HVAC job, quoted at a 32.7 percent job net margin, went to 17.7 percent after one unbilled hour that cost $94.17 ONE $625 JOB, QUOTED AND ACTUAL 32.7% job net margin, as quoted 17.7% job net margin, as it went $94.17 what one unbilled hour cost Same job, same price. The gross margin line still said 44.9 percent.
One HVAC job, quoted at a 32.7 percent job net margin, went to 17.7 percent after one unbilled hour that cost $94.17

Your P&L says the year was fine. Your bank balance says otherwise.

That gap has a name. It is job margin, and almost nobody in a shop doing $500,000 to $5 million tracks it.

Revenue shows up on every invoice. Margin only shows up when you go looking, one job at a time.

This guide walks one HVAC job from quote to truth, with a table you can redo with your own numbers tonight.

Why the internet cannot tell you what a good HVAC profit margin is

Search the phrase and you get a spread, not an answer.

ServiceTitan's guide calls 10 to 20 percent net "healthy" and sets the target at 20. Steph's Books, a bookkeeping firm that works with HVAC shops, publishes an 8 to 12 percent net target. Other pages land anywhere in between, and most do not say where their number came from.

Both can be true at once, because they describe different shops. A shop with a strong maintenance base and 72.5 percent billable utilization does not look like a shop that lives on emergency calls in August.

So the benchmark that matters is not theirs. It is yours, and you build it from the bottom up: the job.

Three margins, and only one of them tells the truth

Every HVAC job has three margins stacked on top of each other.

Gross margin is what is left after direct job costs: labor, parts, materials, and subs. Most owners stop here. It looks great here.

Job net margin is what is left after that job also carries its share of overhead: rent, trucks, insurance, the dispatcher, your own salary. The job did not create those costs, but it has to pay for them.

Company net margin is the number on the tax return. It is every job net margin added up.

The pattern I see in shops your size: the owner quotes to a gross margin, then wonders why the company net margin is a third of it. Overhead is the difference.

The two numbers you need before you can cost a single job

You cannot cost a job with a tech's pay rate. You need two numbers.

The first is loaded labor cost per billable hour. Take the sample shop from our free Rate Calculator. A tech paid $25 an hour costs $32.96 an hour once payroll taxes, workers comp, benefits and paid time off are added. That is the loaded cost per paid hour.

But he does not bill every hour you pay him. In that sample he bills 116 of 160 hours a month, which is 72.5 percent utilization. So the loaded cost has to be spread over billable hours only:

$32.96 × 160 ÷ 116 = $45.46 per billable hour

If you cost jobs at $32.96 instead of $45.46, every job is costed 27.5 percent low on labor. That one mistake hides margin on every job you cost.

The second number is overhead burden per billable hour. Add up a month of overhead, divide by the billable hours the shop produces that month. The sample shop lands at $48.71 per billable hour.

Put them together and you have break even: $45.46 + $48.71 = $94.17 an hour. Below that, the job loses money before you have earned a dollar of profit. The full arithmetic is in our billable rate guide, and the calculator itself comes free with the Quote Leak Check.

One job, quoted and then actual

Let's say it is a Tuesday in July. A condenser fan motor is dead on a ten year old split system. Your tech quotes the motor and capacitor at a flat $625, the average job in the sample shop we use across our pricing tools. He figures two and a half hours.

Here is the job as quoted and the job as it actually went. Parts cost you $185 either way.

Line As quoted As it went
Revenue$625.00$625.00
Parts at cost$185.00$185.00
Hours on the job2.53.5
Loaded labor at $45.46 per hour$113.65$159.11
Gross profit$326.35$280.89
Gross margin52.2%44.9%
Overhead burden at $48.71 per hour$121.78$170.49
Job net profit$204.57$110.40
Job net margin32.7%17.7%

What happened in the extra hour? The fan blade was seized to the old shaft. The tech drove to the supply house for a blade, waited in line, and came back. Nobody wrote a change order. The customer paid $625, exactly as quoted.

I spent seven years on the tools. I have made that supply house run myself.

One hour cost the job $94.17 in net profit. That is not a coincidence. It is the break even rate. Every unbilled hour on a flat rate job costs you exactly what it costs to put that truck on the road for an hour.

And the gross margin line still said 44.9 percent. Look only at gross and the job looked fine.

What one hour a day adds up to

Now scale it. Two techs. One unbilled hour each per day. Five days a week, fifty weeks a year.

2 techs × 1 hour × 5 days × 50 weeks = 500 hours

500 hours × $94.17 = $47,085 a year

That is one leak, in a two truck shop, at one hour a day. Shops your size leave at least $100,000 on the table every year, and the unbilled hour is one of the easiest pieces to count.

The same leak in plumbing, electrical and roofing

The seized fan blade has cousins in every trade.

Plumbing: a 40 gallon water heater swap quoted at four hours. The old unit sits in a closet with a shutoff that will not close. Your plumber shuts down the main, drains the line, and the job runs six hours. Two hours at your break even rate, gone.

Electrical: a panel upgrade quoted with a two hour inspection window. The inspector shows up at 3:40 for a 1:00 window. Your electrician sat in the driveway. Nobody bills the driveway.

Roofing: a tear off finds two sheets of rotten decking. The crew replaces it because it is the right thing to do, and the change order gets written in the truck, or not at all. Material and an hour of crew time, absorbed.

None of these techs did anything wrong. The system did. There was no place to write the hour down, so it disappeared.

In eight years running operations I watched it hide in the same four places: diagnosis the quote assumed was free, supply house runs, waiting on someone else, and the second trip. You will fix the one that costs the most, and you only find it by costing jobs.

What you can build tonight, and what we install

You can rebuild the table above in twenty minutes. Do it. That is the point of this guide.

What you will not have is the rest of it: your real cost of putting one truck on the road for an hour, the floor rate that follows, your price book rebuilt on that rate, and break even on your top five job types, all in your own numbers. That is the pricing half of The Recovery Reset. Two weeks, $1,950, one payment. We find what your quotes and your pricing are costing you, fix the pricing, and install the system that gets the rest back.

The Job Costing Template runs every job the way the table above does, quoted and actual side by side, with labor pulled off billed hours automatically. It is one of the documents we install when we work together. You stop guessing at margin. You read it.

Questions owners ask about HVAC profit margin

What is a good profit margin for an HVAC company?

Published targets disagree. ServiceTitan calls 10 to 20 percent net healthy, and Steph's Books targets 8 to 12 percent. The honest answer depends on your mix of service, install and maintenance work, your utilization, and your overhead. Build your own number from job level costing, then compare it to last year.

What is the difference between gross margin and net margin on an HVAC job?

Gross margin is revenue minus direct job costs: loaded labor, parts, materials and subs. Net margin also subtracts the job's share of overhead, which you calculate as an hourly burden on billable hours. In the worked example above, the same job shows a 44.9 percent gross margin and a 17.7 percent net margin. Only the net number tells you whether the job paid for itself.

How do you calculate profit margin on an HVAC job?

Start with revenue. Subtract parts at cost. Subtract hours on the job multiplied by your loaded labor cost per billable hour, not per paid hour. That gives gross profit. Then subtract the same hours multiplied by your overhead burden per billable hour. Divide what is left by revenue. That percentage is the job net margin, and it is the only margin worth quoting to.

Why is my HVAC company busy but not profitable?

Busy measures hours worked. Profitable measures hours billed at a price above break even. A shop can run flat out and still lose money if jobs routinely overrun the quoted hours, if labor is costed on paid hours instead of billable hours, or if the price sits below break even. Cost ten jobs this month and the answer is usually obvious by the fifth one.

What to do this week

Pull your last ten closed jobs. Any ten.

For each one, write down four things: what you billed, what parts cost you, how many hours the tech actually spent, and how many hours the quote assumed.

Run each job through the table above with your own loaded labor and overhead numbers. If you do not have those two numbers yet, the free Rate Calculator, which comes with your Quote Leak Check breakdown, builds them in about fifteen minutes.

Circle the job with the biggest gap between quoted hours and actual hours. Ask the tech what happened. Write down his answer.

That one conversation is worth more than any benchmark online. Which job are you going to circle?

Want the exact number for your shop? Start with the free Quote Leak Check. It puts a dollar figure on the quotes that went quiet in your last 30 or 90 days. That is the other half of the leak, and it is the half you can still get back. Send yourself the breakdown and the free Rate Calculator comes with it. It tells you your floor rate and the gap against what you charge.

Rather talk first? Bring your ten jobs to a free working session. Sixty minutes, your numbers on the screen, and you leave with a plan you own either way. We keep three of these a month.

Run the Quote Leak Check  →

What are your quiet quotes worth?

Four numbers and about two minutes tells you what the quotes nobody ever answered are costing you. No download. The number is free to see.

Run the Quote Leak Check  →

Email Rsalvatore@polarisaxis.co or call 561-223-9925.