Competitor price data is wrong more often than people admit because the visible failures are the rare ones. A blocked request or a 404 announces itself. The common failure is a request that succeeded, returned a page and produced a number that is not the price a customer would pay.
Three things go wrong quietly: the wrong page is matched to your product, the right page yields the wrong number, and the number is correct but out of date. Only the last one is usually monitored, and only loosely.
The failure that gets counted, and the ones that do not
Most teams track a collection success rate. Take a catalogue of 20,000 tracked listings collected daily. At a 98 per cent success rate, 400 collections fail and somebody sees them. The other 19,600 are marked good.
Nothing in that figure says whether the 19,600 are correct. Success measures HTTP status and parser completion. Correctness measures whether the number equals what a buyer in your market would be charged today. Those are different questions, and most monitoring answers only the first.
Where the number goes wrong on a page that loaded fine
- The strike-through price captured instead of the current price, or the reverse, because the shop swapped its markup during a campaign.
- A member price, app price or logged-in price shown to some visitors and not to your collector, or the other way round.
- A subscription price shown as the default, with the one-off purchase price hidden behind a radio button.
- The displayed price per unit read as the price of the pack: 2.99 per litre recorded from a 1.5 litre bottle that costs 4.49.
- A variant selector defaulting to the cheapest size, so the 250 ml price lands against your 1 litre product.
- A finance or leasing figure, common in construction equipment and B2B machinery, captured as the purchase price.
- Decimal and thousands separators parsed with the wrong locale, turning 2.499 euro into 2.50 euro.
- An out of stock listing keeping its last price on the page indefinitely, which is not an offer at all.
VAT, delivery and currency: the cross-border traps
The same product genuinely costs different amounts to different buyers, and a collector does not know which buyer it is impersonating.
- B2B shops quote net, B2C shops quote gross. Comparing the two produces a gap roughly equal to the VAT rate, 19 per cent in Germany and 20 per cent in the United Kingdom. A 100 euro net price and a 119 euro gross price are the same offer.
- Delivery thresholds change the effective price. A cheaper item with 5.90 euro shipping only beats a dearer item with free delivery for buyers below the free-delivery basket value.
- Minimum order quantity in distribution. A price of 1.20 per unit at 500 units is not comparable to 1.60 at one unit.
- Currency converted at collection time and never revisited, so a rate from March gets compared against a price from August.
- Regional storefronts. The .de and .at pages of one retailer are different offers with different tax and different delivery.
Decide once whether your comparison space is net or gross, delivered or ex works, then store the raw figure and the conversion separately so you can change your mind later without recollecting everything.
Bot defences produce quiet errors, not loud ones
A site that wants to stop automated collection has two options. It can block you, which you will notice. Or it can serve you something plausible, which you will not.
- A cached page from hours or days ago, served to traffic that looks automated.
- A geo-priced page based on the address of a data centre in a country you do not sell in.
- A page rendered without the script that injects the real price, leaving a placeholder that parses cleanly.
- A consent wall behind which the page renders default prices rather than the visitor's regional ones.
The countermeasure is not a cleverer collector. It is a freshness stamp on every stored price, a record of which method produced it, and an alert when a competitor's entire catalogue stops moving.
Measure your own error rate instead of guessing
Pull fifty matched pairs at random each week. Open both pages by hand in a normal browser and record whether the stored price equals what a buyer would pay. Count anything ambiguous as wrong.
The arithmetic is small enough to do on paper. Four wrong out of fifty is 8 per cent. The standard error is the square root of 0.08 times 0.92 divided by 50, which is about 0.038, so the ninety-five per cent range runs from roughly 0.5 to 15.5 per cent. That range is wide, which is the point: fifty samples tell you whether you have a problem, not how large it is. Repeat weekly and the picture sharpens.
Sample by value as well as at random. Fifty random pairs from a long tail catalogue say almost nothing about the two hundred products that carry your margin.
Guard rails that cost almost nothing
- Reject any collected price that moves more than a set percentage from the last stored value until a person confirms it.
- Require two independent collections before a price may trigger a repricing rule.
- Store currency, tax basis and collection timestamp with every figure, not in a configuration file somewhere else.
- Expire prices. Anything older than twice your refresh interval should stop influencing decisions.
- Keep the source URL and a snapshot reference so a disputed number can be checked without collecting it again.
- Alert on suspicious patterns: identical prices across unrelated products, or a competitor whose prices never change.
The cost of being wrong is asymmetric
A wrong high price is usually harmless. You decline to follow it and nothing happens. A wrong low price is expensive: it drags your own price down, and unlike a lost sale, a discount you did not need to give leaves no trace in your reporting.
This is why the goal of price intelligence is not to be cheapest. It is to know, with a stated confidence, what the market is actually charging. PriceRoom exists because that second thing is harder than it looks and the failures are quiet.