The Estimate to Invoice Reconciliation SOP

Purpose

Job costing tells you whether the work cost what you thought. This procedure answers the other half of the same question: whether the invoice you are about to send matches both the estimate the customer agreed to and the work your crew actually performed. Those three documents drift apart quietly. A signed change order never reaches the invoice. A tech works four extra hours nobody logged as billable. Office staff bills the quoted lump for a job that was cut short at the customer's request.

Every one of those is a costing signal too, because an invoice that does not match the actuals corrupts the margin number you will later use to correct your estimate. A shop that recovers unbilled approved work also stops mistaking a billing miss for an estimating miss. Run this before the invoice goes out, not after the customer questions it.

Scope

Applies to every completed job with an invoice, from a single-visit service call to a multi-day install. It runs after the job is closed and the cost record is populated, and before the invoice is sent. It covers three-way agreement between the frozen estimate, the actual work record, and the draft invoice. It does not cover pricing the original estimate, reading variance for template correction, or collections.

Excluded: warranty callbacks with no billable component (those still get reconciled for cost, but the invoice step is skipped), and flat-rate service calls where the price is the price and the only reconciliation is whether an add-on was performed.

Roles and responsibilities

Role Responsibility
Field lead Closes the work record the day of completion, including any work performed outside the quoted scope, flagged as approved or not
Office/admin Runs the three-way tie-out, drafts the invoice, holds anything with an unexplained gap
Owner or manager Decides every held item within one business day, and is the only role that may write off billable work
Estimator Confirms whether an out-of-scope item was actually excluded from the original quote when that is disputed internally

Procedure

1. Confirm the estimate is frozen and versioned

Pull the estimate as it was accepted, not as it sits today. If a change order was approved, you should have a numbered revision, and the reconciliation is against the sum of the original plus each approved revision. If someone edited the original estimate in place after the sale, you have no baseline and the rest of this procedure produces fiction. Fix that first by reconstructing the accepted version from the customer's copy.

2. Close the work record before you open the invoice

Do the invoice second, always. Drafting the invoice first anchors you to the quoted numbers, and you will then read the work record looking for agreement rather than for difference. The order matters more than it sounds: an admin who has already typed the quoted hours into the invoice screen has to actively decide to change them, and most will not.

3. Build the three columns

For each line of scope, put quoted, performed, and drafted side by side. Labor in hours, material in counts of the units you actually stock and issue, subcontract in whole scope items. Do not convert to a single blended figure at this stage. A job can tie out perfectly in total while being over on labor and under on material, and collapsing to one number is exactly how that hides.

4. Classify every gap before you price any of it

Four buckets, and each has a different destination:

  • Approved and unbilled. Customer said yes, crew did it, invoice does not show it. This is recoverable revenue and the single most common finding.
  • Performed and not approved. Crew did work outside the quoted scope with no customer approval on record. It is a cost, and generally not billable, but it must not be silently absorbed - it is the leading indicator of a scope-control problem.
  • Quoted and not performed. Scope was cut, deferred, or found unnecessary. The invoice must come down, or you will get a dispute that costs more than the line.
  • Rework and callback. Our own defect or diagnosis miss. Never billable, always costed to the job, and coded so it is separable later.

5. Hold anything you cannot classify

An admin who cannot tell which bucket a gap belongs in does not guess. Hold the invoice and route one question to the field lead. The cost of a one-day delay is small. The cost of billing unapproved work is a dispute plus the relationship, and the cost of writing off approved work is permanent.

6. Set a materiality threshold so the procedure is survivable

Reconcile every job, but investigate only gaps above a stated size. A workable default: investigate any single-bucket gap above 5% of the quoted value for that bucket AND above 1.0 labor hour. Both conditions, not either: a percentage alone flags every small bucket, and an hour figure alone misses a large bucket drifting quietly. Below that, record and move on. Tune the hour figure to your average ticket - a shop whose typical call is 2 hours should drop it to 0.5 hours, and a shop doing multi-week installs can raise it to 4 hours without losing anything real.

7. Correct the invoice, then correct the cost record

Both, in that order, and never one without the other. If you add an approved change order to the invoice, the same change order becomes part of the revised baseline the cost variance is measured against. Shops that update the invoice and forget the baseline generate a phantom overrun on every job they successfully upsold.

8. Log the finding with a one-line cause

One sentence on the job record naming which bucket and why. "2.0 hours approved verbally on site, change order written but never attached to the invoice." That sentence is the entire raw material for the monthly rollup. Without it you can count gaps but never fix the process that produces them.

9. Roll the findings up monthly by cause, not by job

Count how many invoices had a gap and what the causes were. You are looking for a repeating cause, not a bad month.

A worked reconciliation, start to finish

A three-phase install quoted at 18.0 labor hours: 6.0 rough-in, 8.0 set and connect, 4.0 commissioning and cleanup. The work record closes at 21.5 hours, so actual labor is 19.4% above the quoted 18.0 hours (3.5 hours over 18.0). The draft invoice, built straight from the quote, shows the quoted lump.

Three columns, phase by phase, find the 3.5 hours are not evenly spread. Rough-in closed at 6.5, set and connect at 8.0, commissioning at 7.0. So commissioning alone carries 3.0 of the 3.5 extra hours, and rough-in the other 0.5.

Classification, in order:

  • Commissioning ran long because the customer asked on site for two additional zones to be balanced and documented. The field lead noted it and the customer initialed the change order on a phone photo. That is 2.0 hours, approved and unbilled.
  • The remaining 1.0 hour of commissioning was our tech re-terminating a control connection he had landed wrong during set and connect. That is rework, not billable.
  • The 0.5 hour on rough-in is under the 1.0 hour investigation floor from step 6. Recorded, not investigated.

Now the destinations. The invoice goes up by the change-order amount covering 2.0 hours plus the associated material. Those 2.0 hours are 9.3% of the 21.5 hours actually worked. The 1.0 rework hour is 4.7% of the same 21.5 hours and comes off nothing - it stays as cost and gets a rework code so the quarterly review can separate it from estimating error.

The revised baseline is now 20.0 hours (18.0 quoted plus 2.0 approved). Against 21.5 actual, the residual overrun is 1.5 hours, or 7.5% above the 20.0-hour revised baseline. That is the number that should reach the estimating rollup. The unreconciled version of this job would have reported a 19.4% labor overrun against the original 18.0 hours and pointed the estimator at a template that was not actually wrong by that much.

Notice what the reconciliation did to two separate numbers. It recovered billable work, and it cut the apparent estimating error by more than half. Those are different wins and shops usually only chase the first.

Reading the monthly rollup

Take a quarter with 64 reconciled invoices. Nine of them, 14.1% of the 64, had at least one approved-and-unbilled gap. Total recovered labor across those nine came to 26.5 hours. Quarterly billed labor for the shop was 1,480 hours, so the recovery is 1.8% of the quarter's billed labor hours.

Under 2% sounds like rounding error until you notice two things. First, it is close to pure margin - the work was already performed and already paid for in wages, so nothing but the sale price is being added. Second, 14.1% of invoices carrying a leak is a process defect rate, and process defect rates do not fix themselves. If all nine trace to the same cause (a verbal approval that gets written on paper and never attached), the fix is one workflow change, not nine conversations.

The cause distribution is what you act on. Nine leaks spread across nine different causes is noise and you tighten the general habit. Six of nine sharing one cause is a broken step and you rebuild that step.

What changes the answer

Flat-rate versus time-and-material pricing. Under flat rate the customer owes the quoted price whether the job took 1.5 hours or 4.0, so the invoice side barely moves - but the cost side still needs every hour captured, and the reconciliation becomes purely internal. Do not let a flat-rate shop conclude it has nothing to reconcile.

Progress billing on longer jobs. When you invoice in stages, run the reconciliation at each billing milestone against the scope claimed complete, not just at the end. A milestone billed as complete that is 80% complete is a receivable you will have to give back.

A customer with a purchase-order ceiling. Approved-and-unbilled work above the PO ceiling is not recoverable by adding it to the invoice, no matter how genuine the approval. It needs a PO revision first, and step 5's hold exists precisely for this case.

Very small tickets. On a shop averaging under 2 hours a call, the full three-column build costs more than it returns. Reconcile the exception set instead: any ticket where actual hours exceed quoted by the floor in step 6, plus every ticket with a part issued that is not on the quote.

How to verify the procedure is working

Three checks, at three different intervals.

Weekly: count invoices sent without a completed reconciliation. Target zero. Anything above zero means the step is being skipped under schedule pressure, which is exactly when leaks are largest.

Monthly: watch the approved-and-unbilled count fall while the performed-and-not-approved count holds or rises. That combination means you are catching more, not creating less. If both fall together in the first month, suspect the field lead has stopped recording out-of-scope work rather than that scope control improved overnight.

Quarterly: compare the labor-variance distribution before and after reconciliation. If they are identical, either your reconciliation is not writing corrections back to the baseline, or you genuinely have no change orders, which for most shops means change orders are not being written at all.

One failure mode this procedure creates rather than fixes: reconciliation can quietly become a place where the owner writes off billable work to avoid an awkward call. Track write-offs as their own line with a named approver. A rising write-off count with a falling dispute count is not a win, it is the shop paying for peace with margin.

References

  • U.S. Small Business Administration (SBA), invoicing and receivables practices for small business
  • Generally Accepted Accounting Principles (GAAP), revenue recognition on performance obligations
  • Trade-standard practice for written change orders and scope revisions
  • See related: The Job Costing SOP, How to Cost a Job That Changed Mid-Stream, How to Compare Estimated Against Actual on Every Job