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.
- 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.
- Export the budget as Procore, Sage, Viewpoint, Tally or QuickBooks holds it, at cost code level, including any codes carrying a zero value.
- 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.
- Compute, per cost code, the sum of estimate lines mapped to it against the budget value. Sort by the absolute difference.
- 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.
- 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.
| Symptom | Cause | Confirming test | What to do at handover |
|---|---|---|---|
| Total ties, no line ties | Many-to-one collapse — several estimate lines rolled into one code | Count distinct estimate lines per cost code; most codes holding several is collapse | Keep a line-level crosswalk alongside the budget, not just the rolled-up import |
| Every budget line higher by the same ratio | Markup or fee distributed pro rata across all codes | Divide budget by estimate for ten codes; a constant ratio such as 1.05 proves it | Pick one method — markup in its own code, or spread — and record which |
| One division much higher than its estimate | General conditions loaded into a trade code | Open the detail behind that code and look for supervision, welfare or plant | Move general conditions to dedicated codes before the first cost posts |
| Budget line with no estimate line | An accepted alternate, or an allowance carried as new scope | Compare the award documents against the alternates and allowances in the bid | Budget each alternate and allowance as its own code with its own reconciliation |
| Estimate line with no budget line | A bid-day adjustment never pushed back into the estimate | Compare the bid-day scratch sheet with the final estimate line by line | Reconcile the scratch sheet into the estimate before it is handed over |
| Self-perform labour badly out | Priced as a crew rate, budgeted as a lump with burden applied differently | Recompute the hours implied by the budget line and compare with the estimate hours | Budget labour as hours and a rate, never as a single figure |
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
- The estimate as bid, at line level, frozen and dated, including the bid-day adjustments.
- The crosswalk from estimate line to cost code, stored as data, with a named owner for the mapping decisions.
- The stated treatment of general conditions, fee and markup, with the spread factor if one was used.
- Alternates and allowances listed separately with their own codes and the reconciliation date each one is due.
- Quantities and production assumptions for self-perform work, in hours.
- 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
The work behind this page
Builds from our portfolio that this page draws on.
GroundUp
A construction project-management command centre for general contractors that keeps schedule, RFIs, budget and the field log in one place — and maps the critical-path recovery the moment a job slips.
Real EstateQuoteForge
An AI CPQ and proposal platform that builds enterprise quotes from your catalog, guards every discount against the margin floor, routes approvals, and generates the proposal.
Sales AIRead next
- The allowance line: what it is, and what it quietly defers to laterAn allowance is not a placeholder number. It is a decision somebody has agreed to make later, with a date attached — and the estimate rarely records either the decision or the date.definition
- Bid alternates are several estimates wearing one cover sheetAn add or deduct alternate is a second estimate, not an adjustment. It has its own quantities, its own sub scope, its own duration and its own general conditions, and it has to survive into award as its own object.definition
- A takeoff condition is a measurement rule, not a highlighted areaThe coloured region on the sheet is the output of a condition, not the condition itself. The condition is the record that says what was measured, in what unit, with what adjustments, and where the number goes next.definition
- Every length in the takeoff is wrong by the same percentageCounts are right, lengths are proportionally wrong, areas are wrong by the square of the same factor. That signature points at scale — and the ratio you measure tells you whether one calibration fixes it or nothing does.diagnostic
- The automated count finds devices on some sheets and none on othersA count that looks credible until you notice level 3 came back empty is telling you something about the file, not about the model. The per-sheet table sorts the empty sheets into three groups in about an hour.diagnostic
- Two estimators take off the same set and return different quantitiesNeither of them is careless. They measured different things, because nobody wrote down where one condition stops and the next begins — and comparing totals hides exactly that.diagnostic
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