Expert guide
Construction Change Order Log in Excel
Every scope change priced, approved and billed, so extra work does not become free work
Call us at +1 (385) 386-3860
Short answer: keep one Excel Table of change orders across all jobs with number, job, description, reason, cost breakdown, contract markup, price, schedule impact, status, approval reference and billed amount. Calculate revised contract value per job with SUMIFS on approved changes, flag work "proceeding at risk", and review unapproved and unbilled totals weekly. Feed approved changes into your construction job costing spreadsheet.
On most construction jobs, margin is won or lost on changes. The base contract was priced carefully; the extra outlet, the moved wall and the unforeseen rock were agreed on site with a handshake. If those changes are not written up, priced, approved and billed, the contractor pays for them. A change order log is the simplest control that stops that happening, and Excel is where most small and mid-sized contractors keep it.
The Log Structure
| Column | Example | Why |
|---|---|---|
| CO No | J2614-CO-007 | Job number plus sequence; never reuse numbers |
| Job | J2614 Riverside Clinic fit-out | Links to job costing |
| Raised / Requested by | 2026-10-14, Owner's PM | Who asked for it |
| Description | Add 6 data outlets, level 2 | Specific enough to price and bill |
| Reason | Owner request / Design change / Unforeseen / Our error | Trends and recoverability |
| Labour, Materials, Equipment, Subcontract | Cost columns | Direct cost build-up |
| Price to owner | Formula | Cost plus contract markup |
| Days impact | 2 | Schedule claims |
| Status | Pricing / Submitted / Approved / Rejected / Proceeding at risk | Control |
| Approved on, Approval ref | Date, signed CO or email reference | Evidence |
| Billed, Invoice no | Amount, number | Closes the loop |
Formulas
Direct cost:
=SUM([@Labour], [@Materials], [@Equipment], [@Subcontract])
Price to owner (compounding overhead then profit; check your contract):
=ROUND([@DirectCost] * (1 + Settings!Overhead) * (1 + Settings!Profit), 2)
Self-performed vs subcontract markups often differ:
=ROUND(([@Labour]+[@Materials]+[@Equipment]) * (1+Settings!OHP_Self)
+ [@Subcontract] * (1+Settings!OHP_Sub), 2)
Days since submitted (for chasing approvals):
=IF([@Status]="Submitted", TODAY() - [@SubmittedOn], "")
Unbilled approved amount:
=IF([@Status]="Approved", [@Price] - N([@Billed]), 0)Keep markup percentages on a Settings sheet, per job if contracts differ, rather than typing them into formulas. When a contract specifies different markups for self-performed and subcontracted work, the second price formula handles it.
Revised Contract Value per Job
On a Jobs summary table:
Original contract: (entered)
Approved changes: =SUMIFS(tblCO[Price], tblCO[Job], [@Job], tblCO[Status], "Approved")
Revised contract: =[@[Original contract]] + [@[Approved changes]]
Pending changes: =SUMIFS(tblCO[Price], tblCO[Job], [@Job], tblCO[Status], "Submitted")
At-risk exposure: =SUMIFS(tblCO[DirectCost], tblCO[Job], [@Job],
tblCO[Status], "Proceeding at risk")
Unbilled approved: =SUMIFS(tblCO[Unbilled], tblCO[Job], [@Job])At-risk exposure uses direct cost, not price, because that is what you lose if the change is never approved.
The Weekly Change Order Review
Pricing for more than 5 days
Changes discussed on site but not yet priced. Every day without a price weakens the position.
Submitted for more than 14 days
Chase approvals; escalate the longest-waiting.
Proceeding at risk
Total exposure by job and by project manager.
Approved but unbilled
Should appear on the next progress claim.
Our-error changes
Not billable, but worth tracking: they show where estimating or coordination needs attention.
Reason Analysis Across Jobs
A PivotTable of change order value by Reason and by Job, or by client, often reveals patterns: one architect whose drawings generate most design changes, one type of job where unforeseen conditions are routine and should be priced as contingency next time.
Where AI Helps on Site and in the Office
Turn a site supervisor's voice note or text into a clear, priceable change description.
Draft the change order cover letter from the log row for the PM to edit.
Summarise long email threads to find when and by whom a change was instructed.
Classify change reasons consistently from free-text descriptions.
Avoid letting AI price changes; pricing comes from your rates and quantities. For classification and drafting, the setup in calling the OpenAI API from Excel VBA works with the log directly.
Connecting to Job Costing and Bids
Change orders revise both the budget and the contract. Code change order costs to the CO number in your job costing spreadsheet to see whether each change made money. On the front end, your bid tracking spreadsheet shows which clients and project types generate the most changes. Contractors running many jobs with several PMs often move this into a shared database such as our job costing Access database, so everyone works from one log.
FAQ
Change order log FAQ
Structure, markup and approvals