Blog / Construction Operations

Bid Leveling Spreadsheet: Compare Subcontractor Bids Line by Line

By Keyona Meeks, Founder, ReRev Labs · Oct 31, 2026 · 9 min read

The short answer: Bid leveling means putting subcontractor bids side by side, line by line, so you compare the same scope. In a spreadsheet, list the scope lines down the side and each bidder across the top. Then three formulas do most of the work: one flags a line where a bidder left a price blank, one flags a line priced far below the median, and one adds up the lines each bidder did not price. This tracks and compares. It does not tell you who to hire. I tested the formulas in LibreOffice with made-up numbers.

By the end of this post, you'll be able to:

  • Lay out a bid leveling sheet that compares the same scope.
  • Flag scope gaps and unusually low lines with formulas.
  • See, for each bidder, how many lines they left unpriced.
  • Know what the sheet cannot judge.

I sell build work, and I am not an estimator. I have no field experience to offer, and nothing here tells you how to price or award a job. This is a spreadsheet pattern for lining up numbers so a person can see what is missing. The person still reads the bids, calls the subs and decides.

What is bid leveling?

It is the work of making bids comparable. One electrician includes the fixtures and another does not. One concrete sub prices the pump and another assumes you will. The totals look like a comparison, but they are not, because they cover different scope. Leveling puts the scope on common ground so the difference in price is a difference in price.

A total at the bottom of a bid proves nothing until you know what is in it.

How do you lay out the sheet?

Scope lines go down column A. Each bidder gets a column. A line a bidder did not price stays blank, because a blank is information. A zero says "included at no charge," which is a different statement.

ColumnWhat goes in it
A. Line itemFootings, slab, walls, rebar, pump
B. Scope noteWhat the line covers, in a few words
C, D, E. BiddersThe amount each priced, or blank
F. MedianFormula, below
G. LowestFormula
H. HighestFormula
I. SpreadFormula
J. FlagFormula

Put the names of the bidders in C1, D1 and E1. The formulas count how many names are in that row, so adding a bidder means adding a column and widening the ranges.

Add a setting next to the table. In L1 type Low flag if below median by and in M1 type 0.25. That means a line is flagged if the lowest price is more than 25 percent under the median. It is a starting number, and I chose it for the example. Pick your own.

Which formulas do the work?

For row 2, with bidders in C to E:

F2: =IF(COUNT(C2:E2)=0,0,MEDIAN(C2:E2))
G2: =IF(COUNT(C2:E2)=0,"",MIN(C2:E2))
H2: =IF(COUNT(C2:E2)=0,"",MAX(C2:E2))
I2: =IF(COUNT(C2:E2)<2,"",(H2-G2)/G2)
J2: =IF(COUNT(C2:E2)<COUNTA($C$1:$E$1),"Gap",IF(MIN(C2:E2)<F2*(1-$M$1),"Low",""))

Fill them down. COUNT counts the cells with numbers, so blanks are not counted. COUNTA counts the bidder names. When fewer bidders priced a line than there are bidders, the flag says "Gap." If everyone priced it but the lowest is far under the median, it says "Low."

At the bottom, for bidder C and lines 2 to 6:

Total priced:            =SUM(C2:C6)
Lines missing:           =COUNTBLANK(C2:C6)
Missing lines at median: =SUMPRODUCT((C2:C6="")*($F$2:$F$6))

Copy each across to D and E.

What did the test show?

I tested the formulas in LibreOffice with five made-up lines and three bidders. One bidder priced footings at 600 when the others were at 1,000 and 1,100, and the line showed "Low" with a spread of more than 80 percent. Three lines where a bidder left a price blank showed "Gap." A line all three priced and that sat close together showed nothing. Bidder C's "lines missing" showed 2, and "missing lines at median" showed 2,460, the sum of the median price of the two lines they skipped.

Two behaviors to know. "Gap" wins over "Low," so a line with a blank and a low price shows "Gap" only. And the "missing lines at median" figure is a rough pointer to the size of the hole. It is not a price, and it is not what the sub would charge. I did not test the formulas in Google Sheets, so type a few test rows and check.

What does a flag mean?

It means "look here." Nothing more.

  • Gap. The sub may have left it out, included it in another line, or assumed someone else covers it. Call and ask.
  • Low. The sub may have found a better way, made a mistake or missed part of the scope. Call and ask.

The federal acquisition rules show the same instinct. FAR 14.407-1, on sealed bidding by federal agencies, says: "After the opening of bids, contracting officers shall examine all bids for mistakes." For an apparent mistake, it says the officer "shall request from the bidder a verification of the bid." Source: FAR 14.407-1, read as an excerpt on October 30, 2026. That rule governs federal agencies, not a general contractor reviewing sub bids, and I am using it only as an official example of examining bids for mistakes and asking the bidder to verify. Whether any rule applies to your project depends on your contract and your state. Check with an attorney.

What should the sheet not decide?

  • Who to award. Price is one input. Schedule, capacity, safety record and references are not in the sheet.
  • Whether a low bid is a mistake. Only the sub can say.
  • Whether a gap is real. Scope can sit in a different line.
  • Anything your bid documents or the law require.

What does a sub need to confirm?

Before you rely on a leveled number, ask each sub in writing to confirm what their bid includes and excludes. Keep the reply in the file. Add a column for "confirmed on" and a date. A leveled sheet with no confirmations is a guess in a neat table.

Where does an LLM fit in this?

An LLM can help read a messy bid, such as a PDF or an email with scope buried in paragraphs, and suggest which line each price belongs to. A person should check every mapping against the document, because a number in the wrong row quietly breaks the comparison. The median, the gap count and the flags are plain rules, and they do the same thing every time. My stance: AI writes the code, plain automation runs it, and an LLM shows up only where the input is messy and a person checks the result. For other jobs worth automating next, see what to automate first.

How do you test the sheet?

  1. Enter five lines and three bidders with made-up numbers.
  2. Leave one cell blank. Confirm the row says "Gap."
  3. Set one price far below the others. Confirm "Low."
  4. Add up a column by hand and compare it to the total.
  5. Change the 0.25 setting and watch the flags move.
  6. Delete the test numbers and keep the formulas.

Where this has limits

  • I did not use this on a live bid. The formulas were tested in LibreOffice with made-up numbers, not in Google Sheets.
  • I am not an estimator, an attorney, an insurer or a safety professional. Check with an attorney on bidding rules.
  • The 25 percent setting is arbitrary. It is a demonstration number.
  • The FAR rule is a federal example. It applies to federal agencies. I did not research state or private rules.
  • I read the FAR page as an excerpt. Check the full text.
  • Lines may not map one to one. Subs price in their own structure.
  • No ReRev prices and no promises about results.

If you want this as a small tool instead of a sheet, see our Pixels service or tell us how you level bids today. Do not send bid documents, pricing, passwords or login details.

Frequently asked questions

What is a bid leveling spreadsheet?

A sheet that lines up bids from several subcontractors line by line, so you compare the same scope and see what each one left out.

How do I find scope gaps?

Leave a bidder's cell blank when they did not price a line. A formula flags lines where fewer bidders priced it than there are bidders.

What does a low flag mean?

That the lowest price on a line is well under the median. It means look and ask, not that the bid is wrong.

Should I fill missing lines with a number?

I would not. The sheet shows what the missing lines would cost at the median as a pointer. Ask the sub to confirm what they include.

Can the sheet pick the winner?

No. Price is one input. A person decides.

Does this work in Excel?

The formulas used here are standard. I tested them in LibreOffice, not in Excel or Google Sheets.

Read next: Track invitations to bid for the step before leveling, and the paperwork map for where bid documents sit with the rest of the office paper.