A promotion
“50% off for three months” is recorded as a promotion, with the price it reverts to. It is not a price cut, and its ending is not an increase.
The method
A wrong price on a public page is worse than no page. This is exactly how the record is kept: what is read, what is checked, and — the part most trackers skip — what is thrown away.
The pipeline
Machines checking machines. Nothing waits for a person, and nothing is published because a person was in a hurry.
MarkupBot re-reads every tracked pricing page at least daily, and recently changed ones several times a day. A plain fetch first; a real browser only when the page needs one. robots.txt is honoured and nothing behind a login is ever collected — see /bot.
Every capture that differs from the last is stored as it was — the page text and a rendered image, hashed and immutable. Each published figure links to the exact capture it came from, so anyone can check the source we saw.
A language model reads the capture into structured plans: price, billing interval, unit, which side of the monthly/yearly toggle, any promotion and what it reverts to. Then the first check: every extracted price must appear in the page text.
The new reading against the record, field by field. This step is deterministic code, not model output, and a suite of golden cases from real pricing pages referees every change to it.
A second, independent model re-reads the capture and checks the extraction figure by figure. Agreement publishes. Disagreement sends the objections back for one corrected re-read, which is audited again from scratch.
The change goes on the record with its effective date — labelled “stated by vendor” or “detected by us”, never implied precision — the old and new figures, and its source. Alerts go out the same day.
COUNTED LIVE FROM THE DATABASE THAT SERVES THIS PAGE · LAST PUBLISHED CHANGE EFFECTIVE 2026-10-08 · 2 CAPTURES WAITING FOR THE AUDIT RIGHT NOW.
What the record refuses
Most false price alerts come from the same six things. Each of these was once published here as a change. Each is now a rule.
“50% off for three months” is recorded as a promotion, with the price it reverts to. It is not a price cut, and its ending is not an increase.
A plan has two prices: paying monthly, and a lower monthly rate billed yearly. The record notes which one it holds. A page showing the other one has not changed its price.
The first time a product is read, its plans go on the record as a baseline. The vendor did not launch four plans the day we arrived.
A page that answers in euros one day and dollars the next is routing by location, not repricing. That capture is discarded.
A plan that reports the same kind of change three times in a fortnight is an unstable source. The record stops listening until it settles.
If the audit cannot confirm an extraction, nothing is published. A gap in the record is better than a guess in it.
Provenance
Three tags sit beside numbers across the site. They say where the fact came from — always something outside us that you can check.
The figure comes from one of our own archived captures. The tag links to the capture itself — the page as it looked the day the price was read.
History from before we tracked a product, rebuilt from vendor announcements, changelogs and public archives — linked to the announcement, never blurred with our own captures.
A figure that went through the public corrections process. The note says what was wrong and when — every one is published at /corrections.
House rules