We'd rather it said “no match”
How to design a BOQ-to-catalogue matcher an estimator will sign. Attributes with criticality, rules before the model, a written rubric, abstention, alternates, a review queue and a trail.
- KKK Manoj KumarCo-founder
5 min read
When we built a BOQ matcher for a lighting manufacturer's estimating team in India, one sentence in the matching instructions ended up doing more work than any other: "An incorrect match is a critical failure; no match is an acceptable outcome."
Most of the design follows from that sentence. An estimator can live with a line that comes back blank; they price it by hand, as they did last year. What they can't live with is a confident wrong SKU on line 4.2.14 of a 400-line BOQ, priced and sent because nobody looked twice at a line the system called fine. After one of those, the team checks every line again.
Model the catalogue first
A lighting BOQ line is a compressed spec: "600×600 recessed LED panel, 40 W, ≥4,000 lm, 4000 K, CRI >80, UGR under 19, IP40, non-dimmable driver. 146 Nos." To match it, you need the same facts pulled out of your own item master, in the same shape. Most item masters don't have them. They have a product name, a description someone typed in years ago, and a cost.
The first piece of work is an attribute list for the product family. For luminaires we ended up with about seventy: power, lumen output, CCT, CRI, UGR, IP and IK rating, driver and dimming type, cut-out, dimensions, finish and so on, each with its synonyms ("lm", "lumens", "luminous flux"). Each attribute also gets a criticality. Eighteen were critical, meaning a miss on any one of them makes it a different product. A handful were important. The rest were nice to have, and noisy ones like warranty wording were kept out of matching.
Criticality is a commercial call, so the estimators set it. A finish mismatch on a downlight might be a note on the compliance sheet. A wattage mismatch is a different fitting. On more than one project, the first fortnight went on this list and on cleaning the item master behind it, which is worth keeping even if you never automate anything.
Rules first, then a written rubric
Each BOQ line goes through attribute extraction and a cheap deterministic filter before any model judges it. The filter looks only at mandatory attributes. An attribute counts as matched when the values are equal, when one contains the other, or when the numbers are within ±5%. A candidate SKU has to score 80% on that check to go forward, and every attribute is logged as matched, unmatched or skipped, with the reason.
The filter decides nothing. Its job is to throw out most of the catalogue cheaply and hand the judge a short list, so the expensive step runs on a few candidates per line instead of thousands.
The judge is a model scoring against a written rubric. Ours weighted critical attributes to carry most of the score, and scored each attribute on a fixed scale: exact match 100, a point value inside a specified range 95, numbers by how far off they are, keyword text 80. Hard-reject gates throw a SKU out if two critical attributes score zero, whatever the total. Coverage floors require 80% of critical attributes matched, and 70% overall.
Writing the rubric down matters more than which model reads it. When an estimator disagrees with a match, you can point at the line of the rubric that produced it and argue about that line. Nobody can argue with "the model thought so".
Here is the panel line from above after the judge has scored it:
BOQ 4.2.14 600×600 recessed panel, 40 W, ≥4,000 lm, 4000 K, UGR <19 146 Nos
Best match VS-PNL-6060-40-840 Partially matched · 91
✓ 600×600 ✓ 40 W ✓ 4000 K ✓ UGR 18.6 ✓ IP40
✗ 3,900 lm spec is a minimum of 4,000 (−2.5%)
Alternates VS-PNL-6060-45-840 4,550 lm · 45 W 88
VS-PNL-6060-40-857 4,050 lm · 5700 K 62 (CCT fails)
Status In review queue · deviation on lumen outputLook at the lumens. 3,900 is within 5% of 4,000, so the filter rightly let the SKU through as a plausible candidate. But "≥" is a floor, and the rubric has to know a floor from a target. A matcher that treats every number as close enough within 5% will quietly offer under-spec fittings, and the consultant will reject the submittal.
Three answers and a review queue
The judge's score puts each line in one of three buckets. A score of 95 and above is Matched, 80 to 94 is Partially matched, and below 80 is Unmatched. In the exported estimate, an unmatched line shows "NA" in the product column so nobody mistakes it for a priced line. Every line keeps its top three alternates with their scores.
Start the thresholds tight, with more lines in review than strictly necessary, and loosen them once the estimators have seen enough correct matches in the top bucket to stop opening them.
On the review screen, the BOQ attributes sit next to the SKU's attributes as colour-coded chips, with the three alternates one click away and a manual catalogue search for when none of them is right. When an estimator overrides a match, it's stored as a human choice and never shown as the system's own. Those overrides are the most useful data you'll collect: they show where the rubric is wrong, which synonyms are missing, and which products carry bad attributes.
Keep the whole trail
For every line we keep the input and output of each stage: what was extracted, what the filter scored and why, what the judge scored and why, what the reviewer changed, and the token cost of the line. It sounds like overkill until a sales head asks why line 112 went out with a 3000 K fitting. With the trail, the answer takes a minute: the BOQ said "warm white", extraction mapped that to 3000 K, and the estimator accepted it. Without the trail, you have an argument.
The trail also makes the matcher testable. Take your last twenty tenders, the ones your estimators already priced, and run them through. Count three things: wrong matches in the Matched bucket, lines sent to review that were fine, and lines marked Unmatched that did have a product in the catalogue. The first needs to be close to zero before anyone relies on that bucket, because it's the one that costs money. The other two cost review time, and you can tune them.
If you're building or buying one of these, ask to see the Unmatched tab on your own BOQ before you look at the match rate. A matcher that never says "no match" is guessing on exactly the lines you most need it to leave alone. This is the work we do on BOQ estimation.