Tools & Reviews 11 min read

Website Change Detection: Track Web Page Changes

Website change detection explained: how page monitoring works, top tools to track content changes, and DIY scraping-based options. Pick your setup now.

ST
Scraping.Pro Team
Data collection for business needs
Published: 6 July 2025

Website change detection is the practice of automatically watching a web page and getting notified when its content changes — a price drops, a competitor updates a product page, a government portal publishes a new document, a job you want gets posted, or a piece of software ships a new release. Instead of reloading a page over and over by hand, you point a monitor at it and let the alerts come to you.

The idea is old, but the tooling in 2026 is far better than it was a decade ago. Modern change detection can render JavaScript-heavy pages, watch a single element instead of the whole document, ignore ads and rotating banners, and push alerts to email, Slack, Discord, or a webhook. This guide explains how page monitoring works, compares the leading tools, and shows two DIY approaches — a no-code Google Sheets recipe and a proper Python scraper — so you can pick the right setup for your use case.

What "change detection" actually means

At its core, a change detector does four things on a schedule:

  1. Fetch the page (plain HTTP request, or a real headless browser for dynamic sites).
  2. Extract the part you care about — the whole page, a CSS/XPath-selected region, text only, or a specific number.
  3. Compare the new snapshot against the last stored one.
  4. Notify you if the difference is meaningful.

The hard parts are all in steps 2 and 3. A naive monitor that hashes the entire HTML will fire on every visit, because pages are full of noise: timestamps, CSRF tokens, ad slots, "customers also viewed" carousels, and random ordering. Good change detection isolates the signal — usually by targeting a specific element and comparing normalized text rather than raw markup.

The three families of monitoring tools

Historically, change-tracking tools fell into three buckets, and the split still holds:

  • Browser extensions — run inside Chrome or Firefox. Easy to set up by clicking the element you want to watch. Limitation: they only check while your browser (and computer) is running.
  • Desktop applications — more powerful, with archiving and side-by-side diffs, but again tied to a machine that has to stay on.
  • Cloud services — run on someone else's servers around the clock, so you get alerts even when your laptop is closed. This is where most serious monitoring lives today.

For anything you need checked reliably, on a short interval, or from a fixed geography, a cloud service or a self-hosted server job beats a browser add-on.

Leading website change detection tools in 2026

The old guard (Page Monitor, Update Scanner, Page2RSS, InfoMinder, Femtoo, WebSite-Watcher) has largely been replaced or absorbed. Here is what people actually use now.

changedetection.io (open source, self-hostable)

The most popular DIY-friendly option. Free and open source, runs in Docker, and has a slick web UI. It supports CSS/XPath selectors, visual selection, JavaScript rendering via a bundled Playwright/Chrome fetcher, price-tracking for e-commerce, and notifications to 80+ channels (email, Slack, Discord, Telegram, webhooks) through the Apprise library. A hosted plan exists if you don't want to run it yourself. This is the default recommendation for technical users.

Visualping

The best-known hosted service. Point-and-click element selection, visual (pixel) and text comparison, scheduling down to minutes on paid tiers, and a generous free plan for a handful of pages. Good for non-technical users who want alerts without running anything.

Distill.io

Browser extension plus cloud sync. You select a region visually, and it can watch it locally in the browser or on Distill's cloud. Strong for people who live in the browser and want conditional alerts ("notify only if the price is below $X").

Wachete, Hexowatch, Fluxguard

Hosted services aimed at business monitoring. Hexowatch layers in extra checks — visual, content, source-code, technology, and even AI-based "monitor for anything" prompts. Fluxguard targets compliance and enterprise change management with detailed audit trails.

urlwatch (command line)

A lightweight, scriptable CLI tool for developers who want monitoring in cron or CI. You keep a YAML list of URLs (and optional filters), and it emails you diffs. Minimal, no server, very hackable.

Browser extensions that still work

Page Monitor and similar Chrome extensions, and Update Scanner on Firefox, are still around for quick personal watches. They remain fine for casual use, with the same old caveat: no browser open, no checking.

How to choose quickly:

  • Non-technical, a few pages → Visualping or Distill.io.
  • Technical, want control and no per-page fees → self-host changedetection.io.
  • Just want it in a script/cron → urlwatch.
  • Enterprise compliance and audit → Fluxguard or Hexowatch.
  • Casual personal watch → a browser extension.

DIY option 1: no-code monitoring with Google Sheets

If all you want is a lightweight daily check on one specific part of a page, a full monitoring tool is overkill. A Google Sheet can scrape a value and email you when it changes — no server, no code.

The trick is the IMPORTXML function, which pulls a value out of a page using an XPath expression:

code
=IMPORTXML("https://example.com/product/101", "//span[@class='price']")

Put that in a cell and the sheet fetches the price on a recurring schedule. Then turn on notifications: Tools → Notification settings → Notify me when… any changes are made. Each time IMPORTXML returns a different value from before, the sheet records an edit and Google emails you.

Caveats worth knowing:

  • IMPORTXML only sees the raw HTML, so it can't read values injected by JavaScript. For dynamic sites you need a real browser (see the Python approach below).
  • Refresh timing is Google's call — expect updates on the order of an hour, not seconds.
  • One sheet can hold dozens of watched cells, which makes it a surprisingly capable free monitor for static pages.

This is the modern version of an old forum trick, and it still answers the classic question "what's the simplest way to know when part of a page changes?" without touching a scraper.

DIY option 2: a Python change detector

For dynamic pages, precise selectors, or short intervals, write a small script. The pattern is: fetch → extract with a selector → compare to the stored snapshot → alert on change. Here's a compact, dependency-light version:

python
import json, os, smtplib
from email.message import EmailMessage
import httpx
from selectolax.parser import HTMLParser

WATCHES = [
    {"name": "phpMyAdmin latest release",
     "url": "https://www.phpmyadmin.net/",
     "selector": ".list-downloads a"},
    {"name": "Competitor pricing",
     "url": "https://example.com/pricing",
     "selector": "#plan-pro .price"},
]
STATE_FILE = "snapshots.json"

def extract(url, selector):
    html = httpx.get(url, headers={"User-Agent": "Mozilla/5.0"},
                     follow_redirects=True, timeout=30).text
    node = HTMLParser(html).css_first(selector)
    return node.text(strip=True) if node else ""

def load_state():
    return json.load(open(STATE_FILE)) if os.path.exists(STATE_FILE) else {}

def notify(name, old, new):
    print(f"CHANGED: {name}\n  was: {old!r}\n  now: {new!r}")
    # swap in real email/Slack/webhook delivery here

def run():
    state = load_state()
    for w in WATCHES:
        current = extract(w["url"], w["selector"])
        previous = state.get(w["name"])
        if previous is not None and current != previous:
            notify(w["name"], previous, current)
        state[w["name"]] = current
    json.dump(state, open(STATE_FILE, "w"), indent=2)

if __name__ == "__main__":
    run()

Run it on a schedule with cron, a systemd timer, or a free GitHub Actions cron workflow so it fires even when your machine is off:

yaml
# .github/workflows/monitor.yml
on:
  schedule:
    - cron: "*/30 * * * *"   # every 30 minutes
jobs:
  watch:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: pip install httpx selectolax
      - run: python monitor.py

Two upgrades make this production-grade:

  • JavaScript-rendered pages. Swap the httpx fetch for Playwright so the DOM is fully built before you read the selector.
  • Getting blocked. Sites that dislike frequent automated hits will start returning captchas or 403s. Route requests through rotating proxies and, if needed, a captcha-solving service. This is the same anti-blocking playbook as any web scraping project.

Use case: watching for new software releases

A common, concrete job: "tell me when phpMyAdmin (or any project) ships a new version." The script above already does it — point the selector at the download/version element on the project's site or, better, at its GitHub releases page. You could also skip HTML entirely and poll the GitHub Releases API, which returns clean JSON and never needs a selector. The general lesson: if a structured feed or API exists (RSS, a releases endpoint, a JSON API), monitor that instead of scraping rendered HTML — it's more reliable and won't break on a redesign.

What to compare: text, pixels, or a number

  • Text diff — normalize whitespace and compare the visible text of your target element. Best default for most content.
  • Visual (pixel) diff — screenshot the page and compare images. Catches layout and image changes, but is noisy; reserve it for cases where appearance matters.
  • Numeric threshold — parse a number (price, stock count) and alert only when it crosses a bound. Ideal for price and availability monitoring.

Whichever you pick, add a change threshold so trivial edits (a single character, a rotating timestamp) don't spam you.

Common pitfalls

  • Watching the whole page instead of one element — guarantees false positives. Always narrow with a selector.
  • Ignoring anti-bot defenses — short intervals against a protected site will get you blocked; throttle, rotate IPs, and respect robots.txt and terms of service.
  • No dedup on notifications — if a value flaps back and forth, debounce so you're not paged repeatedly.
  • Assuming static HTML — many prices and stock figures load via JavaScript; confirm your value is in the raw HTML before relying on a simple fetch.

When to hand it off

DIY monitoring is cheap for a handful of pages. It gets expensive in maintenance once you're watching hundreds or thousands of URLs across sites that fight back — proxies, browser rendering, selector upkeep after redesigns, and reliable delivery all add up. If you'd rather receive a clean, structured feed of changes than run the plumbing, scraping.pro offers change tracking as a managed data-as-a-service feed, including dedicated competitor price monitoring and review monitoring. You define the pages and the fields; the alerts and datasets show up on your schedule.

The bottom line

Website change detection has matured from browser add-ons into robust cloud and open-source tooling. For a couple of static pages, a Google Sheet with IMPORTXML or a browser extension is enough. For dynamic sites, precise selectors, or frequent checks, self-host changedetection.io or write a small Python watcher on a scheduler. And when the scale or the anti-bot arms race outgrows a hobby setup, offload it to a managed service and just consume the alerts.