In this post
# HVAC Job Costing: How to Calculate the True Cost of a Service Call
Most contractors know their revenue precisely and their costs approximately, and the approximation is always in the same direction.
Job costing is the correction. It asks one question — what did this job cost to deliver — and answers it with enough precision that the answer is useful. The surprises are usually not where people expect.
The formula
Revenue
− Labour cost
− Parts and equipment cost
− Vehicle cost
− Other direct costs
─────────────────────
= Gross profit
Gross profit ÷ Revenue × 100 = Gross margin
Simple. Every term in it is routinely got wrong.
Term 1 — Revenue is not the invoice total
Revenue is the invoice before sales tax and after any discount.
Sales tax is collected on behalf of a taxing authority and passed straight through. It was never yours. Counting it as revenue inflates the top line and understates the margin on everything.
Invoice total $398.75
Less sales tax −$7.70
-------
Revenue $391.05
The discount is already out, because it came off before the total.
Term 2 — Labour cost is burdened, and includes the drive
Two errors live here, and together they are the biggest single distortion in contractor job costing.
Error one: costing labour at the wage. A technician paid $28/hour does not cost $28/hour. Add employer payroll taxes, workers' compensation, liability insurance, paid time off, and the fact that not every paid hour is billable. The burdened figure is usually well above the wage — where exactly depends on your own insurance rates, your benefit structure and your billable ratio, so work it out rather than adopting somebody else's multiplier.
Error two: excluding drive time. The technician is paid for the drive and the van is running during it. It is a cost of delivering that job whether or not the customer is charged for it.
On site 1.5 hrs
Drive 0.75 hrs (both ways)
────────
Paid hours 2.25 hrs × $45 burdened = $101.25
Leaving out the drive would have costed that labour at $67.50 — understating it by a third.
Term 3 — Parts at cost
What you paid the supplier, not what you charged. If a part was pulled from van stock, it still cost what it cost.
Term 4 — The vehicle
Fuel, maintenance, insurance, tyres and depreciation, divided across the hours the van is actually out earning. Say $12/hour on these numbers:
2.25 hrs × $12 = $27.00
Small per job. Across a year across five vans it is not small, and leaving it out is what makes short jobs across town look better than they were.
Three worked jobs
Same company, same rates, three different shapes.
Job A — capacitor replacement, 12 minutes from the shop
Revenue (pre-tax, after discount) $391.05
Labour 2.25 hrs × $45 −$101.25
Parts capacitor at cost −$22.00
Vehicle 2.25 hrs × $12 −$27.00
Other −$0.00
--------
Total cost $150.25
Gross profit $240.80
Gross margin $240.80 ÷ $391.05 = 61.6%
Markup $240.80 ÷ $150.25 = 160.3%
Profit per on-site hour $160.53
Job B — the same repair, 40 minutes each way
Identical work. Identical invoice. The drive goes from 0.75 to 1.33 hours.
Revenue $391.05
Labour 2.83 hrs × $45 −$127.35
Parts −$22.00
Vehicle 2.83 hrs × $12 −$33.96
--------
Total cost $183.31
Gross profit $207.74
Gross margin 53.1%
Profit per on-site hour $138.49
The same job earned $33 less because of where it was. That is an 8.5 percentage point swing in margin caused by nothing except geography — and it is completely invisible unless drive time is costed.
This is the argument for routing rather than an argument about pricing. More on that in HVAC dispatch software.
Job C — a changeout
Revenue (pre-tax) $7,485.00
Labour 2 techs × 9 hrs × $48 −$864.00
Equipment and materials at cost −$3,148.00
Vehicle 9 hrs × $12 −$108.00
Permit at cost −$95.00
Disposal −$40.00
----------
Total cost $4,255.00
Gross profit $3,230.00
Gross margin 43.2%
Markup 75.9%
Profit per on-site hour (18 tech-hours) $179.44
What the three jobs say
| Job A | Job B | Job C | |
|---|---|---|---|
| Revenue | $391.05 | $391.05 | $7,485.00 |
| Gross profit | $240.80 | $207.74 | $3,230.00 |
| Gross margin | 61.6% | 53.1% | 43.2% |
| Profit per on-site hour | $160.53 | $138.49 | $179.44 |
Three things fall out of this table, and none of them is obvious from revenue alone.
The changeout has the worst margin and the best hourly profit. Margin alone would tell you to stop doing changeouts. Hourly profit says the opposite. Both are true, which is why one number is never enough.
The two identical repairs differ by 8.5 points. Not because of pricing. Because of driving.
The small job has the best margin and the smallest dollars. $240.80 does not pay for much overhead. Margin percentages are seductive and you cannot bank a percentage.
Gross profit is not profit
Everything above is gross — before overhead. Rent, office wages, advertising, software, insurance, the owner's salary and every non-billable hour still come out of it.
A rough sanity check on your own numbers:
Annual overhead ÷ Annual revenue = Overhead as a share of revenue
If overhead runs at 35% of revenue, a job at a 43% gross margin is contributing 8 points of net. A job at 30% gross margin is losing money no matter how busy it looks.
There is no industry number for what your overhead should be. Run it on your own P&L.
Making it routine
Job costing done once is an interesting afternoon. Done on every job it changes what you price and where you send people.
That requires exactly one thing: cost recorded alongside price at the moment the invoice is built. Not reconstructed later from supplier statements and timesheets — nobody does that twice.
An invoicing system that holds two numbers per line gives you this for free, on every job, for ever. One that holds only the price cannot give it to you at all.
See job costing on every invoice →
Related: HVAC markup vs margin · job profit calculator · labour rate calculator
hvac business management software hvac business software hvac job profitability