An estimate vs actual report puts what you allowed for each part of a job next to what it really cost, line by line, so you can see which allowances keep coming in short. Done on one job it tells you little, because every job has surprises. Done across several finished jobs it shows the habits in your estimating, such as a trade you always under-allow for. Most builders never do it, because the estimate and the accounts use different categories. Line up the cost codes once and the comparison becomes a short routine after every job.
When was the last time you finished a job and went back to compare what you estimated with what it really cost? Not just the total. Labour, materials, plant and subcontractors, each on its own.
The pattern nobody catches on one job
Looking at one job on its own doesn't tell you much. The value comes from looking across several. Here's an example across four finished jobs for a made-up residential builder. The figures are invented to show the method.
- Job A, single-storey extension: carpentry labour estimated at 420 hours, actual 480. Over by 60 hours.
- Job B, two-storey new home: carpentry labour estimated at 900 hours, actual 1,010. Over by 110 hours.
- Job C, kitchen and bathroom renovation: carpentry labour estimated at 210 hours, actual 236. Over by 26 hours.
- Job D, granny flat: carpentry labour estimated at 380 hours, actual 425. Over by 45 hours.
On each job, the overrun looked like bad luck: a wet week, a late delivery, a client who changed their mind. Side by side, all four ran over by roughly an eighth. That's an estimating habit. The fix is to look at what the allowance assumes (crew size, productivity, set-up and pack-up time, travel) and adjust the rate, then check whether the next few jobs come in closer.
The same exercise often shows the opposite too: a category where you always allow more than you need. That's money you could take off a tender price without taking on more risk.
Plenty of builders price the next job from gut feel and the last price they can remember. If you never go back and check, you keep making the same errors. You keep underestimating concrete labour. You keep missing the extra week of scaffolding. You keep forgetting the clean-up at the end.
Why most builders don't do it
It's not that they don't care. It's that the comparison is hard to do:
- The estimate and the costs use different categories. The estimate says "framing", the accounts say "materials" and "wages".
- Costs aren't tagged to jobs consistently, so the actual figures are incomplete.
- Labour hours aren't recorded against jobs, only total hours for payroll.
- Variations are mixed in, so it's hard to tell an estimating miss from a scope change.
- There's no time, because the next job has already started.
The first one is the real blocker. Fix that and the rest get much easier.
Line up the cost codes first
An estimate vs actual report only works if the estimate and the actual costs are sorted the same way. That means one list of cost codes, used in three places:
- The estimating system. Each line of the estimate carries a cost code, such as preliminaries, demolition, concrete, carpentry labour, carpentry materials, roofing, plumbing, electrical, plastering, painting and site clean-up.
- The job or project system. When the job is won, the estimate becomes the budget with the same codes. Purchase orders and subcontracts are raised against those codes.
- The accounts. Supplier bills and timesheet costs are coded to the job and the same cost code, using a job or project feature, tracking categories or a job module, depending on your accounting software.
Keep the list short enough that people will use it correctly. Twenty codes used properly beat two hundred used at random. Split labour from materials where you price them separately, because labour is where most estimating misses hide. And keep a separate code, or a separate tag, for variations.
This is the same structure job costing and WIP reporting need, so the work pays off three times. Our article on whether you're tracking job costs or just guessing covers the setup in the accounts.
A simple estimate vs actual report layout
One row per cost code, with these columns:
- Cost code and description.
- Original estimate: what you allowed when you priced the job.
- Approved variations: the cost side of variations on this code.
- Revised budget: original estimate plus approved variations.
- Actual cost: everything coded to this job and cost code, including committed costs still to be billed if the job isn't finished.
- Difference: actual cost minus revised budget.
- Difference as a share of the budget: difference ÷ revised budget.
- Hours estimated and hours actual: for labour codes.
- Note: why it was out, in a few words, written by the PM or estimator.
Here's one job laid out that way. Again, the figures are invented, in thousands of dollars:
- Concrete: estimate 48, variations 0, revised budget 48, actual 46, difference −2. Note: pump hire cheaper than allowed.
- Carpentry labour: estimate 86, variations 4, revised budget 90, actual 101, difference +11. Note: hours over on the frame stage; same as the last three jobs.
- Carpentry materials: estimate 64, variations 6, revised budget 70, actual 72, difference +2. Note: timber price rise between quote and order.
- Roofing (subcontract): estimate 38, variations 0, revised budget 38, actual 38, difference 0.
- Plastering (subcontract): estimate 27, variations 2, revised budget 29, actual 33, difference +4. Note: subcontractor claim above the order; check the scope.
- Site clean-up and skips: estimate 5, variations 0, revised budget 5, actual 9, difference +4. Note: allowance too low; it is on most jobs.
Two lines need action: carpentry labour, which has now run over on four jobs in a row, and site clean-up, which is a cheap fix to the estimating template. Plastering needs a look at why the claim came in above the order before the same subcontractor is used again.
The variations column matters. Without it, the carpentry line would look worse than it is, and you might blame the estimator for a scope change the client asked for.
How to close the loop
- Use the same cost codes in your estimate, your job system and your accounts. This is the single most useful change.
- Tag every cost and every hour to a job and cost code as it comes in, not at month end.
- Keep variations separate, with their own price and costs, so they don't hide estimating misses.
- Hold a short review when each job finishes. Put estimate and actual side by side for each cost code and ask which lines were out, and why.
- Write down what you learned and update your estimating rates or checklist. A lesson that lives in someone's head gets forgotten. Record the date each rate was last checked, so estimators know how far to trust it.
- Look across jobs every quarter. Patterns show up across several jobs that you can't see in one.
- Do the same for subcontractors. Record each subcontractor's quoted price, final price and variations on every job. Over a few jobs you'll see who delivers on price and who regularly comes back with extras.
Using it at tender time
The builder who knows their real costs can price with more confidence than the one working from memory. Sharpen the price on the lines where your history says you're safe, and hold firm on the lines where it says the risk is real.
Clients and head contractors also ask more often how you control costs and report progress. If you run an estimate vs actual review on every job and a weekly cost report on live jobs, say so in the tender in a few plain sentences. A specific, honest description of what you actually do is more persuasive than general claims.
Making the comparison automatic
Doing this by hand works, but it's easy to let slide. When the estimating system, job system and accounts share one set of cost codes and are connected, the estimate vs actual report can be produced for every job without anyone building a spreadsheet. It can also run while the job is live, so you see a line going over in week three rather than at handover. That's the same report as budget vs actual, just kept current.
We set this up as part of construction job costing. For weekly job numbers, our page on why job profit shows up too late explains where the delays usually sit, and our cost leakage article covers the other places margin goes.
Frequently asked questions
What is an estimate vs actual report in construction?
A report that shows, for each cost code on a job, what you estimated, any approved variations, what it actually cost and the difference. It's the main tool for improving future estimates.
What's the difference between budget vs actual and estimate vs actual?
They use the same layout. Estimate vs actual usually means looking back at a finished job to improve the next estimate. Budget vs actual usually means checking a live job against its budget, which is the estimate plus approved variations, so you can act while the job is running.
How do I make my estimate and my job costs line up?
Use one list of cost codes in the estimating system, the job system and the accounts, and code every bill, purchase order and timesheet to the job and cost code when it's entered. Keep variations on their own code or tag.
How often should I compare estimates to actual costs?
At the end of every job, and across a group of recent jobs every quarter. On bigger jobs, check during the job too, so you can act on overruns.
Can I do estimate vs actual in my accounting software?
Partly. Most accounting systems can report costs by job, and some by cost code. Matching those against your estimate line by line needs the same cost codes in both, and usually a connection between your estimating and accounting systems, because the estimate itself doesn't live in the accounts.
What if my actual costs are incomplete?
Fix the tagging first. Untagged bills and labour hours that aren't recorded against jobs are the usual gaps. On a live job, include committed costs from purchase orders and subcontracts, or the actuals will look better than they are.
If you'd like estimate vs actual reporting without the spreadsheet work, book a free initial chat.