The Estimate Variance Log SOP

Purpose

To maintain one standing record of estimated against actual performance on every job, so that the monthly and quarterly costing reviews read from evidence rather than from memory. The log is the artifact, not the meeting. A shop that runs a good post-job review off a bad log is reviewing anecdotes with a calendar invite attached.

The log exists to answer three questions at any moment without anyone reconstructing anything: how did this job perform against the estimate that was actually live when it was quoted, which job types are drifting, and which rows are still open past their due date.

Scope

Applies to every job of a type that has an estimating template, whether fixed price or time and materials, from the moment it is quoted until its row is closed and its rework window has expired.

Excluded: jobs quoted entirely off the cuff with no template, which cannot produce a variance because there is nothing to vary from, and internal or shop jobs with no customer. Both should be rare. If more than a small share of your work has no template, the log is not your first problem.

Roles and responsibilities

Role Responsibility
Estimator or whoever quotes Opens the row at quote time; records the estimate version and the estimated labor hours and parts cost
Field tech Logs actual hours and parts to the job daily; supplies the one-line cause note on any escalated row
Office manager Closes rows within the deadline, computes variances, runs the weekly pass, flags escalations
Owner or operations lead Assigns disposition codes on escalated rows, decides template changes, owns the log's integrity

One person owns the log. Shared ownership of a record like this produces a record nobody maintains.

Procedure

1. Open the row when the job is quoted, not when it closes

A row opened at close is a row written from memory, and the estimate it compares against will be whatever the template says today rather than what it said when the price was set. Open it at quote, with the estimate as quoted.

2. Freeze the estimate version on the row

Record which revision of the template produced this estimate, with its date. This single field is what makes a variance interpretable six months later. Without it, a template you corrected in March makes every job quoted in February look wrong for a reason that has nothing to do with the field.

3. Carry these fields, and no more

Field Filled at
Job number and job type Quote
Estimate version and date Quote
Contract type (fixed price or time and materials) Quote
Estimated labor hours, estimated parts cost Quote
Quoted margin percentage Quote
Actual labor hours, actual parts cost as paid Close
Labor variance percentage, parts variance percentage Close
Absolute labor miss in hours Close
Realized margin percentage Close
Disposition code Close, or at escalation
One-line cause note Escalated rows only
Linked rework hours When the rework window expires

Resist adding fields. Every optional field is a blank column in six months, and a log with blank columns loses the trust of the people who have to act on it.

4. Close the row within five business days of job completion

Five days is short enough that the tech still remembers the job and long enough that the supplier invoice has usually landed. Rows still open past ten days get chased by name in the weekly pass, because an old open row is nearly always a job whose actuals were never logged, which is a bigger problem than the variance would have been.

5. Compute the three variances in fixed units

Labor variance as a percentage of estimated hours. Parts variance as a percentage of estimated parts cost. Absolute labor miss in hours. Always those units, always both the percentage and the absolute for labor, and never a combined total variance as the primary figure, because a total hides two component errors that cancel.

6. Apply the escalation test: percentage or absolute, whichever trips first

Escalate any row where labor variance exceeds 20% in either direction, or where the absolute labor miss exceeds 4.0 hours. Start from those two defaults and calibrate them to your own noise floor over a couple of quarters.

Two tests rather than one, because either alone fails in a predictable way. A percentage test alone escalates every short job that ran twenty minutes long and misses a large job that quietly lost six hours inside a modest percentage. An absolute test alone never sees a short job type bleeding out at 60% over. Favorable variance escalates too: a job that came in 30% under estimate is either a template that is too generous or an actual that was never fully logged, and both are worth ten minutes.

7. Assign one disposition code from a fixed list

  • On target - inside the escalation thresholds, no action.
  • Estimating bias - the template number is wrong for this type in a consistent direction.
  • Scope change captured - work was added and a change order or added line was raised.
  • Scope change absorbed - work was added and nothing was raised. Goes to the capture process, not the template.
  • Execution - the estimate was sound and the job did not run to it.
  • Data problem - hours or parts missing or misbooked. Fix the record, then re-close the row.

One code per row, assigned by the owner or operations lead on escalated rows. Do not let a row close with a blank code and do not default the field to "on target," because a defaulted field will silently become the majority of your dataset.

8. Run the weekly pass, ten minutes, same slot every week

Three questions only: any rows still open past the deadline, any escalated rows without a cause note, any closed rows without a disposition code. Fix those three and stop. The weekly pass is a hygiene check on the record, not a review of the work. Analysis belongs in the monthly and quarterly reviews, and letting it start here is the single most reliable way to kill the ten-minute habit.

9. Never edit a closed row

If a closed row turns out to be wrong, append a correction row referencing the original and note why. The quarterly review needs to see what was known at the time, not a tidied version. A log that gets rewritten cannot be used to judge whether last quarter's decision was reasonable on the evidence available.

10. Feed the reviews, do not duplicate them

The monthly review reads escalated rows and disposition codes. The quarterly review reads job-type medians, spreads, and exposure from the same log. Neither review should ever be recalculating from source records, and if either one is, the log is not carrying enough or is not trusted.

11. Retain at least eight quarters, and archive rather than delete

Two years lets you compare a season against the same season, which is the only honest comparison in a business with a peak. Archive closed quarters somewhere readable. The log's value compounds and its worst year is its first.

A worked week

Nine jobs closed. Five representative rows, using the thresholds from step 6:

Job Type Est hrs Act hrs Labor var Abs miss Escalate Disposition
1041 Service repair 2.5 2.7 +8% 0.2 No On target
1042 Replacement 12.0 15.8 +32% 3.8 Yes, percentage only Estimating bias
1043 Service repair 2.5 4.4 +76% 1.9 Yes, percentage only Scope change absorbed
1044 Maintenance 1.5 1.4 -7% 0.1 No On target
1045 Replacement 12.0 16.5 +38% 4.5 Yes, both tests Estimating bias

Read what the week does and does not authorize.

Job 1042 tripped only the percentage test, at 3.8 hours of absolute miss against a 4.0 hour threshold. That is exactly the case a single absolute test would have missed, and it is on a job type carrying twelve estimated hours per job, which is where the shop's exposure lives.

Job 1043 is a service repair that ran 76% over on 1.9 hours of absolute miss. Escalated on percentage, and the disposition is scope change absorbed, so the action is a same-week conversation about why nothing was raised and a check on whether the capture step at close-out is being used. This row must not be allowed to influence the template, because the estimate was never wrong.

Jobs 1042 and 1045 are the same type, same direction, at +32% and +38%, a median of +35% across the two. That is a strong signal and it still does not authorize a template change this week. Two rows is far below the sample you need before moving a number, so both go on the watch list with their disposition recorded, and the decision waits for the quarterly review with a full quarter of that type behind it. Changing a template off two rows is how a shop ends up correcting the same type in both directions within a year.

Jobs 1041 and 1044 close on target and consume no attention at all, which is the log doing its main job: making most of the week invisible so the exceptions are readable.

Failure modes specific to running this as a standing log

These are the ways the record itself fails, as distinct from the ways an individual variance gets misread.

  • The log becomes a performance review. The moment disposition codes are read as a scorecard on individual techs, "execution" stops being assigned and "estimating bias" absorbs everything. Codes describe jobs. Keep people out of the field entirely, including the cause note.
  • A template change ships without a version bump. Now rows before and after the change carry the same estimate version and are silently incomparable, and the quarterly trend for that type is meaningless until someone notices. Bump the version on every change, even a small one.
  • The log lives where one person can reach it. A spreadsheet on one machine survives until that person is on vacation during a close week, and the gap it leaves is permanent.
  • Rows close on time with actuals that were never really logged. The deadline is met, the variance reads clean, and the type quietly looks better than it is. Cross-check closed rows against jobs with at least one time entry; the difference is the size of the lie.

References

  • U.S. Small Business Administration (SBA), recordkeeping and financial control guidance for small business
  • Trade-standard practice for estimate-to-actual tracking and production-rate maintenance
  • See related: The Post-Job Cost Review SOP, The Quarterly Costing Review SOP, The Variance Threshold Worth Investigating, How to Read Your Own Job Costing Data, How to Spot Scope Creep in Your Cost Data