Skip to content
Back to blog

Construction Budget Template Excel: Why the Free Ones Always Say On Budget

15 min read·September 15, 2026
Chalk line reel, framing square and carpenter pencil on a plywood subfloor with a snapped blue chalk line, the fixed baseline of a construction budget

A free construction budget template in Excel will tell you that your last job finished on budget. It will tell you that about almost every job, because of how it is built, not because of how the job went. The budget column in those files is an ordinary editable cell, and an ordinary editable cell always ends up agreeing with the number beside it.

Here is the job we will run all the way through. A whole house renovation with a rear addition, fixed price contract of $412,000, seven month schedule, small general contractor. The bid was built from a $347,000 cost budget across twelve cost codes, an $18,000 contingency, and $47,000 of overhead and profit. Three owner change orders landed during the job and four unforeseen items hit the contingency.

At closeout the free template reported a total budget of $403,000 against $403,320 of actual cost. Overrun: $320, or 0.08 percent. On budget. The same job, tracked in a file with a locked baseline, reports that the original estimate was $56,320 light, that $17,930 of that was absorbed without a single approval, and that $7,245 of it was recoverable under the contract and was never claimed. Same project, same invoices, same contractor. One file can see it and the other cannot.

The Budget Column Is an Editable Cell, So the Baseline Evaporates

Every free template ships the same three columns: Budget, Actual, Variance. Nothing marks the budget column as a record of a decision rather than a working number, so it gets maintained like a working number.

The owner approves a $12,400 cabinet upgrade in month two. The project manager opens the sheet and changes cost code 25 from $28,000 to $40,400. This is not sloppiness. It is the correct thing to do in a file with one budget column, because otherwise the job shows a $12,400 overrun on cabinets that the owner already paid for. Month three, the rear deck change order adds $18,900 across five codes, and five more cells get edited. Month two also brought rot behind the rear wall sheathing, so framing goes from $62,000 to $68,300 and the contingency row drops from $18,000 to $11,700.

By month seven every budget cell has been dragged to within a few hundred dollars of its actual. The variance column reports what it was always going to report.

Cost codeBudget as editedActualVariance
06 Framing & Carpentry$81,300$81,300$0
16 Electrical$33,550$33,550$0
22 Flooring & Tile$41,180$41,180$0
25 Cabinets & Countertops$45,600$45,600$0
01 General Conditions$32,000$33,850($1,850)
Contingency$70$0$70
All other codes$169,300$167,840$1,460
Total$403,000$403,320($320)

Read that table as a stranger would. It says the estimate was excellent, the contingency was barely touched, and general conditions ran a bit long. Two of those three statements are false.

The fix is not a better formula. It is three columns where the free template has one. Original budget, typed once and then locked. Approved changes, fed from a change order log. Contingency transfers, fed from a drawdown ledger. Revised budget is the sum, =C5+D5+E5, and nobody types into it. Now the file can answer two different questions at once: am I beating the plan I am working to, and was the plan I sold any good.

Cost codeOriginalApproved changesContingencyRevisedActualvs Original
01 General Conditions$31,000$1,000$0$32,000$33,850($2,850)
02 Demolition$12,500$0$0$12,500$12,500$0
03 Concrete & Foundation$24,000$2,400$0$26,400$26,400($2,400)
06 Framing & Carpentry$62,000$13,000$6,300$75,000$81,300($19,300)
07 Roofing$18,500$900$0$19,400$19,400($900)
08 Windows & Doors$26,000$0$0$26,000$24,800$1,200
09 Insulation & Drywall$29,000$0$0$29,000$29,000$0
15 Plumbing$31,500$0$0$31,500$32,140($640)
16 Electrical$27,000$1,600$4,950$28,600$33,550($6,550)
17 HVAC$24,500$0$0$24,500$23,600$900
22 Flooring & Tile$33,000$1,500$6,680$34,500$41,180($8,180)
25 Cabinets & Countertops$28,000$17,600$0$45,600$45,600($17,600)
Total$347,000$38,000$17,930$385,000$403,320($56,320)

The $56,320 in the last cell is the number the free template destroyed. Of it, $38,000 is owner approved scope, which is not an estimating problem at all. The remaining $18,320 is what the estimate missed, and it is concentrated: framing, electrical, and flooring carry $34,030 of the $56,320 gap between them.

Contingency Is a Row, So Spending It Reads as a Transfer

The second structural defect is subtler and does more damage. In a free template, contingency is a line item sitting under the trades, budgeted at $18,000, with a blank in the actual column all year.

Watch what happens when you spend it. Rot behind the rear wall sheathing costs $6,300 in extra framing and an LVL. The framing row goes up $6,300 and the contingency row goes down $6,300. The grand total does not move. The variance column does not move. Nothing on the sheet changed color, made a sound, or printed differently. From the file's point of view a contingency draw is a transfer between two rows, and transfers are invisible by construction.

That is a problem, because contingency burn is the single best early warning a construction budget produces. It leads cost overruns by months, for a simple reason: the events that consume contingency happen when you open things up, and you open things up early.

The number to watch is not the balance. It is the balance against how much job is left. Contingency consumed, =1-(Contingency_Left/Contingency_Original), against percent complete by cost, =SUM(H:H)/($F$18+$B$2). When the first runs ahead of the second, you are consuming reserve faster than you are consuming project, and there is only one way that ends.

The Month the Sheet Should Have Screamed

MonthCost to dateDrawn this monthContingency consumedPercent completeGapFlag
1$41,000$00.0%10.2%-10.2 ptsOK
2$88,500$6,30035.0%22.0%+13.0 ptsOK
3$148,000$4,95062.5%36.7%+25.8 ptsFLAG
4$214,000$3,78083.5%53.1%+30.4 ptsFLAG
5$279,000$2,90099.6%69.2%+30.4 ptsFLAG
6$347,500$099.6%86.2%+13.4 ptsOK
7$403,320$099.6%100.1%-0.5 ptsOK

One formula produces that last column: =IF(B22-B23>0.15,"FLAG","OK"), where B22 is contingency consumed and B23 is percent complete. Fifteen points is a working threshold, not a law. Set it tighter on renovation work and looser on new construction, where the surprises arrive later and smaller.

The flag fires in month three. At that moment the job is 36.7 percent complete with $6,750 of contingency left. Straight line, the remaining 63.3 percent of the work is entitled to $11,390 of reserve. The job is $4,640 short of its own plan, in month three of seven.

Month three is also when that shortfall is still cheap to fix, because three of the twelve cost codes have not been bought out yet. Flooring, cabinets, and the tile scope are still quotes, not contracts. You can lock those prices this week, you can value engineer the backsplash before anyone has ordered it, and you can go back to the owner on the electrical while the panel is still open.

By month five the same gap is 30.4 points, the contingency balance is $70, and 30.8 percent of the job is still to run. Every remaining trade is under contract. There is nothing left to negotiate, nothing left to substitute, and no reserve to spend. The number is worse and the menu of responses is empty. That is the whole argument for tracking the burn rate rather than the balance.

Hardcoded Subtotals Break Silently When the Job Grows

The third defect is pure Excel, and it is the one that costs money on a Tuesday afternoon.

Free templates are outlines. Rows are grouped by phase, and each phase carries a subtotal like =SUM(B5:B12), with the grand total summing the subtotals. It looks tidy and it holds up exactly until the job changes.

Month three, the deck change order arrives. The project manager adds the new scope at the bottom of the structure block, on row 13, immediately under the last existing row. Excel does not extend =SUM(B5:B12) to include row 13. It expands a range when you insert inside it, not when you append below it. The deck lines sit on the sheet, formatted correctly, visible to everyone, and outside every total on the file.

Nothing turns red. The sheet still balances against itself. The $21,735 owner price for that change order simply never reaches the number the bookkeeper bills from, and the month four draw request goes out short by that amount. On a $150,000 line of credit at 10.5 percent, floating $21,735 for the three months until someone catches it costs about $570 in interest. The interest is the small part. The real problem is that you are now asking an owner to pay for a deck he watched get built four months ago, which is the hardest money in construction to collect.

The fix is to stop using an outline and start using a table. Put every cost code on one flat sheet, put every invoice, timecard, and purchase order on a second flat sheet formatted as a real Excel Table, and aggregate with =SUMIFS(Costs[Amount],Costs[CostCode],$A5). Structured references grow with the data automatically, so appending a row is safe by default rather than safe if you remember. A flat table also lets you slice by vendor and by phase from the same data, which an outline can never do because an outline commits to one hierarchy.

The Date Column Is Worth $7,245, Because the Contract Gives You 14 Days

Now the part that turns a bookkeeping gripe into real money.

Because a free template records a contingency draw as an edited cell rather than an event, it records no date, no cause, and no category. That missing date has legal weight. Under the AIA A201-2017 general conditions, section 3.7.4, if the contractor encounters subsurface or otherwise concealed physical conditions that differ materially from the contract documents, or unknown physical conditions of an unusual nature, the contractor "shall promptly provide notice to the Owner and the Architect before conditions are disturbed and in no event later than 14 days after first observance of the conditions." The 2007 edition gave 21 days. The 2017 edition cut it to 14.

Draw one on this job is a textbook 3.7.4 condition. Rot behind sheathing on a rear wall is not visible on a walkthrough, it differs materially from the drawings, and it cost $6,300 in framing labor and an LVL. Priced as a change order at this contractor's 15 percent markup, that is $7,245 of contract value the owner owed. The superintendent found it, the carpenters fixed it that week because the crew was standing there, the project manager moved $6,300 from the contingency row to the framing row, and nobody wrote down the date. The claim was never made. Fourteen days later it could not be.

Be honest about the rest of the ledger, though, because not every surprise is a claim. Draw two, aluminum branch wiring requiring a whole house pigtail, is visible the moment you pull the panel cover during a pre-bid walk on a house of that vintage. It is not concealed and it is not unusual. That is an estimating miss, and calling it a concealed condition in month three is how a contractor loses credibility on the claims that are real. The category column forces you to make that call while you still can, instead of reconstructing it from invoices in January.

Pricing the change itself is its own discipline, and a flat percent on cost is the fast version rather than the defensible one. Our construction change order markup calculator breaks the price into five layers, which matters most on exactly these mid job conditions where labor burden and schedule impact do the damage.

The Layout That Survives a Real Project

Ten columns on the budget sheet, three supporting sheets, and one rule: only column C is typed, and only once.

ColumnHoldsFormula
ACost codeTyped once
BDescription=XLOOKUP($A5,Codes[Code],Codes[Description])
COriginal budgetTyped at award, then locked
DApproved changes=SUMIFS(COLog[Amount],COLog[CostCode],$A5,COLog[Status],"Approved")
EContingency transfers=SUMIFS(DrawLog[Amount],DrawLog[CostCode],$A5)
FRevised budget=C5+D5+E5
GCommitted=SUMIFS(Commit[Amount],Commit[CostCode],$A5)
HActual cost to date=SUMIFS(Costs[Amount],Costs[CostCode],$A5)
IVariance vs revised=F5-H5
JVariance vs original=C5-H5

Column C is locked with Review, then Protect Sheet, with the unlocked property cleared on C only. This is a two minute step and it is the entire defense of the baseline. If the original budget can be changed by anyone who opens the file, it is not a baseline, it is a rumor.

Column G deserves a warning, because it is the one defect in this list that is too big to cover here. Committed cost is money you owe the moment a subcontract is signed, months before the invoice arrives, and a budget that tracks only invoices reports a job as half spent while it is fully committed and already over. That mechanism has its own walkthrough in how to track construction costs in Excel, and the two sheets share the same cost code list by design.

The change order log sheet carries the CO number, date, description, cost code, cost amount, markup rate, price to owner as =E5*(1+$B$4), and status. Status is what column D filters on, so a change order that has been discussed but not signed shows up nowhere in the budget, which is correct.

The Ledger Column That Prices Next Year's Contingency

The drawdown ledger is the sheet no free template has, and it is seven columns.

DrawDateCodeCauseCategoryAmountBalance
1Month 206Rot behind rear wall sheathing, LVL and sisteringConcealed$6,300$11,700
2Month 316Aluminum branch wiring, pigtail whole houseEstimating$4,950$6,750
3Month 422Subfloor out of level, 900 sf of underlaymentEstimating$3,780$2,970
4Month 522Tile sub defaulted, replacement sub premiumProcurement$2,900$70

Running balance is =$B$2-SUM($F$5:F5), with the anchored first reference and the relative second, so it accumulates as you fill down. The date column feeds a notice deadline, =IF(TODAY()-$B5>14,"LAPSED","OPEN"), which is the cheapest insurance in the file.

The category column is the one that pays. Sort the ledger by it and the $17,930 splits into three different problems with three different owners.

CategoryAmountPercent of cost budgetWhat it really isWhat actually fixes it
Concealed$6,3001.82%Not visible before demolitionCarry reserve, and give notice inside 14 days
Estimating$8,7302.52%Visible on a pre-bid walkA walkthrough checklist, not contingency
Procurement$2,9000.84%A sub who never committed in writingSigned sub commitments before you sign the prime
Total$17,9305.17%

This job consumed 5.17 percent of its cost budget in contingency. Most small contractors carry 3 percent, because 3 percent is what they heard. Had this contractor carried 3 percent, or $10,410, the $7,520 difference would have come out of the $47,000 fee. That is 16.0 percent of the profit on a job that the free template called on budget. Run six jobs like it in a year and the number is $45,120.

But 5.17 percent is the wrong number to carry forward too, and this is the part the category column exists to show. Only $6,300 of that draw, 1.82 percent, was genuinely unknowable. The other 3.35 percent was findable: a panel cover and a six foot level would have caught $8,730 of it in about ninety minutes, and a signed sub commitment would have caught the remaining $2,900. Contingency is the price you pay for not looking. The formula that carries the right number into the next bid is =SUMIFS(DrawLog[Amount],DrawLog[Category],"Concealed")/$B$1, run across every job you have closed, not across the one you remember.

Two contractors can bid the same house at the same total price, one carrying 5 percent contingency on a soft estimate and the other carrying 2 percent on a hard one. They look identical to the owner. They are not remotely identical, because only one of them knows which line is wrong when the number moves.

What To Fix Before the Next Job Starts

None of this is retroactive. A baseline you lock in month four is not a baseline, so the work has to land between award and the first invoice. Four things, in order:

Split the budget column into three, type the original once, and protect the sheet so column C cannot be edited. Move the contingency out of the row list and into its own ledger with date, cause, and category. Rebuild every subtotal as =SUMIFS() against an Excel Table so appending a row cannot break the arithmetic. Then add the two percentages, contingency consumed and percent complete, to the top of the sheet with a flag between them, and look at exactly that pair once a month.

The fourth one takes ten minutes and is worth more than the other three combined, because it is the only one that changes what you bid rather than what you know.

If you would rather not rebuild this from scratch, the SheetCraft Construction Budget Tracker ships with the locked original column, the change order log wired into column D, the drawdown ledger with its category field and its 14 day notice flag, and the consumed against complete alarm already on the summary tab. It is the file described above, built and tested, so the only thing you have to supply is the discipline of typing the original budget once.

Related template

Construction Budget Tracker

Track every line item, change order, and payment across your entire project. Spot a $23K billing discrepancy before it hits your bottom line — not after.

Get the Template — $49