Construction & Contracting// diagnostic

The job budget and the estimate that won it stopped agreeing on day one

In short

A budget whose total ties to the bid while no individual line ties has not been re-priced — it has been re-shaped. The break is in the mapping from estimate lines to cost codes: many-to-one collapse, general conditions and markup spread differently, alternates and allowances landing in the wrong place, and bid-day adjustments that were never pushed back into the estimate.

Key takeaways

  • Total ties, lines do not: that is a mapping signature, and it means nobody has changed a price.
  • Run the reconciliation at line-to-code-to-budget level and show the unmapped residue explicitly rather than netting it off.
  • A constant ratio between every budget line and its estimate line is markup spread pro rata, and it is a two-minute proof.
  • Alternates and allowances are the usual source of a budget line with no estimate line behind it.
  • Self-perform work budgeted as a lump instead of hours times a burdened rate cannot be tracked against anything later.
  • Handover is the last cheap moment. After the first cost posts, the mapping has to be reverse-engineered from the ledger.

If the project manager's budget totals to the contract value but no individual budget line matches the estimate line behind it, nothing was re-priced. The estimate was mapped onto a different structure — the cost code list the accounting system runs on — and the mapping lost information. That is a reconciliation problem with a definite answer, not a disagreement about how much the job costs.

The distinction matters because the two have opposite responses. If someone genuinely re-priced scope after award, there is a commercial conversation to have. If the numbers were re-shaped, the fix is to record the mapping — and the cost of not doing it lands 12 weeks later, when a variance report shows a division 12 percent over and nobody can say whether that is a real overrun or an artefact of where the fee was put.

The reconciliation that settles it in an afternoon

One table, three columns of identity — estimate line, cost code, budget line — and a fourth for the residue. The residue column is the entire point: netting differences off against each other is how the problem became invisible in the first place.

  1. Export the winning estimate at line level, not at summary level. If your estimating system exports only the recap, the reconciliation cannot be done and that is itself the finding.
  2. Export the budget as Procore, Sage, Viewpoint, Tally or QuickBooks holds it, at cost code level, including any codes carrying a zero value.
  3. Join them on whatever crosswalk was used at handover. If nobody can produce the crosswalk, reconstruct it now — it exists implicitly in an Excel file on somebody's drive, and in six months it will not exist at all.
  4. Compute, per cost code, the sum of estimate lines mapped to it against the budget value. Sort by the absolute difference.
  5. List the estimate lines that mapped to nothing, and the budget lines with no estimate lines behind them. These two lists explain most of the total.
  6. Only then look at codes where both sides exist and disagree. That list is much shorter than the one you started with, and it usually resolves into two or three systematic causes rather than 40 individual ones.
SymptomCauseConfirming testWhat to do at handover
Total ties, no line tiesMany-to-one collapse — several estimate lines rolled into one codeCount distinct estimate lines per cost code; most codes holding several is collapseKeep a line-level crosswalk alongside the budget, not just the rolled-up import
Every budget line higher by the same ratioMarkup or fee distributed pro rata across all codesDivide budget by estimate for ten codes; a constant ratio such as 1.05 proves itPick one method — markup in its own code, or spread — and record which
One division much higher than its estimateGeneral conditions loaded into a trade codeOpen the detail behind that code and look for supervision, welfare or plantMove general conditions to dedicated codes before the first cost posts
Budget line with no estimate lineAn accepted alternate, or an allowance carried as new scopeCompare the award documents against the alternates and allowances in the bidBudget each alternate and allowance as its own code with its own reconciliation
Estimate line with no budget lineA bid-day adjustment never pushed back into the estimateCompare the bid-day scratch sheet with the final estimate line by lineReconcile the scratch sheet into the estimate before it is handed over
Self-perform labour badly outPriced as a crew rate, budgeted as a lump with burden applied differentlyRecompute the hours implied by the budget line and compare with the estimate hoursBudget labour as hours and a rate, never as a single figure
Reading the reconciliation: symptom, cause, and the test that confirms it

Many-to-one collapse, and the crosswalk that prevents it

Estimates are structured for pricing and budgets are structured for accounting, and the two structures were built by different people to answer different questions. An estimate might carry 900 lines against MasterFormat sections; the ledger in Sage or Viewpoint might have 60 active codes on this job. The import collapses the first into the second, and unless the mapping is stored, the relationship is gone the moment the spreadsheet closes.

What makes this expensive is not the collapse itself — some collapse is unavoidable and sensible. It is that the collapse is one-way. When the field posts a cost to a code, nobody can say which of the 14 estimate lines behind that code it belongs against, so the variance is real but unattributable. Holding the crosswalk as data rather than as a step in somebody's process is the whole fix, and it is the same artefact described in mapping takeoff quantities onto cost codes for export one stage earlier in the chain.

General conditions and markup: two spreads, one argument

Estimators and project managers habitually treat indirect cost differently. The estimate might carry general conditions as a priced schedule of its own and add fee at the end; the budget might spread both across the trade codes so each one carries its share. Both are defensible. Running one at each end of the handover is not, and it produces exactly the symptom of every budget line being consistently above or below its estimate line.

  • Decide where fee and overhead live before the budget is created, and write it on the budget itself. A number that appears in one place and is spread in another cannot be reconciled by anyone downstream.
  • Keep general conditions in codes that match how they will actually be spent — supervision, temporary works, welfare, site plant — because a single lumped code cannot be forecast as the job stretches.
  • If markup is spread, store the spread factor. A budget carrying a hidden 1.05 on every line makes every future comparison with a subcontract or a unit rate wrong by 5 percent.
  • Where the estimate relied on levelled subcontractor numbers, carry the levelling basis into the budget too. If levelling was done on a fresh spreadsheet each time — the habit levelling sub bids without a fresh spreadsheet each time exists to break — the buyout assumption behind the budget line is not recoverable.

Alternates, allowances and the bid-day scratch sheet

Two categories create budget lines with nothing behind them. Accepted alternates are scope that existed as a parallel branch during bidding and became the base scope at award; if the branch was never carried as its own object, the budget shows a number that the estimate does not contain. Allowances are worse, because they are deferred decisions rather than priced work, and a budget that treats an allowance as a trade cost hides the reconciliation the contract will eventually demand — the point of the allowance line and what it quietly defers.

Then there is bid day. The last 90 minutes before submission produce discounts, coverage decisions and scope trades that get written on a scratch sheet and typed straight into the bid form. If nobody pushes them back into the estimate afterwards, the estimate on file is not the estimate that won, and every reconciliation against it fails for a reason nobody can find. The same discipline that makes repricing an estimate after an addendum auditable applies here: the adjustment is a change to the estimate, recorded as one.

Self-perform work budgeted on a different basis

Subcontracted scope converts cleanly, because a subcontract value is one number both sides agree on. Self-perform scope does not. The estimate prices it as hours at a crew rate with production assumptions behind them; the budget records it as a lump with burden applied by a different rule. Totals can match while the implied hours differ by 20 percent — and hours are what the field reports against.

Budget self-perform work in two components, hours and rate, and keep the production basis attached. It is the only form in which a weekly comparison between planned and actual means anything, and it is also the only form that feeds anything useful back into the rate library later — which is the input feeding actual costs back into the unit rate library depends on. A lump-sum budget line produces an actual that cannot be turned into a rate.

A budget that cannot be traced back to the estimate is not a budget. It is a target with the same total, and every variance it reports afterwards is an argument rather than a finding.

What the handover has to include

  1. The estimate as bid, at line level, frozen and dated, including the bid-day adjustments.
  2. The crosswalk from estimate line to cost code, stored as data, with a named owner for the mapping decisions.
  3. The stated treatment of general conditions, fee and markup, with the spread factor if one was used.
  4. Alternates and allowances listed separately with their own codes and the reconciliation date each one is due.
  5. Quantities and production assumptions for self-perform work, in hours.
  6. A short list of the assumptions and qualifications the number depended on — the ones that were true on bid day and may not survive contact with the job.

Two boundaries are worth stating. This page stops at handover: committed cost, work in progress and variance reporting are the cost control cluster's problem, and where the budget should actually live is its own decision, argued in whether the budget lives in accounting or in the project system. And a budget can only be as good as the quantities behind it, so if the estimate itself was never reconciled — the situation in two estimators returning different quantities from one set — the mapping will be tidy and the underlying number still wrong.

The tooling here is unglamorous and pays for itself quickly: an import that preserves the crosswalk, a reconciliation report that shows residue rather than netting it, and an exception list at handover. That is a small, well-bounded product of the kind we scope under MVP and product builds. The rest of this silo sits under preconstruction, takeoff and estimating, within our construction and contracting work.

Frequently asked questions

Short answers to the follow-ups this page tends to raise.

Why does the original budget differ from the winning bid?

Almost always because the estimate was mapped onto a different structure rather than re-priced. Estimate lines collapse into fewer cost codes, general conditions and markup get spread differently, and accepted alternates arrive as new budget lines. The total survives all of that; the line-level relationship does not, unless somebody stored the mapping.

How do I map an estimate onto cost codes without losing the detail?

Store the mapping as data alongside the budget, not as a step in a spreadsheet somebody once ran. Each estimate line records the code it landed on, so a cost posted later can be attributed back to the lines behind that code. Collapsing many lines into one code is fine and often sensible — losing the record of which lines they were is what makes later variance unattributable.

Who owns the conversion from estimate to job budget?

One named person, and it should be agreed before award rather than discovered afterwards. In most contractors the estimator owns the estimate as bid and the project manager owns the budget, with the handover as a scheduled working session between them rather than a file transfer. The deliverable from that session is the crosswalk, not the budget total.

Should general conditions be spread across cost codes or kept separate?

Keep them separate, in codes that match how they will be spent. Spreading them makes every trade code look worse than the trade actually is, and it makes comparison with subcontract values and unit rates unreliable. If your accounting setup forces a spread, record the factor used so anyone reading a variance later can back it out.

  • estimating
  • cost codes
  • budget handover
  • preconstruction
// shipped work

The work behind this page

Builds from our portfolio that this page draws on.

Read next

Working on something in this space?

Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.

Start the conversation