Change-monitoring SaaS has a strange pricing model: you pay every month for the pages that did not change. The actual work — fetch, extract, compare — is close to free, and the hard parts are two design decisions most tools get wrong.
Decision 1: what counts as "the page"
Hash the raw HTML and everything is a change: rotating nonces, cache busters, CSRF tokens, ad slots. The signal is in the content layer:
- Strip
script,style,nav,header,footer,aside, cookie banners, andaria-hiddennodes. - Scope to
main/article/[role="main"]when the page declares one, elsebody. - Flatten block elements to lines, collapse whitespace per line, drop empties.
Hash that. A pricing page now only "changes" when prices, plans, or copy change — not when the CDN rotates an asset fingerprint. Offer a CSS selector as an override for surgical cases (.pricing-table), but make the no-selector path the default; nobody wants to maintain selectors for 100 monitored URLs.
Decision 2: what a "change" looks like in the output
A screenshot pair is where information goes to die. The useful output is a line diff:
{
"url": "https://competitor.com/pricing",
"status": "changed",
"addedLines": ["Pro plan $49/mo"],
"removedLines": ["Pro plan $39/mo"],
"previousChangeAt": "2026-06-20T08:00:00Z",
"checkedAt": "2026-07-07T08:00:00Z"
}
You do not need a full LCS diff for this. A multiset comparison of lines (count occurrences per line on each side, report the surplus in each direction) catches everything a human cares about on a monitored page, runs in linear time, and never blows up on a 10,000-line page.
The state problem
The piece that makes this a product instead of a script is persistence: each URL's last text, hash, and timestamps have to survive between runs. On Apify that is a named key-value store — it lives in your account, so a scheduled run picks up exactly where the last one left off. Key the state by URL plus selector, so changing the selector re-baselines cleanly instead of producing one giant false diff.
Baselines deserve their own status. The first time a URL is seen there is nothing to compare against; report baseline, store the state, charge nothing. A monitoring tool that bills you for learning what a page looks like is charging you for its own setup.
The economics
A plain-HTTP check on a monitored page costs a few thousandths of a cent in compute. That is why per-change pricing works: I packaged this as an Apify actor — Website Change Monitor — where baselines, unchanged checks, and fetch errors are free and you pay $0.01 per detected change. A hundred stable pages on a daily schedule cost exactly $0 until one of them moves. The verification run for this article watched Hacker News and example.com: HN came back changed +28/-28, example.com came back unchanged, and the bill for both checks was four hundredths of a cent.
Wire the dataset into Slack or Sheets with an integration and you have the same alerts the subscription tools sell, except the diff is structured, the state is yours, and the invoice only exists when the web actually changed.
Top comments (0)