How to build a price comparison engine
The architecture behind a working price comparison site: canonical products, landed cost, per-seller history and published match confidence.
A comparison engine is four problems stacked. Identity, so two listings that are the same product resolve to one record. Normalisation, so prices are comparable — landed cost including shipping, and unit price where pack sizes differ. History, so a discount claim can be defended. And freshness, so the number you show is still true when someone clicks.
Identity is where most projects fail. With a valid GTIN it is a join and essentially free; without one it is inference, and inference produces confident errors. Publish your match confidence on the page. It is a trust signal that costs nothing because the number already exists internally.
Normalise before you rank. A product that is cheaper on sticker and more expensive delivered is not cheaper, and a comparison that ranks it first is worse than showing nothing.
For discount depth, use percentile against the product's own history at that seller rather than percent-off a reference price the seller chose. Comparison sites get into trouble over inflated reference prices; they do not get into trouble over an auditable statement about what a product has actually cost.
Keep reading
What is commerce intelligence?
Commerce intelligence is the layer above price monitoring: an index of what exists, who sells it, at what, and what that means.
Why percentile beats percent-off
A percentile against a product's own history is a defensible measure of discount depth; percent-off a reference price is not.
Product matching and why it fails quietly
How cross-seller product matching works, the three ways it fails, and why published match confidence matters.
GTIN, UPC, EAN and ASIN
How product identifiers relate, why check digits matter, and what to do when there is no identifier at all.
Data provenance in commerce data
Why every price should carry its origin and a confidence weight, and what goes wrong when it does not.