We read seven months of quotes and found we were building the wrong thing

The roadmap was built on what was easy to read. Not on what the business actually sells.

Installation and retail
One week of analysis

A Dutch sun-shading installer

A product catalogue was being built supplier by supplier, in the order the price lists happened to be readable. Nobody had checked whether that order matched what customers were actually being quoted. So we checked.

458 of 458
quote documents read
1,112
priced lines analysed
85%
of volume from four suppliers

The challenge

Every catalogue project has an implicit assumption inside it: that the order you build things in roughly matches the order they matter. Usually nobody states the assumption, so nobody tests it.

Here the build order was driven by which supplier files parsed most easily. That is a perfectly reasonable engineering heuristic and it has nothing whatsoever to do with revenue.

The question - "what do we actually sell?" - sounds like it should be a report someone can run. It was not. The answer only existed inside several hundred quote documents, written across four different templates, some listing prices including VAT and some excluding.

What we did

01

Read every quote, not a sample

A sample invites an argument about the sample. Every historic quote document was parsed line by line, so the finding could not be dismissed as selection bias.

02

Normalise before comparing

Four different quote templates positioned the price column differently and disagreed about VAT. All lines were normalised to one basis before anything was counted.

03

Deduplicate revisions

Quotes get revised. Counting revisions as separate sales would have inflated exactly the suppliers who quote most iteratively.

04

Cross-check against an independent source

The ranking was verified a second time against supplier order confirmations in the mailbox - a completely separate record. Same ranking both ways.

05

Reverse the roadmap

The build order was rewritten to follow demand. The finding also exposed a live operational gap that had a hard external deadline attached to it.

How it works

Four suppliers, most of the volume

Four suppliers accounted for roughly eighty-five percent of everything quoted in seven months. None of them had a single price in the system.

The inversion

The supplier with the most products configured produced one quote line in seven months. The supplier carrying about a third of the volume had three products configured.

Zero published prices

At the point of measurement there were no published price lists at all - the catalogue work to date had produced structure without a single usable price.

A growing gap

The analysis surfaced a set of recent quotes that existed in no system at all, against a hard cut-off date when the legacy mailbox would be closed.

Complete, not sampled

Every quote document parsed successfully - a full read, so the totals are the population rather than an estimate.

Two independent sources agree

Quote documents and supplier order confirmations are produced by different processes. Both produced the same supplier ranking.

One VAT basis

Mixed-basis totals are the classic way this analysis goes wrong. Normalisation happened before aggregation, not after.

Written down

The analysis is a document with its method stated, so the next person can re-run it rather than re-litigate it.

Technologies

TypeScript Node.js PDF parsing PostgreSQL Data analysis

The result

Every one of the 458 quote documents was read - 1,112 priced lines, deduplicating to 357 distinct quotes.

The roadmap inverted. Work moved off the supplier with the most products configured and onto the four suppliers that actually carry the volume, none of which had a price in the system at the time of measurement.

The honest summary is that a week of measurement invalidated several months of assumed priority. That is uncomfortable and it is much cheaper than the alternative, which is finding out later. This is the whole method in one artefact: measure the thing everyone believes they already know.

Revenue figures, supplier names and per-supplier commercial splits are confidential and are not published here. The percentages and counts above describe the shape of the finding without disclosing the underlying commercial data.

Related work

A Dutch sun-shading installer

Three percent looks completely normal

A supplier's price list was three percent too high. That is exactly the kind of error nobody catches.

TypeScript Node.js PostgreSQL
A Dutch sun-shading installer

408 messages in a week. Thirty-three were actual customers

One shared inbox was absorbing the whole company. Sorting it had quietly become somebody's job.

TypeScript Node.js Google Workspace API