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.
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.
| Ref | Description | Unit | Qty | Rate ($) | Amount ($) |
|---|---|---|---|---|---|
| A1 | Site supervision, welfare and temporary protection | item | 1 | 1,850.00 | 1,850.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 | 1,230.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 | 1,470.00 |
| D2 | Carpet tiles, 500 x 500 mm, on prepared screed | m2 | 60.0 | 29.00 | 1,740.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 | 2,124.00 |
| E4 | Alterations to distribution board, testing and certificates | item | 1 | 1,150.00 | 1,150.00 |
| F1 | Provisional sum: making good to existing screed | item | 1 | 1,500.00 | 1,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.
| Section | Total ($) |
|---|---|
| A Preliminaries | 3,400.00 |
| B Strip-out | 929.20 |
| C Partitions and doors | 2,662.06 |
| D Finishes | 4,068.26 |
| E Electrical | 4,610.00 |
| F Provisional sums | 1,500.00 |
| Subtotal | 17,169.52 |
| Contingency at 5% | 858.48 |
| Tender total | 18,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.
- 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.
- 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.
- Add three check columns, G, H and I, using the formulas below, and copy them down every row.
- 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. - 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.
| Ref | Draft line | Unit | Qty | Rate ($) | Amount ($) |
|---|---|---|---|---|---|
| B2 | Remove carpet tiles and adhesive from screed | m | 60.0 | 5.20 | 312.00 |
| C1 | Metal stud partition, 70mm studs, 12.5mm plasterboard each side, 2700 high | m2 | 16.2 | 48.50 | 785.70 |
| D1 | Suspended ceiling, 600 x 600 mm lay-in tiles on exposed grid | m2 | 60.0 | 24.50 | 1,407.00 |
| D3 | Emulsion paint to walls, two coats, openings deducted | m2 | 107.7 | 4.60 | 495.42 |
| E5 | Twin socket outlet, flush | nr | 4 | 62.00 | 248.00 |
| F1 | Provisional sum: making good to existing screed | item | 1,500 | 1,500.00 | 2,250,000.00 |
An illustrative reply, trimmed, looks like this. Seven queries, one of them a false alarm.
| Ref | Query | Evidence it quotes | Surveyor's verdict |
|---|---|---|---|
| B2 | Unit looks wrong for a floor finish | "m" here; B1 and D2 use m2 | Correct to m2 |
| C1 | Description 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 |
| D1 | Checks column reports amount is not qty x rate | Entered 1,407.00 | Digits transposed: 1,470.00 |
| D3 | Reference appears twice; D4 missing | Two rows read D3 once the skirting is included | Renumber to D4 |
| E5 and E1 | Possible duplicate item, same rate | "Twin socket outlet" and "Double socket outlet", both $62.00 | Same sockets counted twice: delete E5; E1 stays at 14 nr |
| F1 | Provisional sum entered as quantity and rate | Checks column: "Item quantity should be 1"; quantity 1,500 on an item line | Quantity 1, sum in the rate column |
| B4 and C3 | Door count differs: 2 removed, 3 new (low confidence) | 2 nr in B4; 3 nr in C3 | False 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 description | Expected unit |
|---|---|
| skirting | m |
| partition | m2 |
| ceiling | m2 |
| carpet | m2 |
| paint | m2 |
| door set | nr |
| socket | nr |
| outlet | nr |
| luminaire | nr |
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.
| Relationship | Values in the bill | Checked by |
|---|---|---|
| Ceiling removed equals ceiling installed | B1 60.0 and D1 60.0 | Formula or AI |
| Carpet removed equals carpet laid | B2 60.0 and D2 60.0 | Formula or AI |
| Partition area equals insulation area | C1 16.2 and C2 16.2 | Formula or AI |
| Partition area follows its dimensions | 6.0 m x 2.7 m = 16.2 m2 | Surveyor, from the drawing |
| Doors removed and added differ by design | B4 2 nr; C3 3 nr | Surveyor |
| Skirting follows perimeter and partition | 32.0 + 12.0 - 5.4 = 38.6 m | Surveyor, 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.
| Ref | Issued | Returned | What to do |
|---|---|---|---|
| C3 | Qty 3 nr | Qty 2 nr | Query: they have priced fewer doors than issued |
| D2 | Carpet tiles, 500 x 500 mm | Carpet tiles, 500 x 500 mm (or equal) | Query: substitution wording added to the description |
| E3 | Rate column left blank for pricing | Rate still blank | Query: 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
- AI Take Off Software: Trial Three Tools on One Real Plan Set — Trial takeoff tools on one plan set you have measured.
- AI for Electrical Estimating: Set Fitting Allowances and Provisional Sums — Handle allowances and provisional sums on electrical work.
- Can AI Produce Accurate Estimates for a Small Building Firm? — How accurate AI estimates are for small building firms.
- How to Set Up an Approval Step for AI-Written Quotes — Add a sign-off step before AI-written figures go out.
- AI Tools for Construction Estimating: Bid Checks After the Takeoff — Bid checks after the takeoff, with the tools to use.
- How to Compare Supplier Quotes Side by Side With AI — Compare a bill's rates against supplier quotes.
- AI Tools and AI Development: The Complete 2026 Guide — the AI hub, including every tutorial in the AI-for-business series.
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.