The Short Version
I've worked with builders who ran their first bid-to-actual analysis and found that a single cost category — framing labor — was running 14% over estimate on every project for two years. Two years of compounded underpricing. Once they found it and updated their labor rate, that one number change added $40,000 to the bottom line on the following year's volume. The analysis took one afternoon. The return was immediate and permanent. This post covers how to run the analysis, which five line items carry the most variance for most builders, how to structure a quarterly review, and how to use the findings to produce better estimates going forward.
Sound Familiar?
Bid-to-actual analysis is overdue if:
- You know jobs are going over budget, but you can't pinpoint which cost categories are consistently the problem
- Your estimating template uses rates from memory or from jobs you completed 18+ months ago, not from systematic review of recent actuals
- You've given raises and added crew in the last 12 months but never updated your labor rates in your estimates
- When a job finishes over budget, your postmortem is a conversation, not a line-item comparison
- You use the same contingency percentage on every job regardless of scope complexity
- Your project managers have told you the estimates feel off but nobody has been able to show exactly where
What We Found
How to Run a Bid-to-Actual Analysis: The Mechanics
A bid-to-actual analysis compares your original estimate — the number you gave the client — against the actual job cost report for a completed project. The goal is not to explain a single job. It's to find patterns across multiple jobs that reveal systematic errors in your estimating rates.
Here's the process:
Step 1: Select the right jobs. Pull 4–6 jobs completed in the last 90–120 days. They should be comparable in type — if you build custom homes and do renovations, run the analysis separately by project type. Mixing a gut renovation with a new build produces noise that obscures patterns. The comparison is most useful when scope complexity is roughly similar across the jobs you're reviewing.
Step 2: Export the original estimate and final job cost report. For each job, you need two documents side by side: what you estimated by cost category, and what was actually spent in each category. If your PM software doesn't produce this comparison automatically, build it in a spreadsheet. Column A: cost category. Column B: estimated amount. Column C: actual amount. Column D: variance (actual minus estimated). Column E: variance as a percentage of estimated.
Step 3: Calculate variance by line item, not just total. A job that came in 3% over budget overall may have had framing labor 18% over and materials 12% under — those two errors partially cancelled out. If you only look at the total, you miss both. You're looking for line items where the variance percentage is consistently above 8% in the same direction across multiple jobs.
Step 4: Flag systematic versus random variance. Random variance is expected. One job had unusual site conditions. One sub ran into unexpected scope. These aren't estimating errors — they're job-specific events. Systematic variance is what you're hunting: the same line item running over (or under) on 3 out of 5 jobs means your template rate for that category is wrong. That's a fixable problem.
Step 5: Update your template. For every line item with systematic variance above 8%, recalculate the correct rate using your actuals data and update the template. Document the change and the date so future audits can track whether the correction held.
The "Flying Blind" Problem This Fixes
Running a construction company without real-time financial data — not knowing which jobs are profitable, what the true overhead burden is, or what net margin actually looks like. Bid-to-actual analysis is the mechanism that breaks this pattern — it replaces gut feel with systematic data, so every estimate you build is informed by what things actually cost, not what you thought they'd cost two years ago.
The entire process takes 3–4 hours for a set of five jobs once your job cost data is organized. After the first cycle, subsequent reviews run in 90 minutes because you already have the comparison framework built.
The 5 Line Items With the Biggest Variance in Most Construction Businesses
Across the analysis work I've done with builders running $1.5M–$15M, five categories produce the most systematic variance. These are the ones to check first when you run your review.
1. Framing Labor
Framing is the single largest labor line on most residential projects, which makes it the highest-dollar impact when the rate is wrong. The most common error: builders use a blended framing labor rate that doesn't account for the actual mix of crew on recent projects. If you've brought on higher-cost framing leads or shifted from a sub to an in-house crew (or vice versa), your template rate may be stale by 12–20%. On a $500,000 project where framing labor represents $60,000 of cost, a 15% rate error is $9,000 per job.
Check this first. Pull 5 completed jobs, compare estimated framing labor against actual framing labor invoiced, and calculate the variance percentage. If it's consistently above 8% in one direction, your rate is wrong.
2. Mechanical Subcontractors (HVAC, Plumbing, Electrical)
Mechanical sub pricing is volatile and market-specific. HVAC quotes in particular move quarter-to-quarter in most markets based on equipment availability, crew backlog, and material costs. The error pattern I see most often: a builder uses a mechanical sub quote from a job they closed eight months ago as a template reference for new bids, without getting updated pricing. On a $300,000 new home with $55,000 in MEP subs, that stale reference point can generate $6,000–$12,000 of variance per project.
The fix is a quarterly rate check with your primary mechanical subs — a 15-minute call that produces a current pricing benchmark for your template.
3. Project Management Hours
Most builders systematically underestimate the PM time required on complex renovations. Template PM hours are often calculated based on intuition — "I'll spend about 15 hours managing this" — rather than actual time logged on comparable completed jobs. When you run the actuals comparison, PM time routinely runs 25–40% over template on jobs with custom millwork, finicky clients, or significant sub coordination. Since PM time is burdened overhead (usually $45–$85/hour fully loaded), this is a real margin item.
The fix is a PM time log on every active project. After 6 months of tracking, you have actual data to build more accurate PM time estimates by project type and complexity tier.
4. Lumber and Sheathing
Lumber is a commodity that moves. If your template lumber rates were last updated when framing a project 14 months ago, they may be off by 10–25% depending on what the market has done since. This is the line item most builders know is "probably off" but haven't formally quantified. The bid-to-actual analysis makes the variance concrete — and once you see that your lumber estimates are running 18% low across four jobs, you'll update the rates immediately.
Update lumber and sheathing rates quarterly. The Random Lengths framing lumber composite index is a free public reference that takes five minutes to check.
5. Permit Fees and Inspection Costs
Permit fee schedules change. Jurisdictions update their fee structures, add new inspection categories, or change valuation-based fee calculations. Most builders set a permit estimate once and never update it. When the fee schedule changes — especially on value-based fee structures where a rising project cost estimate triggers a higher permit fee — the variance shows up as a cost overrun on the job. It's not a large-dollar item on most projects, but it's an easy fix and it compounds across high-volume permit jurisdictions.
Cost of untracked scope leakage
Gap Selling analysis: a builder running $3M in annual revenue who leaks just 5% through undocumented changes, untracked labor, and informal scope creep loses $150,000 in profit annually — equivalent to 3 full additional projects just to break even on the leak. Systematic estimating errors across these five categories are exactly this kind of invisible leak — they don't show up as a single dramatic loss, they accumulate quietly across every job until you run the analysis and find the pattern.
The Quarterly Review Cadence That Keeps Estimates Accurate Over Time
A one-time bid-to-actual review is valuable. A quarterly discipline is transformational. Here's how to structure the recurring process so it takes one afternoon, not three days.
The Quarterly Review Structure
Schedule a recurring 3-hour block each quarter — January, April, July, October. Pull all jobs closed in the previous 90 days. The minimum meaningful sample is three jobs; five to six gives you better statistical confidence. Run the five-column comparison for each job, aggregate the variance data across all jobs, and identify any line item with systematic variance above 8%.
The January review is also your annual template update: review all labor rates, update material benchmarks, and document any changes to your overhead structure (new hires, equipment, insurance changes) that affect your overhead rate calculation.
The PM Debrief: The Data the Spreadsheet Misses
The quantitative variance analysis catches rate errors. It doesn't catch context. A line item that ran 22% over on one job might be a scope exception, not a rate error — the site had unusual conditions, the sub ran into code compliance issues, the client changed mind three times. That context doesn't show up in a spreadsheet comparison.
Pair the quantitative review with a 20-minute PM debrief after every closed job. Ask three questions: What ran over, and why? What came in under, and why? Would the same scope generate the same variance on a different job, or was this specific to this project? The PM's field knowledge fills the gap the numbers leave. Together, they produce a complete picture.
The Template Maintenance Discipline
Every identified systematic variance should produce a specific template update with a documented date. Build a simple change log — a running record of what was updated, when, and what data drove the change. When a job goes over budget six months later, you can check the change log to see whether the relevant rate was updated after your last review. If it was and the job still ran over, you're looking at a scope problem, not a rate problem. If it wasn't updated, you've identified a gap in your review discipline.
The builders who run tight, accurate estimating systems aren't better at construction than the ones who don't. They're better at the feedback loop. The estimate is a hypothesis about what a job will cost. The actuals are the test results. The quarterly review is how you incorporate the test results into the next hypothesis. Skip the review and you're not learning — you're guessing with stale data.
What Clean Job Cost Data Requires
The bid-to-actual analysis is only as good as your actuals data. If invoices aren't coded to the correct job, if labor hours aren't logged against the right project and cost code, or if sub invoices are sitting unprocessed, your comparison produces misleading variance numbers. Before you can trust the analysis, you need clean job cost accounting: every transaction assigned to the right job and cost code, every sub invoice entered before the job closes, and labor hours tracked consistently.
If your job cost data isn't clean enough to do this analysis, that's the first thing to fix — not because the analysis is more important than anything else, but because clean job cost data makes everything downstream better: cash flow visibility, change order documentation, billing accuracy, and the bid-to-actual analysis you now know to run.
If you want to assess where your estimating and financial systems actually stand right now, a strategy call is where we start — 45 minutes to map your current state and identify the highest-leverage fixes.
Stop Guessing Where Your Profit Is Going
Download the Profit Leak Checklist used by 300+ builders. Find the exact cost codes, billing gaps, and overhead mistakes hiding in your numbers — free, instant download.
Get the Free Checklist →Frequently Asked Questions
A bid-to-actual analysis compares your original estimate for a completed job against what the job actually cost, line item by line item. The goal is to identify which cost categories are systematically over or under your estimates — not to explain any single job, but to find patterns across multiple jobs that reveal errors in your template rates. For example, if framing labor runs 15% over your estimate on four out of five jobs, your framing labor rate in the template is 15% low. Running this analysis quarterly and updating your template based on the findings is the most reliable way to keep your estimates accurate over time.
Quarterly is the right cadence for most builders running $1.5M–$15M. Once a quarter, pull all jobs closed in the previous 90 days (3–6 jobs is a meaningful sample), run a line-by-line comparison of estimated versus actual costs, and update your template for any category showing systematic variance above 8%. January is also the annual review cycle for labor rates and material benchmarks. Waiting until year-end to reconcile means you carry estimating errors for 9–12 months before fixing them. Quarterly discipline limits the damage to 90 days of compounding on any systematic error.
In order of typical impact across residential builders: (1) framing labor — the highest-dollar labor line, and rates go stale quickly with crew changes or raises; (2) mechanical subcontractors (HVAC, plumbing, electrical) — volatile pricing that changes quarterly in most markets; (3) project management hours — routinely underestimated on complex renovations with high sub coordination; (4) lumber and sheathing — commodity pricing that moves independently of your template update schedule; (5) permit and inspection fees — jurisdictions update fee schedules and most builders don't track the changes. Running the bid-to-actual analysis on these five categories first captures 80% of the systematic variance in most construction estimating systems.
Systematic variance shows up on the same cost category across multiple different jobs. If framing labor runs 14% over on four out of five jobs you review, your framing labor rate is wrong — that's a template error. If framing labor runs 35% over on one specific job but is at or under estimate on the other four, that's a job-specific event — unusual conditions, scope that wasn't captured, or a sub who underperformed on that project. Fix systematic variance by updating template rates. Handle job-specific variance through the PM debrief process and change order discipline. Conflating the two produces wrong fixes: you might raise your contingency when the real problem is a stale labor rate, or update your template based on an outlier job that doesn't represent your typical work.
You need two things for each completed job: the original estimate broken down by cost category (labor, materials, subs, indirect costs), and a final job cost report showing actual costs in the same categories. The analysis is only as accurate as your actuals data — which requires that every invoice is coded to the correct job and cost code, sub invoices are entered before the job closes, and labor hours are tracked by job and category. If your job cost data is unreliable because of inconsistent coding or missing entries, fix the data discipline first. The bid-to-actual analysis on dirty data produces misleading variance numbers that can send your template in the wrong direction.