Revenue Is Not Margin
Ask most HVAC owners which job type makes them the most money and you'll get an answer. Ask how they know, and you'll get revenue.
Revenue per job is easy to pull and it's the wrong number. A $1,400 install and a $1,400 install look identical on a report even when one took four hours and the other took nine. Even when one went right the first time and the other needed a second trip for a part nobody loaded. Even when one was run by a tech costing you $38 an hour loaded and the other went to the guy at $61.
That gap is not rounding. On a lot of books it's the difference between the job type carrying the business and the one quietly living off it.
The Four Costs Nobody Puts on the Job
Actual time, not booked time. The schedule says two hours because the schedule always says two hours. The clock says three hours and ten minutes. If your job costing uses the booked number, every job that ran long looks exactly as profitable as one that didn't, and the report can't show you the thing it exists to find.
The loaded rate, not the wage. A tech at $32 an hour doesn't cost you $32 an hour. Payroll taxes, insurance, the truck, fuel, his phone, and the hours he's paid but not on a job all sit on top. Add those up for one tech and the real number lands well north of the wage. Shops that cost jobs at the wage understate labor on every single one, and every job looks that much better than it is.
The second trip. This one never gets recorded anywhere. Your tech leaves, gets to the house, finds the part is wrong, drives to supply, comes back. That's ninety minutes of paid labor and it shows up on nothing. Not the invoice, not the quote, usually not even the job record. Straight out of margin, invisible.
Drive time. Not free, and not spread evenly. The rural call that pays the same as the one across town costs you forty extra minutes to serve. Route density is a real margin lever and most shops never look at it, because the data to see it doesn't exist in their system.
None of these are exotic. They're all knowable. They just need the job to carry a clock and the tech to carry a cost.
The Formula
It's simple once the inputs exist:
Real job margin = invoiced revenue before tax - (actual hours x loaded hourly cost) - parts at your cost
The word doing the work is actual. Check-in and check-out timestamps, captured at the house by the tech, not typed in from memory on Friday afternoon. Memory rounds toward the schedule, and that's exactly the bias hiding the problem.
Two shops can run the same formula and get answers of very different quality. One is measuring. The other is confirming what it already believed.
What This Usually Turns Up
When a shop measures this properly for the first time, the same findings come up over and over.
One job type is underwater. Almost always a flat-rate tier priced years ago against parts costs that have moved since. It looks fine on revenue and it's been losing money per call for two seasons.
Diagnostics are worse than they look. Call a $99 diagnostic a loss leader if you want. Once it eats ninety minutes with drive time, it's just a loss. It only works if it converts to repair at a rate you've actually measured instead of assumed.
Maintenance is better than it looks. Owners tend to treat tune-ups as a low-margin obligation. Measured right, they often hold up fine. They're short, predictable, use no parts, and they fill gaps that would otherwise be dead time. That's before counting the repairs they turn up.
The margin spread between techs is wider than the wage spread. Your best tech probably costs more per hour and returns more margin per job. Your slowest is not necessarily your cheapest. You can't see any of this without per-tech numbers, and once you can, it changes how you hand out work.
Read It Right
Two traps once you've got numbers.
Don't act on a small sample. Four jobs of a type is noise, not a finding. Wait until you have enough that the median means something. Be suspicious of any conclusion resting on one bad call, because a single job that ran five hours over on a customer situation shouldn't reprice a whole tier.
Compare medians, not averages. One disaster job drags an average somewhere that looks useful and isn't. The median tells you what a normal one of these costs you, and that's the number you price against.
You're not building a dashboard. You're after three or four decisions: which flat-rate tiers to reprice before next season, which job types to stop chasing, which to sell harder, and whether your diagnostic fee is buying what you think it's buying.
Then Do Something About It
Measuring something and changing nothing is a hobby. The moves that follow are usually short.
- Reprice the tier that's underwater. You've got the parts-cost evidence now, so you can do it without guessing and explain it if a customer asks.
- Kill the second trip. A morning pick list of what each truck needs for the day's booked work gets rid of most of them. Highest return on this list.
- Match the tech to the job. Once you can see margin per tech per job type, assignment stops being about who's free and starts being about who's right.
- Drop what doesn't pay. Some work is worth keeping at thin margin for what it leads to. Some isn't, and you can't tell which without the number.
The Bottom Line
You can't price work you haven't measured. Most shops run on revenue per job and a gut feel for which work is good. The gut is usually right about two things and wrong about one, and nobody knows which is which.
The inputs are not hard. A real clock on the job, a loaded cost per tech, and parts at cost instead of at sell. What you get for it is walking into next season knowing which of your prices are wrong, instead of finding out at the end of it.
Setpoint calculates margin per job from actual check-in and check-out timestamps against each technician's hourly cost and the parts used at your catalog cost, and shows per-technician margin across their jobs. See how it works →