Because generic tools match on brand plus title text, and in wine the two attributes that set the price, vintage and bottle volume, are inconsistently placed and often absent. Two listings whose titles agree character for character can be different goods, priced apart by more than any discount you would ever choose to give.
A wine match is valid only when producer, wine name, vintage and volume all agree. Match a 2021 against a 2019 and you reprice against a wine that has had two extra years of scarcity applied to it, then wonder why the margin moved.
This is not a scraping problem. It is an identity problem, and it does not improve with more data.
Vintage is a different product, not a variant
The 2019 and the 2020 of one wine are separate goods with separate stock, separate scores and separate scarcity. When a vintage sells through, its price does not fall. It leaves the market, and the remaining listings rise.
That is the opposite of how a comparison engine expects a product to behave, and it is why vintage-blind matching produces one specific error: chasing your price down towards a wine that no longer exists.
Non-vintage complicates it further. Champagne, most sparkling wine and many entry-level blends are legitimately non-vintage. A missing vintage on a listing is not the same thing. Store three distinct states: known year, declared non-vintage, and unknown. Merging the last two is how a Brut NV ends up matched against a numbered vintage cuvée at four times the price.
Why price per litre is the wrong normaliser
In every other category the instinct is to normalise to a base unit. In wine that instinct is wrong.
A 0.75 litre bottle at 24.00 is 24.00 / 0.75 = 32.00 per litre. The 1.5 litre magnum of the same wine at 68.00 is 68.00 / 1.5 = 45.33 per litre. The 0.375 half at 14.50 is 14.50 / 0.375 = 38.67 per litre.
A per-litre comparison declares the magnum 42 percent overpriced, since 45.33 / 32.00 = 1.42. It is not overpriced. Large formats carry a real premium for glass, filling runs, slower ageing and scarcity, and small formats carry a premium for handling cost per unit of liquid. Compare magnum against magnum and half against half.
Use per-litre figures only as a data quality check within one format. If two shops disagree by a factor of two on the per-litre price of a 0.75, one of them has the volume wrong.
The fields a wine match must agree on
- Producer as the estate, not the importer, the agency or the retailer's preferred spelling
- Wine name and cuvée, since one estate may sell six wines under variations of a single name
- Vintage, or an explicit non-vintage flag
- Bottle volume in millilitres, taken from product data and never from a shipping weight
- Unit of sale: single bottle, three-pack, six-pack, twelve-pack, original wooden case
- Duty status where the market has one: in bond or duty paid
- Colour and sweetness where the estate makes several versions under the same label
- Gift or presentation packaging, which is a different article at a different price
Where wine matchers go wrong in practice
- A 1.5 kilogram despatch weight read as a 1.5 litre magnum
- Apostrophes and accents tokenised as part of one word, so a search for the estate returns nothing at all
- A six-bottle case price read as a bottle price, or the reverse: 24.00 read as a case of six becomes 4.00 a bottle, and 4.00 / 24.00 = 0.167, an apparent 83 percent discount that does not exist
- One barcode reused by the producer across several vintages, so a code match silently crosses years
- A retailer page listing dozens of wines, where extraction reads the first price on the page rather than the one belonging to the article
- The same wine listed under German, French and English names in three markets and matched as three products
- Bottle volume defaulted to 750 millilitres when absent, which is right most of the time and wrong precisely on the large formats where the money is
Duty, delivery and the border
In markets with an in-bond trade, a duty-paid price includes excise and VAT and an in-bond price includes neither. The gap between them is not a pricing decision and should never enter a comparison as though it were.
Delivery thresholds do the same damage more quietly. A shop charging 6.90 for shipping and waiving it from twelve bottles adds 6.90 / 6 = 1.15 a bottle on a six-bottle order. On a 9.90 entry-level wine that is 1.15 / 9.90 = 11.6 percent, larger than the margin difference you were trying to measure.
Cross-border makes it worse again. A German shop shipping to Austria and a French shop shipping to Belgium compete on landed price, and the shelf figure is only one component of it.
When there is no comparator at all
Fine wine has a long tail. For plenty of vintages nobody else lists your bottle, and the honest answer is that no comparison exists.
The usable substitutes, in rough order of reliability: adjacent vintages of the same wine at the same shops, the same estate's other cuvées at the same shops, auction and market indices where the wine is classified enough to appear, and the producer's published release price.
Then it is a judgement. This is exactly where the general pattern shows itself: an unmatched wine gets priced too low far more often than too high, because the reflex when nobody knows the number is to discount rather than to hold.
A matching order that survives a real catalogue
- Identity first: producer, wine, vintage, volume. No match without all four
- Then attributes: colour, sweetness, unit of sale, packaging
- Then confidence: score the match and route anything below the threshold to a person rather than into the price engine
- Then record the decision, accepted or rejected, so the same pair is not judged again next month
- Re-check identity whenever a shop redesigns its pages, because extraction changes quietly and the failure is silent
Wine punishes an approximate match harder than any other category, which makes it a fair test of any comparison tool, PriceRoom included. A system that cannot hold vintage and volume as first-class fields, and refuse a match without them, will produce numbers that look precise and are not.