Bill of Quantities Template: A Worked Example Checked With AI

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Bill of Quantities Template: A Worked Example Checked With AI.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Bill of Quantities Template: A Worked Example Checked With AI.

Export the bill as CSV, give an AI assistant a short rules card, and ask it to list queries by item reference: inconsistent descriptions, wrong units, near-duplicate items and quantities that should match. Keep arithmetic, coding and unit-list checks in spreadsheet formulas, which never guess. The quantity surveyor rules on every query and signs the bill.

The split exists because AI is weakest at what a bill is made of: sums. Ask it to add a column and it can hand back a confident wrong total, a habit explained in Why Is AI Bad at Maths? What to Check in Quotes and Invoices. Ask it for formulas instead, or give it a check column your formulas have already filled. It also cannot see your drawings or know which method of measurement your contract names unless you give it a short rules card, so treat every query it raises as a question for the surveyor, not a ruling.

Follow me on Instagram@sagnikteaches

A filled-in bill: a 60 m2 office suite fit-out

Most templates online are blank grids. This one is filled in, because checks only make sense against real lines. The project is a ground-floor office suite, 10.0 m by 6.0 m, being stripped and refitted with one new partition forming a meeting room. All quantities and rates are invented for illustration, so do not price from them.

Connect on LinkedInSagnik Bhattacharya
RefDescriptionUnitQtyRate ($)Amount ($)
A1Site supervision, welfare and temporary protectionitem11,850.001,850.00
A2Protection of existing finishes in common areasitem1650.00650.00
A3Waste removal and skip hireitem1900.00900.00
B1Remove suspended ceiling tiles and gridm260.06.50390.00
B2Remove carpet tiles and adhesive from screedm260.05.20312.00
B3Remove stud partition, 2.7 m highm210.814.00151.20
B4Remove door sets complete with framesnr238.0076.00
C1Metal stud partition, 70 mm studs, 12.5 mm plasterboard both faces, 2.7 m highm216.248.50785.70
C250 mm mineral wool insulation within partitionm216.27.80126.36
C3Internal door set, solid core, 900 mm wide, with ironmongerynr3410.001,230.00
C4Glazed side screen, 900 mm x 2,100 mmnr1520.00520.00
D1Suspended ceiling, 600 x 600 mm lay-in tiles on exposed gridm260.024.501,470.00
D2Carpet tiles, 500 x 500 mm, on prepared screedm260.029.001,740.00
D3Skirting, 100 mm high MDF, primedm38.69.40362.84
D4Emulsion paint to walls, two coats, openings deductedm2107.74.60495.42
E1Double socket outlet, flushnr1462.00868.00
E2Data outlet, Cat 6, to patch panelnr678.00468.00
E3LED panel luminaire, 600 x 600 mmnr18118.002,124.00
E4Alterations to distribution board, testing and certificatesitem11,150.001,150.00
F1Provisional sum: making good to existing screeditem11,500.001,500.00

The section totals roll up to the summary below. Section A is preliminaries, B strip-out, C partitions and doors, D finishes, E electrical and F provisional sums.

Subscribe on YouTube@sagnikteaches
SectionTotal ($)
A Preliminaries3,400.00
B Strip-out929.20
C Partitions and doors2,662.06
D Finishes4,068.26
E Electrical4,610.00
F Provisional sums1,500.00
Subtotal17,169.52
Contingency at 5%858.48
Tender total18,028.00

To start your own copy, paste the clean bill into a blank sheet as CSV text. The Amount column is plain numbers here; in your sheet it becomes a formula.

Ref,Description,Unit,Qty,Rate,Amount
A1,"Site supervision, welfare and temporary protection",item,1,1850.00,1850.00
A2,Protection of existing finishes in common areas,item,1,650.00,650.00
A3,Waste removal and skip hire,item,1,900.00,900.00
B1,Remove suspended ceiling tiles and grid,m2,60.0,6.50,390.00
B2,Remove carpet tiles and adhesive from screed,m2,60.0,5.20,312.00
B3,"Remove stud partition, 2.7 m high",m2,10.8,14.00,151.20
B4,Remove door sets complete with frames,nr,2,38.00,76.00
C1,"Metal stud partition, 70 mm studs, 12.5 mm plasterboard both faces, 2.7 m high",m2,16.2,48.50,785.70
C2,50 mm mineral wool insulation within partition,m2,16.2,7.80,126.36
C3,"Internal door set, solid core, 900 mm wide, with ironmongery",nr,3,410.00,1230.00
C4,"Glazed side screen, 900 mm x 2,100 mm",nr,1,520.00,520.00
D1,"Suspended ceiling, 600 x 600 mm lay-in tiles on exposed grid",m2,60.0,24.50,1470.00
D2,"Carpet tiles, 500 x 500 mm, on prepared screed",m2,60.0,29.00,1740.00
D3,"Skirting, 100 mm high MDF, primed",m,38.6,9.40,362.84
D4,"Emulsion paint to walls, two coats, openings deducted",m2,107.7,4.60,495.42
E1,"Double socket outlet, flush",nr,14,62.00,868.00
E2,"Data outlet, Cat 6, to patch panel",nr,6,78.00,468.00
E3,"LED panel luminaire, 600 x 600 mm",nr,18,118.00,2124.00
E4,"Alterations to distribution board, testing and certificates",item,1,1150.00,1150.00
F1,Provisional sum: making good to existing screed,item,1,1500.00,1500.00

The quantities come from simple workings, which is the part the surveyor owns. Two of the three new doors sit in the outside walls of the suite, in the openings of the two removed in B4; the third goes in the new partition beside the glazed screen. Windows are left out to keep the workings short; a real bill deducts them too. Wall perimeter: 2 × (10.0 + 6.0) = 32.0 m, giving 86.4 m2 of wall at 2.7 m high. The new partition is 6.0 m long, so 16.2 m2 per face and 32.4 m2 for both faces. Gross wall paint is 118.8 m2. Openings come off every painted face they interrupt: the two outer doors once each at 0.9 m by 2.04 m (3.672 m2), and the partition door and the 0.9 m by 2.1 m glazed screen on both faces (3.672 m2 and 3.78 m2), a total of 11.124 m2. That leaves 107.676 m2, entered as 107.7 under this example's one-decimal rule. Skirting is 32.0 m of perimeter less the two outer door widths (30.2 m), plus 12.0 m along both faces of the partition less the door and screen widths on each face (8.4 m): 38.6 m.

Set up the sheet so the checks run themselves

Build the bill in Excel or Google Sheets with the same six columns as above, then add the checks beside them. The AI comes later; the formulas come first, because they are free, instant and exact.

  1. On a sheet named Bill, columns A to F hold Ref, Description, Unit, Qty, Rate and Amount, with the header in row 1 and the 20 items in rows 2 to 21.
  2. On a second sheet named Units, list the allowed units in A2 to A7: m, m2, m3, nr, item, kg. Apply data validation to column C so only those can be typed.
  3. Add three check columns, G, H and I, using the formulas below, and copy them down every row.
  4. Put a count in a spare cell such as L1: =COUNTIF(G2:J21,"?*") counts the check cells that hold a message (column J arrives further down). The target is zero before anyone else sees the bill.
  5. On a third sheet named Summary, type the section letters A to F in A2 to A7 and put the section total formula beside each.
G2  structure:
=IF(COUNTBLANK(A2:F2)>0,"Blank cell",IF(COUNTIF($A$2:$A$21,A2)>1,"Duplicate ref",IF(COUNTIF(Units!$A$2:$A$7,C2)=0,"Unit not on list",IF(AND(C2="item",D2<>1),"Item quantity should be 1",""))))

H2  amount:
=IF(ABS(ROUND(D2*E2,2)-F2)>0.005,"Amount is not qty x rate","")

I2  reference order:
=IF(LEFT(A2,1)=LEFT(A1,1),IF(VALUE(MID(A2,2,2))<>VALUE(MID(A1,2,2))+1,"Gap or out of order",""),IF(VALUE(MID(A2,2,2))<>1,"Section does not start at 1",""))

Summary!B2  section total (copy down to B7):
=SUMIF(Bill!$A$2:$A$21,A2&"*",Bill!$F$2:$F$21)

Summary!B9  tender total check (should read 0):
=SUM(Bill!$F$2:$F$21)-SUM(B2:B7)

Test every formula by breaking a row on purpose before you trust it. Change a rate, delete a unit, retype a reference. A check that never fires has not been shown to work. If you would rather have an assistant write the formulas, The ChatGPT Excel Guide covers asking for them, and the same rule applies: it writes, you test. Column I uses nested IFs rather than AND, because Excel's AND evaluates every argument, and on row 2 the VALUE of the header text would return an error.

Item references: gaps, duplicates and a scheme that helps

Item references are what every other check hangs on. If two rows share a reference, a query about one cannot be answered unambiguously, and a gap tells you either a deleted item or a typing slip. Formulas find both. What formulas cannot judge is whether the scheme is any good: whether a provisional sum deserves its own section, or whether strip-out items sit next to the new work they relate to. That is a reasonable thing to ask an AI to comment on, as long as you tell it that the order follows the sections of the specification and the surveyor can overrule it.

Here is the typical slip. A surveyor copies row D3 to make the paint line and forgets to renumber it, so the bill carries two D3 rows and no D4. Column G prints "Duplicate ref" on both rows, and column I flags the second one as "Gap or out of order", because it follows D3 but is numbered D3 again. No AI involved, and nothing could be quicker.

Descriptions and units: what to ask the AI

Descriptions are where AI helps most, because inconsistency is a language problem. The same item written two ways, a dimension in the wrong form, or two lines that may be the same thing under different names: formulas cannot see any of them. Give the AI the bill as CSV text, the check columns, and a rules card that states the conventions this bill follows. The card below is a set of house rules for this one bill, not a published method.

RULES CARD (this bill only)
1. Units allowed: m, m2, m3, nr, item, kg.
2. Areas and lengths to one decimal place; counts as whole numbers.
3. Dimensions in descriptions: millimetres with a space
   before the unit (70 mm); heights in metres to one
   decimal place (2.7 m).
4. Wall finishes: openings deducted, and the description says so.
5. Provisional sums: unit item, quantity 1, sum in the rate column.
6. Every strip-out item has a matching new or reinstated item,
   or a note saying why not.
7. Double-sided boards are described as "both faces".
You are checking an extract from a bill of quantities for
consistency. The data below is CSV: ref, description, unit,
qty, rate, amount, checks. The rules card follows the data.

Report only issues you can point to in a specific row. For
each, give: ref; issue type (description style, unit, duplicate
or near-duplicate item, quantity relationship, possible missing
item); the exact text that shows it; a suggested fix.
Do not recalculate any amount. Use the checks column.
Do not invent rates, quantities or rules. If a row is fine,
say nothing about it. Mark uncertain queries "low confidence".

[paste CSV]
[paste rules card]

To see what comes back, plant faults in a copy of the bill. Here is the draft, with six slips seeded.

RefDraft lineUnitQtyRate ($)Amount ($)
B2Remove carpet tiles and adhesive from screedm60.05.20312.00
C1Metal stud partition, 70mm studs, 12.5mm plasterboard each side, 2700 highm216.248.50785.70
D1Suspended ceiling, 600 x 600 mm lay-in tiles on exposed gridm260.024.501,407.00
D3Emulsion paint to walls, two coats, openings deductedm2107.74.60495.42
E5Twin socket outlet, flushnr462.00248.00
F1Provisional sum: making good to existing screeditem1,5001,500.002,250,000.00

An illustrative reply, trimmed, looks like this. Seven queries, one of them a false alarm.

RefQueryEvidence it quotesSurveyor's verdict
B2Unit looks wrong for a floor finish"m" here; B1 and D2 use m2Correct to m2
C1Description style breaks rules 3 and 7 of the card"70mm", "each side", "2700 high" against "70 mm", "both faces", "2.7 m high"Reword to the card
D1Checks column reports amount is not qty x rateEntered 1,407.00Digits transposed: 1,470.00
D3Reference appears twice; D4 missingTwo rows read D3 once the skirting is includedRenumber to D4
E5 and E1Possible duplicate item, same rate"Twin socket outlet" and "Double socket outlet", both $62.00Same sockets counted twice: delete E5; E1 stays at 14 nr
F1Provisional sum entered as quantity and rateChecks column: "Item quantity should be 1"; quantity 1,500 on an item lineQuantity 1, sum in the rate column
B4 and C3Door count differs: 2 removed, 3 new (low confidence)2 nr in B4; 3 nr in C3False alarm: the new partition adds a door

Six of the seven were real; the seventh is the useful one to study. The AI cannot know that the new meeting room needs its own door, so it asked. The surveyor dismissed it in a few seconds and logged why. That is the working relationship: the AI asks, you decide. A reply may also include a genuine missing-item query, for example "B3 removes a partition, but no line makes good the ceiling and wall finishes where it stood". Whether that is covered by D1, D4 or the provisional sum is the surveyor's call.

A keyword list that catches wrong units without AI

If the same slips recur, build a small dictionary. On a sheet named Keys, list keywords in column A and the unit each should carry in column B. A SUMPRODUCT formula then flags any row whose description contains a keyword but whose unit disagrees. It works in Excel and Google Sheets.

Keyword in descriptionExpected unit
skirtingm
partitionm2
ceilingm2
carpetm2
paintm2
door setnr
socketnr
outletnr
luminairenr
J2  unit vs keyword list (keys in Keys!A2:A10, units in Keys!B2:B10):
=IF(SUMPRODUCT(--ISNUMBER(SEARCH(Keys!$A$2:$A$10,B2)),--(Keys!$B$2:$B$10<>C2))>0,"Unit differs from keyword list","")

Run against the clean bill, the formula stays quiet on all 20 rows. Run against the draft, it fires on B2, because "carpet" expects m2 and the row says m. Keep the Keys range exactly the length of the list: a blank keyword matches every description, so a range that runs past the last keyword makes the formula fire on every line. Keep the list to rows that are always true, and use an AI only to propose new keywords from three or four past bills, which you then check by eye before adding them.

Quantity relationships that should hold

A bill hangs together through relationships between lines. These are the ones in this example, with who is best placed to check each.

RelationshipValues in the billChecked by
Ceiling removed equals ceiling installedB1 60.0 and D1 60.0Formula or AI
Carpet removed equals carpet laidB2 60.0 and D2 60.0Formula or AI
Partition area equals insulation areaC1 16.2 and C2 16.2Formula or AI
Partition area follows its dimensions6.0 m x 2.7 m = 16.2 m2Surveyor, from the drawing
Doors removed and added differ by designB4 2 nr; C3 3 nrSurveyor
Skirting follows perimeter and partition32.0 + 12.0 - 5.4 = 38.6 mSurveyor, from the drawing

The first three are equalities that a formula or an AI can test once you say they should match. The last three need the drawing, and that is where an AI's confident reading of a sheet stops being reliable. For measuring from plans in the first place, Best AI for Quantity Surveyors: Five Tool Types Compared by Job lays out which tool does which job.

Totals: formulas first, then a reviewer's read

Totals should come from cells, never from a typed number. The amount column is quantity times rate, rounded to the cent, and the section totals use the SUMIF formula above, which matches every reference that starts with the section letter. The summary then sums the section totals, and a final cell compares that figure with the sum of the whole amount column. If it is not zero, a section total has been typed over, or a row carries a reference whose letter the summary does not list.

The classic failure is the provisional sum entered twice. The surveyor types 1,500 as the quantity and 1,500.00 as the rate, and the amount becomes 2,250,000.00. The amount formula in column H cannot object, because 1,500 times 1,500 really is 2,250,000. The item-quantity test in column G does object, since an item line should carry a quantity of 1. Keep a sense check too: divide the subtotal by the floor area. The clean bill gives $17,169.52 over 60 m2, about $286 a square metre; the draft would show more than $37,000 a square metre, and nobody needs an AI to see that. Another trap is rounding. Taking the unrounded 107.676 m2 of paint at $4.60 gives $495.31; the one-decimal rule gives 107.7 m2 and $495.42. Eleven cents is trivial, but across a long bill the rounding rule you choose moves the total, so state it on the rules card and apply it everywhere.

Once the formulas are clean, hand the AI the checks columns and ask a narrower question: "Which rows have a non-empty check, and is there a pattern?" A pattern, such as every row in section D showing an amount mismatch, usually means a column was filled with the wrong formula. That is a human-scale judgement an AI can spot quickly.

What the surveyor applies and the AI never decides

A bill follows a method of measurement: rules for what to measure, in what unit, with what level of description, and what to deduct. Published sets exist for building work and for civil engineering work, and the contract usually names the one in force. The surveyor follows it. The AI knows none of it unless you tell it, and even then it should treat your short rules card as the only authority in the conversation. Published rule books are copyrighted documents, so check the publisher's licence before you paste long extracts into any tool, and paste your own summary of the rules instead.

These stay with the surveyor, whatever the AI says: which rules govern the bill; whether an opening is deducted; what counts as the same item and what as a separate one; the treatment of a provisional sum, an allowance or a daywork item; and what the quantity actually is against the drawing. The AI can check that you were consistent, and it can ask a question you had not thought of. It cannot tell you that a quantity is right. ChatGPT for Construction Estimating: Check a Quote, Do Not Write It makes the same point from the estimating side.

Checking a returned tender against the bill you issued

The same routine works in the other direction. When a contractor returns a priced bill, the first question is whether they priced the bill you issued. Send the AI both versions as CSV, matched by reference, and ask it to list every row where the description, unit or quantity differs, and every row where a rate is blank. Do not ask it to judge the prices; that is a separate job.

RefIssuedReturnedWhat to do
C3Qty 3 nrQty 2 nrQuery: they have priced fewer doors than issued
D2Carpet tiles, 500 x 500 mmCarpet tiles, 500 x 500 mm (or equal)Query: substitution wording added to the description
E3Rate column left blank for pricingRate still blankQuery: unpriced line; confirm it is included elsewhere

In this invented return, the AI reports all three in seconds, and the surveyor decides whether each is an error, a qualification to be accepted, or a ground for a clarification letter. Altered descriptions and quantities are the ones people miss when reading a hundred lines by eye, and the AI finds them reliably because it is comparing text, not judging value. Back the comparison with a formula where you can. Paste the returned bill onto a sheet named Returned, and on each row of the issued bill =IFERROR(IF(D2<>INDEX(Returned!$D$2:$D$21,MATCH(A2,Returned!$A$2:$A$21,0)),"Qty changed",""),"Ref missing") flags every changed quantity and every reference the contractor dropped, matching by reference rather than by row, so the AI's list and the formula's list should agree.

Keep rates and client names out of the wrong tool

A priced bill reveals rates, margins and sometimes the client. For description, unit and reference checks you do not need the rate or amount columns at all, so send the bill without them and keep the arithmetic in your own sheet. If you do need the full bill checked, use a business account where the provider does not train on your content by default, or remove names and project details first, as How to Anonymise Client Data Before You Paste It Into AI describes. If a messy bill arrives as pasted text with broken columns, cleaning it before the checks avoids false queries from garbled rows.

Test the whole routine on a bill with planted errors

Before you rely on any of this, run the planted-error test. Take a bill you have already signed off, copy it, and seed seven faults: a wrong unit, a duplicate reference, a typed amount, a provisional sum entered twice, two lines for the same item, a description in the wrong style, and a deleted line that a related item implies. Run the formulas, then the AI. Score each fault as caught by the formulas, caught by the AI, or missed by both.

Say the first run catches four with the formulas (unit, duplicate, amount, provisional sum), two with the AI (the double item and the style), and misses one with both (the deleted line). That is six of seven, and the miss is informative: a deleted line is a measurement question, so it falls to the surveyor. Repeat the test when you change the prompt, switch tool, or add a new check, and keep the scores. A routine you have tested on known faults is one you can describe to a client or a colleague with a straight face.

Questions quantity surveyors ask about AI checks

Can AI measure quantities from drawings for me?

Some takeoff tools can read plans, but a chat assistant is not a measuring tool, and neither replaces the surveyor's check against the drawings. This tutorial uses AI after measurement, to read the bill for consistency. For tools that measure from plans, test them on one plan set you have already measured by hand and compare every line.

Which AI should I use for the check?

Use one that can work on a real file and run code, so sums come from calculation rather than guesswork. Claude's pricing page lists file creation and code running on its Free plan, and its help documents accept CSV and XLSX uploads (XLSX needs code execution switched on). ChatGPT's data analysis is limited on its Free plan. Check the plan you use, and keep the formulas in your sheet as the main arithmetic check.

Is it safe to paste a priced bill into ChatGPT or Claude?

Only on an account whose privacy terms you have checked. A priced bill shows your rates and margins. Consumer plans let you switch off model training, and business plans do not train on your content by default. For description and unit checks you can send the bill without the rate and amount columns, which removes the sensitive part.

How big a bill can I check in one go?

Split a large bill by section and check one section at a time, then recheck the section totals and the summary yourself in the spreadsheet. A 40-line section is also easier for any model to check line by line than a 400-line sheet. Keep the item references so every query points to a row.

Further reads

Sources: Claude pricing page (file creation, code running, projects) and Claude's help article on uploading files. The check formulas use standard spreadsheet functions. The bill, quantities and rates in the example are invented for illustration and are not a pricing guide.

Want your estimating checks set up properly?

On a 1:1 call we can look at how your bills of quantities are built and checked today, pick the checks worth automating first, and decide which stay with the surveyor.

Book a 1:1 call with me