Export your last 10 to 20 quotes next to what each job actually cost, then ask an AI to compare quoted against actual line by line: labour hours, materials, skips and plant, subcontractors, and the costs nobody priced. The lines that overran most often are your underpriced items. Fix those rates first, then back-test before you quote.
A building firm rarely loses money on one big mistake. It loses it on small, repeated ones: a skip priced at half what it costs, a month of merchant runs nobody counted, a hundred hours of snagging that was never in the quote. A table of past jobs finds them, and an AI can do the sums, but only if the data going in is honest.
Build the table: one row per cost line, per job
The AI is only as good as the table you give it. Each row is one cost line on one job, with these columns: job ID, job type, size, cost line, quoted cost, actual cost, quoted hours, actual hours and a note. Use the same six cost lines on every job so the totals compare:
- Your own labour, including any employees.
- Materials.
- Subcontractors.
- Skips, tip fees and plant hire.
- Travel, merchant runs and site admin.
- Snagging and return visits.
The last two lines will usually have a quoted figure of zero. That is the point: they are the costs nobody priced.
Record costs, not prices: what the job cost your firm, before markup and before sales tax. Value your own labour at what an hour costs you in wages, employer costs and your share of tools and van, not at what you charge. If you have never worked that number out, working out your labour burden rate shows what an hour of each person really costs.
The data lives in four places, and none of them is tidy. The quote is a PDF or a spreadsheet with a lump sum. The supplier bills sit in accounting software, coded to a job if you are disciplined, or on merchant statements if not. Hours are in timesheets, a diary or your head. Skip and tip receipts are in the van. Here is how one job, a bathroom refit, turns from mess into rows. The figures are illustrative.
- Quote: "Bathroom refit, supply and fit, $9,387.50", built from an estimating sheet that shows 70 hours of labour at a $38 cost rate, $3,100 of materials, $1,450 for the plumber and electrician, and $300 for a skip.
- Supplier bills coded to the job: merchant invoices totalling $3,260, the plumber and electrician at $1,450, and skip and tip receipts of $480.
- Timesheets: 85 hours over two weeks, plus a notebook entry for $260 of merchant runs and phone time and $190 of unpaid return visits to fix a leak and a door.
| Job | Cost line | Quoted | Actual | Quoted hours | Actual hours | Note |
|---|---|---|---|---|---|---|
| J07 | Own labour | $2,660 | $3,230 | 70 | 85 | Tiling took two extra days |
| J07 | Materials | $3,100 | $3,260 | Tile price rose before purchase | ||
| J07 | Subcontractors | $1,450 | $1,450 | As quoted | ||
| J07 | Skips, tip fees, plant | $300 | $480 | Second skip needed | ||
| J07 | Travel, merchant runs, admin | $0 | $260 | Not quoted | ||
| J07 | Snagging, return visits | $0 | $190 | Leak and door, unpaid | ||
| J07 | Total | $7,510 | $8,870 | $1,360 over, 18.1% |
At a 25% markup on quoted cost the job sold for $9,387.50. Its actual cost was $8,870, so it made $517.50, a margin of 5.5% on the price, where the quote said 20%. One job tells you little. Twelve of them tell you where the money goes.
Some rules that keep the table honest. If you cannot recover the quoted lines from an old quote, rebuild them from your estimating notes, or start the table with the last eight jobs you can reconstruct. When a customer paid for a variation, record it as its own line in both the quoted and actual columns so it does not look like an overrun; an extra you did for nothing stays in as an overrun. If you hold variations in a spreadsheet already, how small builders price variations and change orders shows how to keep them separate. Strip names, addresses and phone numbers before anything goes into an AI chat: the job ID is all the AI needs.

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 nowAsk the AI for the audit, and check what it leaves out
With 12 jobs, 72 rows fit comfortably in a chat message, so paste the table into ChatGPT, Claude or Gemini rather than uploading a file. Be exact about what you want, because a vague "analyse my jobs" gets a vague answer.
Below is a table of cost lines from 12 completed building jobs: job ID, job type, cost line, quoted cost, actual cost. All figures are costs to my firm, before markup and before sales tax.
1. For each cost line give total quoted, total actual, actual as a percentage of quoted, and in how many jobs actual exceeded quoted.
2. Where the quoted cost is zero, call the line "not quoted" and show the actual total. Do not divide by zero.
3. Rank every line, including the not-quoted ones, by money lost (actual minus quoted).
4. Give the totals, and the margin on selling price if I priced each job at quoted cost plus 25%.
5. Show the steps or formulas so I can check them in a spreadsheet. Do not suggest new rates yet.
This is the result for the example firm, after the corrections described below. Quoted and actual figures are totals across the 12 jobs, all illustrative.
| Cost line | Quoted | Actual | Actual as % of quoted | Jobs over (of 12) | Money lost |
|---|---|---|---|---|---|
| Own labour | $52,000 | $59,800 | 115.0% | 9 | $7,800 |
| Travel, merchant runs, admin | $0 | $4,100 | not quoted | 12 | $4,100 |
| Skips, tip fees, plant | $6,100 | $9,300 | 152.5% | 11 | $3,200 |
| Materials | $61,500 | $64,600 | 105.0% | 8 | $3,100 |
| Snagging, return visits | $0 | $2,700 | not quoted | 10 | $2,700 |
| Subcontractors | $34,200 | $35,400 | 103.5% | 6 | $1,200 |
| Total | $153,800 | $175,900 | 114.4% | $22,100 |
At cost plus 25% the 12 jobs sold for $192,250, which is $153,800 times 1.25. Actual cost was $175,900, so profit was $16,350: a margin of 8.5% on the selling price against the 20% the quotes promised. If overheads run at 10% of sales, which is $19,225, the firm lost $2,875 across a year of busy work.
The first reply to a prompt like this is rarely right. Check three things before you believe it.
- Did it leave out the not-quoted lines? A common first answer ranks only the four lines that have a quoted figure, which hides $6,800 of overrun on the two lines nobody priced. Travel and admin is the second biggest leak in the table. Ask it to include them.
- Did it confuse markup with margin? A first reply may report the profit as 9.3%, which is $16,350 divided by the actual cost. Margin is profit divided by the selling price, so 8.5% is the figure that matches "20% planned".
- Does the arithmetic hold? Language models slip on sums. The formulas it shows let you check the totals in a spreadsheet in two minutes: a SUMIFS for each cost line, and the actual total divided by the quoted total.
=SUMIFS(Actual, Line, "Skips, tip fees, plant") / SUMIFS(Quoted, Line, "Skips, tip fees, plant")
=SUM(Actual) - SUM(Quoted)
For a wider view of which whole jobs earned money, construction job costing with AI takes the same data and ranks by job instead of by cost line. The table here asks a different question: which line, on every job, is wrong.
Turn the findings into a rate sheet
A rate sheet turns "what went wrong" into "what to charge". Pick the eight to twelve items you price most often. For each one, take the median hours from the jobs in your table, not the average, so that one disaster job does not drag the figure up. Take materials from the supplier invoices and the waste and plant cost from the skip and tip receipts. Change an item's rate only when it rests on at least five jobs; with fewer, treat the number as a hint.
Using the table, for each of these items give the median actual labour hours per unit, the median materials cost per unit, and the median waste and plant cost per unit: strip-out of a small room, stud partition per metre, skim plaster on ceilings per square metre, floor tiling per square metre, kitchen fit, internal door hung.
Show how many jobs each figure rests on. Mark any item with fewer than 5 jobs "low confidence". Do not fill gaps with typical industry figures.
Two sums sit behind every row. Cost is hours times your labour cost rate, plus materials, plus waste and plant. Price is cost times one plus your markup. Be clear which one you are targeting, because 25% markup and 25% margin are different prices. A 25% markup on a $100 cost gives $125, and the $25 profit is 20% of the price. A 25% margin needs a price of $100 divided by 0.75, which is $133.33, a markup of 33.3%. The sheet below uses a 25% markup, and markup versus margin in construction goes through the choice in more detail.
| Item | Unit | Hours (median) | Labour at $38 | Materials, waste, plant | Cost | New price | Old price | Change |
|---|---|---|---|---|---|---|---|---|
| Strip out and make good, small room | room | 14 | $532.00 | $245.00 | $777.00 | $971.25 | $795.00 | +22.2% |
| Stud partition, 2.4 m high | metre run | 2.4 | $91.20 | $41.50 | $132.70 | $165.88 | $145.63 | +13.9% |
| Skim plaster, ceilings | m² | 0.46 | $17.48 | $2.40 | $19.88 | $24.85 | $19.50 | +27.4% |
| Floor tiling, adhesive and grout | m² | 1.55 | $58.90 | $10.70 | $69.60 | $87.00 | $79.63 | +9.3% |
| Kitchen fit, units and worktop | kitchen | 62 | $2,356.00 | $300.00 | $2,656.00 | $3,320.00 | $2,960.00 | +12.2% |
| Internal door hung and finished | door | 2.1 | $79.80 | $18.00 | $97.80 | $122.25 | $105.50 | +15.9% |
All the figures in the sheet are illustrative, so look at the pattern, not the amounts. Skim plaster rose the most because the old 0.35 hours a square metre was never achieved; history says 0.46. Strip-out rose 22% for two reasons of similar size: the work took 14 hours a room against the old sheet's 12, which adds $76 of cost, and skips and tip fees averaged $185 a room against $120, which adds $65. Tiling moved least, at 9.3%, so the old rate was closer there than anywhere else on the sheet: it still rises, but it is not where the money leaked.
The two lines nobody priced become allowances. Travel, merchant runs and site admin cost $4,100 on $153,800 of quoted cost, which is 2.7%. Snagging and return visits cost $2,700, which is 1.8%. Add both to every quote as their own lines, so the customer sees them and you stop absorbing them. Materials ran 5% over quoted cost, so either add a materials allowance of that size or shorten how long your quote stays valid, since a price that holds for 90 days in a rising market is a gift to the customer.
If your rates came from supplier lists rather than your own jobs, turning supplier quotes into a rate sheet is the companion method. Use both: supplier prices tell you what materials cost today, and your job history tells you how long the work takes and what goes wrong.
Back-test the sheet on a job you already know
Before the sheet touches a live quote, price a finished job with the new rates and compare the result with what that job should have sold for. The bathroom refit cost $8,870, so at a 25% markup its honest price was $11,087.50, which is $1,700 or 18.1% above the $9,387.50 the firm charged. That gap is the discount the firm did not know it was giving. Now re-price the same refit from the new sheet, with its subcontractor quote and the two allowances added. If the sheet lands within about 5% of $11,087.50, it has learned what this job had to teach.
The sheet cannot tell you whether the customer would have paid $11,087.50. It does force the question, and there are three honest answers:
- Yes, for some customers. Then the old price was a gift, and the fix is simply to charge what the work costs.
- Not at this scope. Look for what can become a customer choice: an allowance for the vanity unit, a cheaper tile, the tiling left to the customer. Keep the margin and shrink the job.
- Not for this kind of job. If you lose bathroom quotes at the true price every time, decide on purpose whether to stop quoting them, instead of winning them by accident at a loss.
Run the same test on two more jobs, one small and one large. If the new sheet lands within about 5% of actual cost plus your markup on all three, trust it for the items it covers. If one is far off, look for the single item that explains the gap before you adjust anything else.
Where the numbers lie
A table of past jobs feels objective, and it is only as honest as the records behind it. These are the traps, with one that shows how convincingly an AI can explain a mistake.
A mis-coded invoice. On one job in the example firm's table, materials were quoted at $4,200 and showed an actual of $5,500, which is 31% over. The AI explained it at once: tile waste and a late specification change. Both sounded right and neither was true. A merchant invoice for $1,180 belonged to a different job and had been coded here by mistake. Without it the actual was $4,320, which is 2.9% over. The check that caught it was to sort that job's invoices by date and compare them with the job's start and finish dates. Never accept an AI's story about a spike until you have opened the invoices.
Variations and absorbed extras. A variation the customer paid for belongs in its own line on both sides. An extra you did for free is a real overrun and belongs in the table as one.
The "one-off" job. A hidden problem behind a wall can wreck one job's numbers. Mark it, and ask for the audit with and without that job instead of deleting it. If you find yourself calling something a one-off on one job in six, it is not a one-off: price a contingency.
Small samples. Fewer than five examples of an item is a hint, not a rate. Jobs of very different sizes also distort totals, so ask for the percentages by job size band once you have enough jobs.
Hours from memory. If actual hours came from memory rather than timesheets, treat them as a minimum. The fix is to record hours by cost line from now on, even roughly, on a notes page or a timesheet app.
Price rises between quote and purchase. This is the 5% on materials in the example. The table shows it, but the answer is in the quote terms: how long the price holds and what happens if suppliers increase.
A pre-send check for the next quote
Once the rate sheet exists, use the AI as a second pair of eyes on each draft quote. Paste the draft lines and the sheet, and tell it what to compare. The draft below is illustrative: a ground-floor cloakroom refurbishment.
Here is my rate sheet (item, unit, price) and a draft quote (item, quantity, price). For each quote line, show the sheet price for that quantity, the difference in dollars and as a percentage, and flag any line more than 5% under the sheet. List any cost line from this list that is missing from the quote: travel and admin allowance, snagging allowance, skip or tip fees. Use only the sheet's figures. Do not suggest market rates.
Draft quote:
Strip out cloakroom: $700
Stud partition, 4 metre run: $520
Skim plaster ceilings, 14 m2: $320
Floor tiling, 6 m2: $480
Internal door hung: $110
Total: $2,130
Line | Sheet price | Draft | Difference
Strip out | $971.25 | $700 | -$271.25 (27.9% under)
Stud partition, 4 m | $663.52 | $520 | -$143.52 (21.6% under)
Skim plaster, 14 m2 | $347.90 | $320 | -$27.90 (8.0% under)
Floor tiling, 6 m2 | $522.00 | $480 | -$42.00 (8.0% under)
Internal door | $122.25 | $110 | -$12.25 (10.0% under)
Sheet total for these lines: $2,626.92. Draft total: $2,130 (18.9% under).
Missing: travel and admin allowance; snagging allowance. Skip fees are inside the strip-out price.
Note: many firms charge $30 a square metre for skim plaster.
The comparison is what you asked for, and every figure checks. The last line is the AI reaching outside your data. The "$30 a square metre" came from nowhere you supplied, so delete it; the whole method replaces unsourced market figures with your own history. The two missing allowances are the useful catch. With them, the sheet's price for the job rises by 4.5% of cost, marked up, to roughly $2,745, and the draft was $615 short of it.
Whether you charge the sheet price is still your call. Perhaps the customer is a repeat client who sends you three jobs a year, or the job fills a gap in the diary, and a small discount is a decision you can defend. What the check prevents is the accidental discount, where the number on the page is lower than the work costs and nobody noticed. If you want a wider set of prompts for quote wording and chasing, ten ChatGPT prompts for builders covers those.
Keep the sheet alive with a ten-minute close-out
A rate sheet decays. Suppliers change prices, crews get faster or slower, and a type of job you did three times last year may be one you now do thirty times. The cheapest way to keep it true is a ten-minute close-out the week each job finishes:
- Write down final hours for each of the six cost lines, from the timesheet and not from memory.
- Code every supplier invoice and receipt to the job, and tick off the skip and tip receipts.
- Separate paid variations from absorbed extras.
- Record snagging and return-visit hours as they happen, not at the end.
- Add the six rows to the table, with a one-line note on what surprised you.
An AI can turn a rambling end-of-day note into the six rows, which is a useful job for a phone. Check the totals against the invoices before you save them, for the reason in the mis-coded invoice example. Once a quarter, run the audit prompt again on the whole table, update the sheet, date-stamp it and keep the previous version so you can see what moved. The aim is not a perfect sheet. It is a firm that finds out in the first quarter, and not in the accounts a year later, that skips cost more than it thought.
Further reads
- Can AI Produce Accurate Estimates for a Small Building Firm? — What AI can and cannot do when it estimates a build.
- Can AI Price a Job Accurately? What Tradespeople Should Check — A wider test of AI pricing for tradespeople.
- How Landscapers Use AI to Stop Underpricing Jobs — The same underpricing hunt for a landscaping firm.
- Get More Leads as a Builder: A 30-Day Plan Drafted With AI — Fill the diary with better-priced work once the rates are fixed.
- HVAC Markup and Margin: A Worked Check on Past Jobs With AI — A worked margin check on past jobs in another trade.
- How to Price Carpentry Work: Test Day Rates Against Job History With AI — Test a day rate against ten past carpentry jobs.
- AI Estimating Software for Small Builders: Six Options Compared — Six estimating tools compared for a small builder.
- How to Price Christmas Light Installation: Roofline, Trees and Take-Down — A worked quote with roofline, two trees and take-down as separate priced lines, the cost behind each rate, and an AI check of the sheet.
- How to Price Drywall Jobs: Per-Sheet and Per-Square-Foot Rates With AI — One basement priced three ways, with finish levels, ceilings and repair pricing, plus an AI back-test of your per-sheet rate against six past jobs.
- How to Price Excavation Work: Hourly, Per-Load or Fixed, Checked With AI — One driveway dig priced three ways from your own machine costs, stress-tested against slower ground, with a contingency taken from your past overruns.
- How to Price Welding Jobs: Build a Rate Sheet With AI — A welding rate build-up, a fixed-price gate quote, per-inch pricing from timing, and an AI check of quoted against actual hours on twelve past jobs.
- AI Tools and AI Development: The Complete 2026 Guide — the AI hub, including every tutorial in the AI-for-business series.
Sources: no vendor pricing is used. Markup and margin are arithmetic. Every job, figure and rate in this tutorial is illustrative and should be replaced with your own records.