The method

Being right is the product.

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.

214products tracked
2,458captures archived as evidence
353changes published, each with its source
0public corrections to date

The pipeline

Six steps from a pricing page to the record.

Machines checking machines. Nothing waits for a person, and nothing is published because a person was in a hurry.

  1. 01

    Read

    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.

    Thrown away hereA vendor that blocks the crawler is switched off, not routed around.
  2. 02

    Archive

    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.

    Thrown away hereNothing. A capture is evidence whether or not it leads to a change.
  3. 03

    Extract

    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.

    Thrown away hereAny extraction quoting a number that is not on the page.
  4. 04

    Diff

    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.

    Thrown away hereRewordings, flag flips, a promotion rotating, the other side of a billing toggle.
  5. 05

    Audit

    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.

    Thrown away hereWhatever still cannot be confirmed. The record keeps what it had; the next capture gets a fresh look.
  6. 06

    Publish

    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.

    Thrown away hereNothing, ever again. A published change is corrected in public, not edited.

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

Not everything that changes is a price change.

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.

01

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.

02

The other side of the toggle

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.

03

A first reading

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.

04

Another currency

A page that answers in euros one day and dollars the next is routing by location, not repricing. That capture is discarded.

05

A page that will not hold still

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.

06

An unconfirmed reading

If the audit cannot confirm an extraction, nothing is published. A gap in the record is better than a guess in it.

Provenance

Every figure wears its origin

Three tags sit beside numbers across the site. They say where the fact came from — always something outside us that you can check.

captured by markupbot ↗

Seen on the pricing page

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.

THE DEFAULT SINCE TRACKING BEGAN
sourced from archive ↗

Reconstructed, and labelled

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 SHORT HONEST HISTORY BEATS A LONG GUESSED ONE
corrected

Fixed in public

A figure that went through the public corrections process. The note says what was wrong and when — every one is published at /corrections.

SPOTTED SOMETHING OFF? HELLO@MARKUPWATCH.COM

House rules

Seven rules, no exceptions.

  1. 01
    Nothing behind a login. Public pages only. No scraped accounts, no shared screenshots of customer dashboards.
  2. 02
    robots.txt is law. Disallowed paths are not crawled, and repeated blocks put a page to sleep rather than route around it.
  3. 03
    Every figure links to its source. An archived capture or the vendor’s own announcement — one click from every number.
  4. 04
    Dates never overstate. Each change says whether the date was stated by the vendor or detected by our crawler.
  5. 05
    Gaps stay gaps. History we can’t source stays unwritten. A short honest record beats a long guessed one.
  6. 06
    No silent edits. A published change is immutable. Errors are corrected in public, with what was wrong and when.
  7. 07
    Watchlists are private. What you watch is never sold, aggregated for vendors, or used for targeting.