How to Compare Estimated Against Actual on Every Job

Why this matters

Most shops compare estimate to actual on the jobs that hurt. That is exactly backwards. The jobs that hurt are the ones you already know about, and by the time you look, the crew cannot remember what happened. The jobs that quietly ran 15% over are the ones repricing your whole calendar, and you will never see them unless the comparison happens on every job, as a close-out step, whether it went well or not.

This article is the mechanic of a single comparison: how to build a pair of numbers that are genuinely comparable, and how to read one job's result. Comparing across many jobs to find patterns is a separate discipline with different rules, and it is covered by the siblings named at the end. Get the single-job comparison honest first, because a pattern built out of dishonest pairs is worse than no pattern at all.

Step 1: Freeze the estimate before the first hour is logged

The comparison needs a version of the estimate that nobody can touch after work starts. Not the quote document, which gets revised, but a snapshot of the cost assumptions behind the price: estimated labor hours by role, estimated material as a cost figure, sub or rental cost, and the gross margin percentage you priced for.

If your estimate stores only the customer-facing price, you have nothing to compare against. A price is an output. Variance lives in the inputs. Freeze the inputs.

Skipping this produces the most common bad comparison in the trades: an estimate quietly edited upward mid-job so the final numbers look close. The variance goes to near zero, the review says everything is fine, and the same job type keeps losing hours next month.

Step 2: Decide what counts as actual, and write the definition down once

Actual cost is not self-evident. Four judgment calls decide it, and if two people in your shop answer them differently, your variance numbers are noise:

  • Travel. Windshield time either counts as job labor or it does not. Pick one and apply it to both sides. If your estimate assumed 12 hours of wrench time and your actual includes 2 hours of driving, you have manufactured a 17% overrun out of a definitional mismatch.
  • Warranty return trips. A callback on your own workmanship is a cost of that job even though the customer paid nothing. Charge it back to the original job or you will rank a job as profitable that ate two hours of a tech's week.
  • Parts off the truck. Stock consumed on site is real material cost. If it only counts when there is a supply-house receipt, truck stock becomes invisible and your material variance runs permanently favorable.
  • Rework inside the same visit. Time spent redoing something the crew got wrong is job labor. It is not a separate category. Hiding it protects nobody.

Write the four answers into your close-out procedure. Consistency matters more than which answer you pick, because variance is read as a trend and a definition change mid-year breaks the trend line.

Step 3: Normalize for approved scope changes

This is the step almost everyone skips, and it is the one that decides whether the number means anything. If the customer approved added work mid-job, the actual hours include that work. The frozen estimate does not. Comparing them directly makes the estimate look wrong when it was right.

The fix is to keep the change order on both sides. Add the change order's own estimated hours and material to the estimate side, and keep its consumed hours on the actual side. Now you have two comparisons that both mean something: the base scope against its estimate, and the change order against its own estimate. Change orders quoted on the spot miss far more often than planned work, because they are priced in five minutes standing in a crawlspace, and blending them into the base scope hides that entirely.

Unapproved extra work is different. It is not a scope change, it is an overrun, and it belongs in the base-scope variance where it will hurt and be seen.

Step 4: Compute the three variances in one unit each

Three numbers, computed the same way every time:

Bucket Formula Unit What it tells you
Labor (actual hours - estimated hours) / estimated hours percent, plus the raw hour gap Whether your time assumptions are right
Material actual material cost / estimated material cost multiple, e.g. 1.18x Whether your cost assumptions and takeoff are right
Margin quoted gross margin percent minus earned gross margin percent percentage points Whether the job made what you sold it for

Carry the raw hour gap alongside the labor percentage, always. A percentage on a small base lies loudly: 1 hour over on a 2 hour job reads as 50%, and 1 hour is not a business problem. Two numbers together are self-correcting.

Margin variance is stated in percentage points, never as a percentage of a percentage. "Margin fell 9 points" is unambiguous. "Margin fell 21%" makes a reader ask twenty-one percent of what.

Step 5: Read sign and size before you reach for a cause

Look at the direction and the magnitude first, and resist naming a culprit until you have. Four readings:

  • Small and either direction (inside your noise band). No action. Jobs vary. A shop that investigates every 5% miss teaches its crew that the log is a trap.
  • Over on labor, material near estimate. The time assumption or the site conditions, not the takeoff. Look at access, occupancy, and how many separate trips it took.
  • Material over, labor near estimate. A takeoff or pricing problem. The plan was right, the parts list or the supplier price was not.
  • Both over. Usually scope. The job you did was not the job you bid, and no one wrote a change order.

The order matters because naming a cause first makes you go find evidence for it. Reading the shape first makes the evidence pick the cause.

Step 6: Put one sentence of cause on the job record

At close-out, the person who ran the job writes one line: what drove the gap. Not an essay, one sentence, in the job's own record while the memory is a day old rather than a month old.

"Attic access through a 20 inch scuttle, all material hand-carried, cost about 2 hours we did not bid." That sentence is the entire asset. Six months later, when you sort your jobs and find that attic work runs long as a category, those sentences are what turn a statistic into a template change. Without them you have a number that says you were wrong and no information about how to stop being wrong.

A worked comparison, end to end

A two-tech changeout. Frozen estimate: 12.0 labor hours total (2 techs, 6.0 hours each), material carried at a baseline index of 1.00, no sub, priced at a target 45% gross margin. The bid's cost mix was 65% labor, 35% material.

The crew logs 15.5 hours. Raw, that is 3.5 hours over 12.0, which is 29.2% over. Before you react, normalize.

Mid-job the customer approved an added item, quoted on the spot at 1.0 hour of labor. It consumed 1.5 hours. So:

  • Base scope: 15.5 total minus 1.5 change-order hours = 14.0 actual against 12.0 estimated. That is 2.0 hours over, 16.7% over the base estimate.
  • Change order: 1.5 actual against 1.0 estimated. Half an hour over, 50% over its own estimate, on a base too small to act on alone. Worth a tally mark, not a meeting.
  • Combined: 15.5 actual against a 13.0 estimate once the change order is on both sides, 19.2% over.

Note what normalizing did: the honest labor variance on the work you actually bid is 16.7%, not the 29.2% the raw numbers showed. A shop that skips step 3 would go rewrite a job template that was only moderately wrong.

Material landed at 1.18x the estimate, driven by a second supply-house run for fittings that were not on the takeoff.

Now the margin. Cost mix 65/35, so the cost index is (0.65 x 14.0/12.0) + (0.35 x 1.18) = (0.65 x 1.167) + 0.413 = 0.758 + 0.413 = 1.171. Total cost ran about 17.1% over estimate. The price did not move, and a 45% quoted margin means cost was 55% of price. Actual cost is 0.55 x 1.171 = 64.4% of price, so the job earned a 35.6% gross margin against the 45% sold. That is a drop of 9.4 percentage points, which is 9.4 of the 45 points quoted, about 21% of the margin you sold.

The job was profitable. It also gave back a fifth of its margin, and the cause line reads: fittings not on the takeoff, one extra supply run. Repeat that on forty jobs a year and it is not a small problem.

What changes the answer

  • Time and materials billing. On a T and M job the customer absorbs the overrun, so labor variance measures estimating accuracy but not profit. Still track it: a T and M job that runs 30% over your verbal ballpark is a customer-trust event even when the invoice is legitimate.
  • A fixed-price job priced off a published flat rate. Variance against the flat-rate book measures whether the book fits your market and your crew, not whether the estimator guessed well. The corrective action is a book adjustment, not coaching.
  • Multi-week jobs. Waiting until close-out is too late to save the job. Compare at phase boundaries or at a set percentage of budgeted hours, which is a separate discipline covered in the labor-hours sibling below.
  • A trainee on the job. The hours are real, but the estimate was built on a competent crew. Record who ran it. A 20% overrun with a second-year tech aboard may mean training cost, not a bad estimate, and repricing the template on it would overprice every future job the senior crew runs.

How to verify you got this right

Three checks, all fast:

  1. Sum test. Base-scope actual plus change-order actual equals total logged hours. In the example, 14.0 plus 1.5 equals 15.5. If it does not, some hours are on the job twice or not at all.
  2. Percentage base test. Say your percentage out loud with its base attached. "2.0 hours over a 12.0 hour base estimate, 16.7%." If you cannot name the base in the same breath, you probably divided by the wrong one.
  3. Blind re-read test. Have someone who did not run the job read the estimate and the actuals cold and say what happened. If they cannot, the cause line is not doing its job. Rewrite it.

The failure mode to watch for is a comparison that always lands near zero. That is not accuracy, it is almost always the estimate being edited after the fact, hours rounded to match, or truck stock going uncounted. A shop with genuinely honest capture sees variance scattered in both directions with a visible tilt one way. Perfect agreement means the measurement is broken, not the estimating.

References

  • U.S. Small Business Administration: job costing and cost-tracking guidance for small contractors.
  • Standard construction and field-service practice on estimate-to-actual reconciliation at job close-out.
  • See related: How to Track Labor Hours Against the Estimate.
  • See related: The Variance Threshold Worth Investigating.
  • See related: How to Find the Job Types You Consistently Underbid.