Can AI Do Construction Bid Levelling? What It Catches and Misses

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Can AI Do Construction Bid Levelling? What It Catches and Misses.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Can AI Do Construction Bid Levelling? What It Catches and Misses.

AI can do the first pass. Give ChatGPT or Claude three or four subcontractor quotes for one trade and it can build a single scope matrix, quote the exclusions and qualifications, and flag lines that do not line up. It cannot see what no quote mentions, so you still check the levelled result against the drawings and specification.

That last part is where most of the money sits. A bid that is $7,000 cheaper is rarely cheaper: it is usually missing something. Levelling (also spelt leveling) means adjusting every bid until they all cover the same scope, so the comparison is fair. Done by hand, with four PDFs in four layouts, it takes an estimator or project manager half a day. A model reads and reorganises text quickly, which is exactly the tedious part.

Follow me on Instagram@sagnikteaches

The division of labour is easy to state and easy to blur. The model reads, sorts and quotes; you supply the scope, price the gaps and choose the sub. Most of the failures further down come from blurring it, usually by letting the model compare the quotes with each other when it should be comparing each quote with the job.

Connect on LinkedInSagnik Bhattacharya

What levelling means in practice

Every subcontractor prices what they think the job is. Their quote carries a total, then a list of inclusions, exclusions, assumptions, allowances, clarifications, validity period and payment terms. Two subs can read the same drawings and price different jobs. Levelling forces the same job onto each price so you compare like with like.

Subscribe on YouTube@sagnikteaches

A working matrix has one row per scope item and one column per sub, with each cell holding one of four states: included, excluded, included with a qualification (for example "up to 40 fixtures"), or not mentioned. A fifth column holds the item's source in the drawings or specification. Once the matrix is filled, you price the gaps (what it would cost to add each excluded or missing item) and add those to each bid to get a levelled total.

The AI helps with the filling-in. The pricing of gaps, and the decision on whether a gap matters, stays with you.

The Complete Excel Course with AI Integration thumbnail

The Complete Excel Course with AI Integration

From formulas and pivot tables to Power Query, DAX, VBA and AI with Copilot, ChatGPT and Claude — hands-on from the first lesson.

By Sagnik Bhattacharya and Virginia Thorn, Primetime Emmy Award winner

Buy now

Preparing the quotes so the AI reads them properly

  1. One trade at a time. Electrical bids in one session, mechanical in another. Mixed trades produce confused matrices.
  2. Convert each quote to text you can see. Copy the text from native PDFs. For scans, run text recognition and read the result against the page before you rely on it.
  3. Anonymise if you want to. Replace each company name with Sub A, B, C. It also keeps you from favouring a name when you read the matrix.
  4. Add the scope source. Paste the relevant specification section and a list of the drawing sheets that govern the trade. Without it the model can only compare quotes with each other, not with the job.
  5. Add your own baseline items. Tell the model about anything you know must be included: temporary power, permits, commissioning, as-built drawings, warranty.

Check your data settings before you paste anything. Quotes are commercially sensitive. A business plan such as ChatGPT Business ($25 per user per month monthly, $20 billed annually, two seats minimum) or Claude Team does not train on your content by default, whereas consumer plans have a training switch you should turn off.

A prompt that produces a matrix you can check

You are helping me level subcontractor bids for ONE trade: electrical, small commercial fit-out.
I will paste: (1) the scope description and relevant specification extract, (2) three quotes labelled Sub A, Sub B, Sub C.

Task:
1. Build a table. Rows = scope items from my scope description, plus any item that appears in any quote but not in my scope. Columns = Sub A, Sub B, Sub C.
2. In each cell write exactly one of: INCLUDED, EXCLUDED, QUALIFIED (with the qualification quoted), NOT MENTIONED.
3. For every EXCLUDED or QUALIFIED cell, quote the sub's own words in a separate list, with the sub's name.
4. List quantities each sub states (fixture counts, metres, devices) against the quantity in my scope.
5. List allowances, provisional sums, validity periods, payment terms, bonds and insurance conditions per sub.
6. Do NOT choose a winner and do NOT estimate prices for missing items. If a figure or clause is unclear, write UNCLEAR and say what to ask the sub.

Two instructions in this prompt matter most. "Quote the sub's own words" lets you find the clause on the page in seconds instead of trusting a paraphrase. "Do not estimate prices" prevents the model from making up numbers to fill the gaps.

A worked example with numbers

This is an illustration with invented figures. A general contractor is fitting out a small ground-floor clinic and has three electrical quotes. The headline totals are:

SubQuoted totalRank by price
Sub A$38,5001st (cheapest)
Sub B$41,8002nd
Sub C$46,2003rd

A $7,700 spread looks like a clear win for Sub A. The AI-built matrix tells a different story. Here is an illustrative extract of what it returns after you paste the quotes and your scope:

Scope itemSub ASub BSub C
Fire alarm devices and tie-inEXCLUDED ("by fire alarm specialist")INCLUDEDINCLUDED
Permit and inspection feesEXCLUDEDINCLUDEDINCLUDED
Temporary power during worksNOT MENTIONEDINCLUDEDINCLUDED
Light fixtures, supply and fit (scope: 52)INCLUDED (52)QUALIFIED ("44 fixtures")INCLUDED (52)
Ceiling work out of hoursINCLUDEDEXCLUDED ("normal hours only")INCLUDED
Data cablingEXCLUDEDEXCLUDEDINCLUDED ("allowance $3,000")

Your scope says data cabling is by others, so Sub C's allowance is something to remove, not add. You then price the gaps, either from your own cost data or by phoning the subs, and treat these as illustrative estimates:

  • Sub A: fire alarm $2,900, fees $1,200, temporary power $800. Total adjustment +$4,900, levelled total $43,400.
  • Sub B: 8 missing fixtures at $95 = $760, out-of-hours premium $1,600. Adjustment +$2,360, levelled total $44,160.
  • Sub C: remove the data allowance, -$3,000, levelled total $43,200.

The spread shrinks from $7,700 to $960, and the cheapest bid is now Sub C, which was the dearest. That is the whole point of the exercise. It also shows why the matrix needs to quote the sub's words: "by fire alarm specialist" is a sentence you must phone about, because the alarm specialist may not be in your budget at all.

What AI reliably catches

Exclusions buried in clarifications

Quotes hide the important lines at the bottom of page three under headings like "Notes" or "Clarifications". A model reads every line, every time, without tiring. Asking for each exclusion with the sub's own words is its strongest use.

Quantity and unit mismatches

When one sub prices 44 fixtures and the scope has 52, or prices cable per metre while another prices per run, the matrix puts them side by side. Mismatched units are hard to spot when quotes use different layouts.

Conditions that change the price

Validity periods (a quote that expires in ten days), payment terms (30% upfront versus monthly valuations), retention, bond requirements and insurance conditions all sit in the text, not the total. Ask for them in their own list.

Different words for the same thing

One sub says "builder's work in connection", another says "making good". A model can group these as the same issue and mark that neither says who does the chasing and patching.

Missing sections

If your scope lists commissioning, testing and as-built drawings, and Sub B's quote does not mention any of them, the matrix shows NOT MENTIONED, which is the cue to ask rather than assume.

Where it misses, and how to cover each gap

Silence in every bid

If none of the three subs mentions an item, the matrix will not invent a row for it unless it is in your scope text. The risk is the item that nobody read from the drawings. Cover it by reviewing the drawings yourself, sheet by sheet, against the rows. A quick approach: ask the model for the items a typical scope for this trade includes that are absent from your rows, treat that list as prompts for your own check, and confirm each on the drawings.

Quantities on the drawings

The model compares what the quotes say with what your scope description says. It does not count fixtures on a drawing reliably, so an error in your own scope list passes straight through. Spot-count two or three high-value items on the drawings. For the wider question of counting from plans, see can AI do a takeoff from drawings.

Scanned or messy PDFs

A mis-read "$14,200" that becomes "$1,420" is plausible and silent. Compare every figure in the matrix against the page, not just the exclusions. A figure that does not trace to the document gets corrected before anyone relies on it.

Tables that lose their shape

Priced schedules copied from a PDF often arrive with columns jumbled, so a rate lands on the wrong item. If the quote includes a schedule of rates, check that table by eye or paste it from a spreadsheet export.

Judgement about the sub

A matrix does not show that Sub C answered every question promptly and Sub A took two weeks to reply, or that one firm's last job for you finished late. That context sits in your memory and your records. Keep it separate from the levelled number.

Three smaller examples to try this week

A flagged clarification

Illustrative output line: "Sub B, Note 4: 'Price assumes clear access to ceiling void; scaffolding and access equipment by others.' STATUS: EXCLUDED (access equipment). ASK: confirm who provides access equipment and for how long." The fix is a one-line email to the sub, and a line in your own site-cost sheet if the answer is you.

A before-and-after on wording

Before (from a quote): "Allowance for sundries included." After (matrix cell): "QUALIFIED: allowance of unspecified value for sundries. ASK: state the amount and what it covers." Vague allowances are where disputes start, so push for an amount.

A quick sum on validity

Three quotes show validity of 30, 14 and 10 days. You expect to award in 20 days. The matrix flags that Sub B and Sub C will have lapsed by then. A short email asking for extensions costs nothing; discovering the lapse after you have told the client the price costs far more.

Levelling the terms that are not in the total

Price is the easy column. Two bids with identical levelled totals can still be very different offers, so ask the model for a second table that holds only terms. A useful set of columns: start date and duration, validity, payment profile, retention, insurance limits, warranty period, who supplies the access equipment, and any condition that lets the sub reprice.

Illustrative example for the clinic job. Sub A offers a four-week duration but can only start in six weeks. Sub B can start in two weeks and needs five. Sub C wants 40% on order for materials and 60% on completion. If the ceilings must be closed by week eight, only Sub B finishes in time without a premium, and Sub C's payment profile changes your cash position by roughly $17,000 in the first fortnight. None of that appears in the headline totals. Put the terms table beside the scope matrix and read both before you shortlist. If the programme is tight, scheduling subcontractors and deliveries with AI shows how to test each start date against the rest of the job.

The clarification email that comes out of the matrix

The matrix is only useful if the gaps get closed in writing. Ask the model to draft one email per sub from that sub's UNCLEAR, EXCLUDED and QUALIFIED cells, in a neutral tone, and edit it before sending. A sample for Sub A, again illustrative:

Hi [first name],

Thanks for the electrical price on the clinic fit-out. Before we finalise, please confirm in writing:
1. Fire alarm devices and tie-in: your note says "by fire alarm specialist". Is that specialist in anyone's price, or should we add it to yours?
2. Permit and inspection fees: excluded in your quote. Please give the amount if you are able to pay them for us.
3. Temporary power: not mentioned. Is it included?
4. Please confirm the quote remains valid until [date].

A written reply by [date] would let us complete our comparison.

Kind regards,
[your name]

Sending the same neutral questions to every sub also protects you if someone later says they were treated differently. Keep the replies in the job folder and add each answer to the matrix as a new row or an edited cell.

A second trade: mechanical ductwork, with a different failure

Say you are levelling three mechanical quotes for the same clinic. The AI matrix flags that two quotes include insulation on ducts and one does not mention it, and that one quote includes balancing and commissioning while the others do not. Those are the familiar exclusions. The less obvious catch is in the units: one sub prices ductwork per kilogram of metal, another per metre and the third as a lump sum. The model can line those up in the matrix, but it cannot convert them without a quantity, so it writes UNCLEAR. The fix is to ask each sub for the duct quantities they priced, then compare against your own takeoff. If the quantities differ by more than a few percent, one of them has read the drawings differently, and that conversation is worth an hour of your time before you award anything.

The point of the second example is that every trade has its own place where quotes drift apart: electrical in fixture counts and exclusions, mechanical in units and commissioning, finishes in preparation and make-good, groundworks in provisional quantities. Write the typical drift points for each trade you buy into a short note, and paste it into the prompt so the model checks them every time. Over a year this becomes a small library of trade-specific prompts, which is far more useful than a generic one.

The water-meter chamber nobody priced

This illustration shows the commonest failure. A small contractor pastes four plumbing quotes into one request without a scope extract. The model produces a neat matrix comparing the quotes with each other, finds that all four include fixtures and none includes a water-meter chamber, and reports the quotes as consistent. The meter chamber is on a civil drawing the contractor never mentioned, and it surfaces two weeks into the job as a $6,400 extra. The model did what it was asked: it had no scope to compare against. The repair is the rule in the preparation list, always include your own scope source, plus the "what is typically included in this trade but missing from my rows" prompt as a safety net.

Checking the levelled result before you rely on it

  1. Pick five rows at random and find each sub's quoted words on the page. Every one should match.
  2. Re-add each sub's levelled total from the quoted figure and your adjustments. Use a spreadsheet; do not ask the model to do the sum without showing its working.
  3. Walk the drawings for the trade once, looking for any item with no row in the matrix.
  4. Send each sub a short list of the questions that came out of the matrix, and wait for written answers.
  5. Record the final levelled figures and who confirmed what. If a sub later disputes scope, your file shows what was asked and answered.

Spreadsheets handle the sums better than a chat. If you build the matrix in Excel afterwards, the guide to using ChatGPT with Excel shows how to keep the model's formulas honest.

Fitting this into a small firm's week

A reasonable time budget for four quotes in one trade is 20 minutes to prepare the text and scope extract, 5 minutes for the model to produce the matrix, 40 minutes to check it against the pages and drawings, and a further 30 minutes for the clarification emails. That is under two hours against the half day by hand, and it comes with a written record you can reuse for the next job. Save the prompt and a blank matrix in your shared folder so every project manager starts from the same version, and the output is comparable job to job. If you want the same method for the earlier step of deciding whether to bid at all, the bid or no-bid screen pairs well with it, and once the winner is chosen, the subcontractor paperwork checklist covers what to collect before they start.

One boundary to keep in mind: levelling supports your decision, it does not carry the legal weight of the subcontract. Contract terms, liability and payment mechanisms deserve a qualified adviser's eye, and what AI catches and misses in contract review is a sensible companion read.

Questions about levelling bids with AI

Is it safe to paste subcontractor prices into ChatGPT or Claude?

Quotes are commercially sensitive. Use a business plan that does not train on your content by default, or an individual plan with training switched off, and check your own client and subcontractor terms. If in doubt, replace names with Sub A, Sub B and Sub C before pasting.

How many bids can I level at once?

Three or four per trade is a good limit. Beyond that, long quotes risk being skimmed and the matrix gets hard to check. Level one trade at a time, and never mix trades in one request.

What if a quote is a scanned PDF?

Scans read badly. Run text recognition first, then compare the extracted text with the page for figures and exclusions, because one mis-read digit changes the price. If the quote is short, retyping the key lines is faster and safer.

Does the AI tell me which sub to pick?

It should not. Price is one input beside programme, insurance, past performance and how well the sub understood the job. Use the matrix to make the comparison fair, then choose with your own judgement.

Further reads

Sources: general bid-levelling practice; ChatGPT Business and Claude Team pricing and data-use pages.

Want a repeatable bid-levelling routine?

On a 1:1 call we can look at how you collect and compare subcontractor quotes today, set up a prompt and matrix that suit your trades, and agree what a person always checks.

Book a 1:1 call with me