What bid leveling is, and why most GCs do it wrong
Bid leveling is the process of comparing subcontractor proposals on an apples-to-apples basis so you can make an award decision based on true cost, not just quoted price. Done well, it prevents the scenario every estimator has lived: the low bidder wins on price, three months into construction the “we-didn't-include-that” change orders start landing, and the low bid ends up costing more than the middle bid would have.
Done poorly — and in most estimating teams it's done poorly — bid leveling is copy-pasting sub bid amounts into a spreadsheet, eyeballing the totals, and hoping the scope gaps surface themselves. They don't.
The five-column bid leveling template
Every useful bid leveling sheet has the same structure. The columns matter; the software doesn't.
| Column | What it contains |
|---|---|
| 1. CSI line | Subdivision (4-digit MasterFormat). This is the normalized unit of comparison — not the sub's own line-item language. |
| 2. Scope description | What's actually being priced at this line. Pull from the project specification, not from the sub's bid. |
| 3. Sub A / B / C price | One column per bidder, with the price they attributed to this line. Blank if the sub didn't quote it (the key information). |
| 4. Variance | Spread between high and low. A big variance signals either scope misalignment or a real market dispersion — both are worth a conversation before award. |
| 5. Notes | Inclusions, exclusions, alternates, and clarifications that affect the line. This is where scope gaps get captured. |
The seven-step leveling process
- 1
Normalize to MasterFormat before you start
Classify every bid line item to a MasterFormat subdivision before building the sheet. Two subs who bid “electrical” might mean different divisions — Division 26, 27, and 28 are all distinct. Do this step first or the comparison is meaningless.
- 2
Build the baseline from the spec, not from a bid
The scope column should come from the project specification. If you build it from one sub's bid, you're silently accepting their interpretation of scope as the baseline — and grading every other bid against it.
- 3
Enter every sub's price, including zeros
A $0 or blank cell is information. It means the sub didn't quote that line — which usually means they excluded it. Making this visible at leveling time is the whole point.
- 4
Flag outliers on both ends
A sub 30% under the cluster is almost never a real deal. They missed scope. A sub 50% over might be hedging with contingency you can negotiate down, or might genuinely be bidding different work. Both deserve a call.
- 5
Reconcile inclusions and exclusions to the baseline
Go through each sub's inclusions and exclusions list and match them against your scope column. Any exclusion that doesn't have a matching exclusion on competing bids is a scope gap that needs a carry or a markup on the low bidder.
- 6
Adjust for alternates
If the project has add/deduct alternates, normalize every bid to the same set of alternates selected. Don't compare a base-plus-alt-1 bid against a base-only bid and call it leveling.
- 7
Make the award call on levelized cost, not quoted cost
After normalization, the adjusted numbers almost always tell a different story than the raw quotes. The low bidder in raw quotes is not the same sub as the low bidder after leveling, maybe half the time.
The scope-gap catch
The single most valuable outcome of disciplined bid leveling is catching scope gaps. A scope gap is work that needs to happen but that nobody's bid for — either because every sub excluded it, or because it falls between two trades and both assumed the other was handling it.
Common scope gaps, in rough order of frequency:
- Fire caulking between the drywall sub and the firestopping sub
- Blocking (wood or metal) between the framer and the finish carpenter
- Roof penetrations between the roofer and the MEP trades
- Pressure-treated sills between concrete and framing
- Weather protection and temporary enclosures across all trades
- Equipment pads and housekeeping pads between concrete and the MEP trades
When your leveling sheet has blanks in the same row across every sub, that's almost always a scope gap. Catching it at leveling time means you either get a carry in the low bidder's number or add a GC allowance. Either way, you know before award — not as a CO three months in.
When the template isn't enough
The five-column template is the right starting point. It stops being enough when:
- You're leveling six or more subs per package and the spreadsheet becomes unmanageable
- You want to build benchmarks from leveled data, not just use the sheet for one award
- You're comparing to historical bids on similar projects
- Your estimators spend more time building the sheet than analyzing it
At that point software replaces the spreadsheet. The structure stays identical — five columns, seven steps — but the data entry is automated and the benchmarks compound.
How PreconIntel handles bid leveling
PreconIntel parses every sub bid automatically — CSI classification, scope extraction, inclusions, exclusions, alternates — and builds the level sheet structure by default. Blank cells across subs are flagged as scope gaps. Outliers surface with variance detection against both peer bidders and your historical benchmarks. You make the award call; the sheet builds itself.