Trades industry news, updated weekly
Business Tips

Your Job Costing Is Off Because Your Estimates Were Wrong

Maria ChenMaria Chen··13 min read

Your Job Costing Is Off Because Your Estimates Were Wrong

In 2019, I was part of a private-equity team evaluating a 14-truck residential HVAC shop in Northern Virginia. Clean operation, good trucks, owner with nineteen years in the business. When I pulled the job cost reports against the install estimates, the variance was consistent enough to be architectural — not random field errors, not one bad month. Every install category was over. Labor ran 18-23% above estimate. Truck time was unallocated entirely. Overhead was a plug number from 2016.

The owner's explanation was immediate: callbacks and slow techs. Three years of the same explanation.

The callbacks were real. The slow techs were not the problem. The estimates were fiction, and nobody had examined them long enough to notice.

Job costing variances get blamed on execution. The variance report goes to the field supervisor. The field supervisor has a hard conversation with the install crew. The install crew works a little faster, margin shifts two points for six weeks, and everything drifts back. Because the estimates were wrong before the truck left the lot.


The Arithmetic Problem That Looks Like a Margin Problem

Most small residential shops are not running a margin problem. They are running an arithmetic problem.

The version I see most often: the owner prices installs at "40% markup" and believes he is running 40-point gross margin. He is running 28.6%. Markup and margin are not the same calculation, and the estimate template is usually where the confusion lives. A $1,000 job cost marked up 40% is priced at $1,400. The gross margin on $1,400 with $1,000 in cost is 28.6%, not 40%. The owner who doesn't know this is underpricing every install by eleven-plus margin points, and no amount of field efficiency closes that gap.

This is the modal error in the shops I've audited. Because the estimate template is where the markup percentage gets applied, fixing the field doesn't fix the math.

If your actuals never match your estimates, your estimates are fiction. The variance report is not a performance review — it is a diagnostic on your pricing model.

The misdiagnosis persists for a structural reason. Job costing is owned by the back office. Estimating is owned by the owner or the sales lead. Field execution is owned by the install crew. These three groups talk to each other less than they should, and variance data almost never travels backward from job cost to estimate template. It travels laterally — from job cost to the crew lead, as a performance complaint.


Where Estimates Go Wrong

Estimates fail in predictable places.

Labor hours. The estimate was built on a best-case scenario: an experienced tech, no access issues, existing line set in reasonable shape, equipment where the plan says it is. The actual job had a 22-year-old air handler in a crawl space with a damaged flue collar and a refrigerant line set that needed replacement. The tech ran two and a half hours over. Not because he was slow — because the estimate didn't price for equipment condition or site complexity. Most templates don't have a condition multiplier. They should.

Material cost. Copper and refrigerant pricing have moved since the phasedown schedule kicked in — if you haven't updated your cost baseline since last year's buy, you are eating that variance on every job. Lock your template to a live cost plus a defined markup, not a stale price list.

Truck and equipment time. The single most underpriced line in residential HVAC estimating. I have said this enough times that I sound like a recording. Most shops plug in a national average or a figure from three years ago. Commercial auto premiums have climbed hard since 2021 — the NICB has documented 14-22% annual increases in some states, and that range matches what I've watched happen to Virginia shops I work with directly. That cost is real. It gets buried in overhead and never allocated back to the job-level estimate.

Overhead allocation. Fixed overhead — rent, insurance, software, the shop liability policy — has to be allocated across billable hours to know what an hour of production actually costs. Most small shops set this once, when they price their services, and never revisit it. As overhead grows and billable hours fluctuate, the rate goes stale. The estimate thinks overhead is $22 per billable hour. It's $31. Every hour sold at the old rate funds $9 of unrecovered cost.

On Manual J: an oversized system estimated without a proper load calc adds costs the estimate never anticipated. Longer line set, larger disconnect, different refrigerant charge, possibly a bigger pad. All of it shows up in job cost. Rule-of-thumb sizing is not just a technical problem — it is a margin problem that originates in the estimate.


Why Flat-Rate Books Don't Fix This

The industry answer to estimating inconsistency is usually a flat-rate pricing book. Flat rate gives you price consistency, speeds up the sales conversation, and keeps individual techs from pricing the same job differently.

What it does not give you is predictable margin per ticket. Predictable revenue per ticket, yes. Those are not the same thing.

Flat-rate books are built on blended national labor and material assumptions. A shop in Alexandria running $28-per-hour burden and $2,800 per year in commercial auto per vehicle is not running the same cost structure as the median shop in the vendor's dataset. The flat-rate price is identical. Your cost is higher. The margin is thinner than the book implies, and you cannot see it because the math is embedded in the book's construction.

The vendor commission structure compounds this. Flat-rate books integrated with parts vendors are built to move specific SKUs at margins that work for the vendor. The labor hours in the book reflect what's optimal for the vendor's recommended parts and installation approach. Your labor hours, with your crew, on your equipment mix, may differ.

Then there is the software lock-in. Shops that go through a ServiceTitan implementation often get their flat-rate structure entered at setup and then discover, six months later, that nobody on the team knows how to edit a line item. Costs change. The book does not. The variance grows invisibly because the price at point of sale looks authoritative even when it no longer reflects actual cost.


Job Costing as a Feedback Loop

Most shops run job costing in one direction: job closes, actuals get entered, variance gets noted. That is a post-mortem.

A feedback loop means the variance data travels back to the estimate template and changes it. This almost never happens automatically. It requires someone to own the connection between the two — to ask, after each job category, whether the variance is random or structural, and if structural, what the template needs to say instead.

At Bayview Mechanical in Sunnyvale, where I worked early in my career, estimators and field techs operated in entirely separate information channels. A tech who found a corroded evaporator coil pan on a 2004 Carrier and spent two unbudgeted hours dealing with it filed a callback note and moved on. The estimator never heard about it. The template for that equipment generation never got updated. I watched that same variance repeat across multiple jobs over 18 months before anyone connected the pattern. The fix was a single line in the template: an age-based condition allowance for equipment over 15 years.

On timing: shops that close job costing 45 days after project completion are making pricing decisions on data that is nearly a quarter old. You need job cost actuals closed within two weeks of project completion for them to inform next month's estimates. Slow job costing also correlates with elevated days sales outstanding, and the two problems compound each other.


The Quarterly Estimate Audit

Pull every closed install job from the last quarter. Sort by job category — system replacement, new install, add-on zone. For each category, calculate actual labor hours versus estimated labor hours, expressed as a percentage variance. Run the same exercise for material cost and truck time.

Under 8% average variance: your templates are reasonably calibrated. Those thresholds are my own working benchmarks, not published standards — but they reflect what I've seen hold across the shops I audit. Eight to 12% is worth examining. Consistent variance above 12% points to a template problem, not a crew problem.

Before revising labor hour assumptions, verify that the hourly rate in your template is carrying the right overhead. Contribution margin — revenue minus variable cost — is not the same as gross margin, and gross margin is not the same as net. Fixed overhead allocated per billable hour is the number that connects the job-level estimate to the shop's actual financial position. If the owner is pulling draws instead of booking a market-rate W-2, the management P&L is overstating gross margin by the difference. That inflated number flows into the estimate as a false floor.

The SEER2 transition demonstrated this problem at scale across the whole industry. Equipment costs rose when SEER2 replaced SEER equipment in the supply chain. Shops that absorbed the increase without revising their estimate templates ran negative variances on every install for months before they found where the margin went. Shops that ran a quarterly template review caught it at the first close and repriced. From what I saw in my client base, roughly 60% of independents absorbed rather than repriced — and most of them are still wondering why install margin is thin.


Where to Start

Pull the last 10 closed install jobs. Calculate actual labor hours versus estimated on each one. Compute the average variance as a percentage.

If it is above 12%, do not start with your install lead. That conversation, before you have examined the template, will be about the wrong thing. Look at what the template assumes for labor hours by job category first. Compare that assumption to actuals. The disconnect will surface faster than you expect.

Next, run your actual truck operating cost per billable hour from your own numbers. Pull your commercial auto invoice from the last 12 months, your fuel card statement, your vehicle maintenance log. Divide total truck cost by billable hours in the same period. Then find the truck cost figure embedded in your current estimate or flat-rate book and compare the two. The actual number is almost always higher. In the shops I've done this exercise with for the first time, the gap runs $8 to $15 per hour — not rounding error.

Then put a quarterly estimate review on the calendar — 60 days from now — and put one person's name next to it. One person. Before that review, confirm three numbers are current: labor hour assumption by job category, overhead allocation rate, material cost baseline. Those three numbers being wrong is the reason your variance report keeps saying the same thing.


FAQ

My actuals are always over on labor but under on materials — what does that pattern usually mean?

Labor over, materials under is almost always a scope problem. The job took more time than estimated because something in the field expanded the scope — an access issue, an unexpected equipment condition, a change order that got absorbed. Materials coming in under suggests the estimate was conservative on parts, which is less common and usually means techs are not entering all consumed materials into job cost. Check whether small consumables — fittings, wire, refrigerant top-offs — are being logged or absorbed silently into the labor entry.

How often should I actually be updating my estimate templates?

Quarterly is the right interval if you define the task narrowly. You are adjusting three numbers: labor hour assumptions by category, overhead allocation rate, and material cost baseline. Annual updates are not enough when insurance costs, wage rates, and equipment pricing are all moving — and in most markets right now, they are. The discipline is treating it as billing-cycle work rather than optional analysis.

My field techs say the estimates are unrealistic for older equipment. How do I factor equipment age into labor hours without making every estimate a custom job?

Build a condition tier into the template. Standard: equipment under 10 years, accessible installation, no known issues. Aged: 10-20 years, standard access, condition unknown. Complex: over 20 years, restricted access, or prior non-standard work. Apply a labor hour multiplier to the aged and complex tiers — 1.15x and 1.3x are the ranges I've used with client shops in Virginia and Maryland. Your field lead assigns the tier during site evaluation. The estimate stays systematic; the template reflects real job conditions.

I use a flat-rate book from a major vendor and my close rate is good. Why would I change something that's working?

Close rate measures whether customers accept your price. It does not measure whether your price covers your cost. Run one quarter of job costing against your flat-rate prices — actual labor, actual materials, actual truck cost — and calculate gross margin per job. If the margin is consistent with your target, the book is working. If it's variable or thin, the close rate is flattering a pricing problem. Those are two different situations.

What's the minimum job costing data I need if I'm not running a full field service management platform?

Four numbers per job: estimated labor hours, actual labor hours, estimated material cost, actual material cost. Truck time and overhead you can allocate at the category level rather than per job. A spreadsheet with those four columns, closed within two weeks of job completion, gives you enough data to run a quarterly variance analysis. Consistent data entry and someone who looks at the output quarterly. That is the whole system.

How do I handle the conversation with my install lead when the job costing shows his crew consistently running over?

Show the install lead the estimated hours versus actuals and ask whether the estimate reflects the job as it exists in the field. Install leads have specific explanations for why hours ran over. Those explanations are about estimate assumptions, not crew performance — and when they are, you revise the template and the variance should close. If it doesn't, that is a different conversation, and a more specific one: which jobs, which crew members, which task categories. But you have to fix the template first or you will never know which problem you are actually solving.

Enjoyed this article?

Get articles like this in your inbox every Monday. Free, no spam.

More from The Backcharge