What 79,000 quote lines taught us about construction prices.
Building a reliable price database takes far more than an extraction algorithm. We had to understand, line by line, how a quote is built, then translate that estimating logic into a rigorous data model. Here is what we learned along the way.
Our study covered
79,000
Price lines extracted
566
Quotes modelled · 89 projects
2,240
Work items
Deconstructing estimating logic
Before comparing anything, we had to tell apart three objects that quotes and estimating habits constantly mix up.
Object 1The price
A single element of an assembly, priced in its own unit: tile adhesive, window fitting, a linear metre of skirting. It can be compared directly, as long as you know which item it refers to.
Object 2The ratio
A bundle of prices brought back to a reference unit: the square metre of laid flooring, the square metre of facade, the living area. It carries the main item, its accessories, its site constraints and a share of site overheads.
We came across two forms: aggregation, when the same item is repeated across several zones, and composition, when different items are stacked on a supporting surface.
Object 3The design ratio
This is not really a ratio any more: it is an all-inclusive price spread over a reference area of the project, the square metre of living area or floor area. The bathroom of a two-bedroom flat (T3): 4.80 m² of tiling at €65/m² supplied and fitted, i.e. €312. Divided by the flat's 64.20 m² of living area, that gives €4.86/m² of living area.
It gives valuable orders of magnitude early on, provided you never confuse it with the first two.
What a ratio really contains
A resilient floor covering in circulation areas, as we broke it down in a quote from the corpus. The “flooring” line makes up only half of the ratio.
€79.55/m²all-inclusive ratio
Resilient flooring €42.5/m²
PVC skirting and upturns €11.0/m²
Levelling compound €5.28/m²
Edge trims €2.43/m²
Allocated site overheads €18.33/m²
What the prices taught us
Each finding was measured on the corpus, then checked against a reference set classified by hand. Several contradicted our starting assumptions.
+30%reinforced vs unreinforced
Detail comes at a price
Two industrial concrete floor slabs, one reinforced, the other not. Measured separately on more than 200 prices, their distributions overlap heavily, yet their medians are €10 apart: €41.5 versus €31.8/m². An engine that lumps them together publishes a price that is neither.
Distribution of observed unit prices, one price per quote. Reinforced slab: 146 prices, unreinforced: 62. Six prices above €80/m² fall outside the chart.
It is the technical characteristic that sets the price, and our line items are defined at that level of detail.
×1.5only, through deduplication
The keyword myth
On a sample of more than 8,000 lines, we counted nearly 5,500 distinct wordings used to describe the items. The wording of DPGFs (itemised price schedules) follows no common sentence structure: every engineering consultancy, every contractor has its own. A keyword search, however well tuned, is ineffective.
We had to engineer our algorithm to break through this variability. The engine identifies the item behind the sentence, whatever its wording.
78%vs 11%
Reliability by unit
Our work showed that the reliability of a price depends intrinsically on its unit of measurement. Studying price dispersion item by item, eight in ten references expressed per kilo turn out to be usable, against one in ten for lump sums.
Share of references whose dispersion stays below 40% (coefficient of variation), by unit of measurement.
Our AI weights each reference according to this rule: a lump-sum price is treated as an indication, never as a strict basis for estimating.
2 digitsand a €8/m² gap
Nuance makes the difference
A 72/48 partition and a 98/48 partition: any quantity surveyor or engineer knows, without thinking, that they are not the same price. An artificial intelligence does not. Two digits in the middle of a twenty-word description weigh next to nothing in its eyes, and the prices do not warn it: the two distributions overlap enough for grouping them to look acceptable. On the market, though, the difference is worth €8 per square metre, with medians of €48.5 versus €56.8/m².
Distribution of observed unit prices, one price per quote. 72/48: 21 prices, 98/48: 25. Two prices fall outside the chart.
It is this kind of detail, obvious to a professional and invisible to an algorithm, that we had to teach our engine item by item. Without this work, an automated price analysis is bound to fail.
What the ratios taught us
Ratios are the working tool of estimating. They are also the most misleading, because they hide their composition.
€2/m²final gap
One ratio can hide another
On paper, a price per square metre can look markedly cheaper than another. But once everything that comes with it is counted, mobilisation/demobilisation, accessories, site constraints, miscellaneous costs, the comparison looks very different. We observed two roof waterproofing jobs on refurbishment projects, priced by two contractors on two different sites, end up with all-inclusive ratios just €2 apart.
The market converges more than it seems. It is the scopes that blur the comparison, and they are what we reconstruct.
−22%on a single quote
The economies-of-scale paradox
The all-inclusive “laid tiling” ratio of a single quote goes from €128/m² for a 32 m² room to €100/m² for a 138 m² room. It is not the quantity ordered that matters: the tiling itself costs almost the same. It is geometry. Skirting, expressed per square metre of floor, weighs €25/m² in a small room against €8/m² in a large one.
Laid tiling
Skirting, expressed per m² of floor
Breakdown of the ratio for the two rooms of the same quote, rounded values.
Comparing a ratio requires knowing the geometry behind it. We keep it alongside the ratio.
AI proposes, the expert disposes
Our measurements leave no room for doubt: left alone to define the line items, an AI over-splits, and its agreement with the reference classification drops from 0.91 to 0.63. So we built a hybrid pipeline, where the algorithm learns the estimator's logic instead of replacing it.
Step 1
Extraction and cleaning
The PDF quote is broken down into structured data. The AI writes a short summary of each item, stripped of site locations and site constraints. This one choice of representation raises the recognition rate from 61% to 92% compared with raw text.
61 → 92% recall
Step 2
Learning from the expert
The AI proposes, the expert validates. Each decision becomes a pin that guides the following ones. Over 250 decisions, the accuracy of suggestions rose from 27% to 86%. Domain expertise is not replaced, it is multiplied.
Share of suggestions accepted as they are, per block of 50 decisions.
Step 3
Similarity-based classification
Once the reference set is validated, the system files each new line simply by how closely it resembles those already classified. No language model is called at search time: classification is deterministic, instant and free of hallucination. Anything the system is not sure about goes into a sorting bin, never into the database.
The PriceBox rigour protocol
A price database is first valued for what it refuses to claim. Our algorithm follows strict safeguards.
Never a fragile referenceFewer than three quotes, or too much dispersion? The data is kept as an indication, but is not displayed as a validated estimating basis.
No illusory average pricesAn average between a “steel deck alone” and a “steel deck with finish” exists on no site. Our detector of multi-peak distributions blocks these blends.
Fixing it at the rootWe refuse to blindly retrain models to correct an error. We correct the data itself, the pin, and the effect propagates immediately.
Steel deck substrate, 48 observed prices: two distinct clusters around €45 and €75/m², and four prices beyond €170/m² outside the chart. The average falls between the two peaks, where almost no quote sits.
Your quotes already contain your price database.
PriceBox extracts it, structures it and makes it comparable, quote after quote, with your expertise in the loop.
Figures drawn from our research on the PriceBox corpus. Anonymised aggregates, no individual quote can be identified. Detailed methodology available on request.