I've spent three years building a price comparison tool. It works, it's free, and it has made no money. I want to write about the part that turned out to be genuinely difficult, because it wasn't the part I expected.
The problem I thought I was solving
Read a product page, search other shops, compare the numbers, show the cheapest. A scraping and ranking problem.
The problem I was actually solving
Deciding whether two listings are the same product.
This sounds trivial and it is not. Television manufacturers produce retailer-specific variants of the same set, distinguished by a letter or two at the end of the model number. The panel is often identical. The stand, the port count, or a bundled feature may differ slightly.
The effect is that a like-for-like comparison frequently does not exist. The exact model sold at one shop is genuinely not sold at another. It is not deception — the model numbers are printed plainly — but it does make the market far less comparable than it looks.
Air fryers do the same thing with bundles. Cordless vacuums do it with which cleaning heads are in the box. Laptops do it with configurations, where one product name covers many machines separated by a lot of money.
So "find the same thing cheaper" runs into a question with no clean answer: what counts as the same thing?
What I decided to do about it
The obvious approach is fuzzy matching. Normalise the titles, compare brand and model tokens, accept a similarity score above some threshold, show the result. Most tools do a version of this.
I found it produced confidently wrong answers. An electric toothbrush at £94.99 in one shop and £280 in another is not a £185 saving. It is two different products, or a marketplace listing for a bundle, or an error. A tool that reports that gap as a saving has not helped anyone.
So the system does two things instead.
It separates prices it verified from prices it merely found. A price where we opened the retailer's own product page and read it is shown plainly. A price that only appeared in a search result is labelled unconfirmed. These are different epistemic categories and collapsing them is how you end up publishing a number that was never true.
It refuses implausible comparisons rather than reporting them. If the gap between cheapest and dearest is enormous and nothing corroborates that the model codes actually match, the comparison is dropped. Sometimes that means telling the user less than a competitor would.
That trade felt wrong for a long time. A tool that says "I could not confirm this" looks worse than one showing a big number. I have come round to thinking it is the only defensible position, because the alternative is being confidently wrong about how someone spends a few hundred pounds.
A bug that taught me something
I had this rule implemented in the code that builds the comparisons. Then I wrote a second feature that also needed to filter comparisons, and it grew its own copy of the logic — a simpler one, a raw threshold on the price gap.
Predictably, the two drifted. The simpler filter passed a comparison the main one had already refused, and published it. The toothbrush example above is the real case.
The fix was not a better threshold. It was moving the rule into one module that both callers import, so there is no second rule left to diverge. Obvious in hindsight. The failure mode is worth naming though: duplicated business logic doesn't announce itself as duplication. It announces itself as an inconsistent product, months later, in the part of the app you weren't looking at.
The actual mistake
Three years building. About three weeks distributing.
The product does what it says. It is approved on the Firefox and Edge add-on stores, it reads 38 retailers, and there is a free tier with no card. Almost nobody has used it, because until very recently nothing pointed at it. No links, no listings, no posts.
If you are building something on your own, the ratio I got wrong is the thing worth taking from this. The engineering problems are more interesting than distribution. They are also not the ones that decide whether anyone ever uses what you made.
It is called Bargn if you want to look. Free, no card, and it will tell you when it could not confirm something.
Happy to answer anything about the matching approach. It is the part I would most like to be told I got wrong.
Top comments (0)