Either the monitor read the HTML before JavaScript filled it in, or it did run JavaScript and its selector stopped matching. You can tell which in about two minutes with the browser you already have.
When a website monitor misses changes on a JavaScript page, it is almost always one of two faults. Either the monitor read the HTML the server sent, and the text you care about only gets added later by JavaScript, so it was never in what the monitor saw. Or the monitor did run the JavaScript, the shop changed its front end, and the selector now matches nothing. From the outside both look the same: no alerts, and a page that has obviously changed. You can tell them apart in a couple of minutes with the browser you already have, and the fix is different for each.
Because your browser does two jobs and a lot of monitors only do the first. It downloads the HTML, then it runs the page's JavaScript, and on a modern shop that second step is often what puts the price, the stock label and the product grid on screen. MDN defines a single-page application as a web app that "loads only a single web document, and then updates the body content of that single document via JavaScript APIs". The words you are watching arrive after the page has loaded.
Google hits the same wall. Its JavaScript SEO basics explain that for sites built on the app shell pattern "the initial HTML does not contain the actual content and Google needs to execute JavaScript before being able to see the actual page content". Google gets round it by putting pages in a render queue and opening them in headless Chromium. It also notes that "not all bots can run JavaScript", and plenty of website monitors are in that group by default.
it will fetch using a plain non-JS built in browser
Open the page in Chrome on a computer and work through these in order. The first two tell you whether the content is in the HTML at all. The last two are for when it is there and something else has gone wrong.
View the page source and search it
Press Ctrl+U (Cmd+Option+U on a Mac) to open the source the server sent, then Ctrl+F for the exact words you are watching, such as the price or Out of stock. If they are not in the source, JavaScript adds them.
Reload with JavaScript switched off
Open DevTools, press Ctrl+Shift+P (Cmd+Shift+P on a Mac), type javascript and choose Disable JavaScript, then reload. What is left is roughly what a monitor without a browser sees. Chrome notes that JavaScript only stays off in that tab while DevTools is open.
If the text is there, check the selector
Right-click the element, choose Inspect, and compare what you see with the selector your monitor uses. A class name that looks machine-generated is the kind that changes when a shop rebuilds its site.
Look at what the monitor last captured
A blank value, the page title, or a value that has not moved in weeks while the page clearly has, all point to a selector matching the wrong thing or nothing at all.
| What you see | Likely cause | What to do |
|---|---|---|
| The text is on screen but missing from View Source | JavaScript adds it after load | Watch the data request behind it, or use a monitor that runs a real browser |
| The page goes blank or loses the price with JavaScript off | The page is an app shell | Same as above |
| The text is in the source, but the monitor's value is empty | The selector no longer matches | Pick the element again and prefer a stable attribute over a generated class |
| The monitor's value never changes, but the page does | The selector matches a different element, often a hidden template | Narrow the selector to the part a person actually sees |
That last row catches people out on shops that ship every button state in the HTML and hide the ones that do not apply. We walked through a real case, a hidden Notify Me button sitting next to a live Add to Bag button, in how to monitor a website for a specific word.
Because from the tool's point of view nothing failed. The page loaded, the request came back fine, and the selector returned something, even if that something is empty. A DEV post from 31 January 2026 makes the point well: a broken selector tends to hand back an empty value, the page title or stale data, and "From the outside, everything still looks 'green'". It is one developer's experience rather than a measured failure rate, and nobody we could find has published one, but anyone who has run a monitor for a few months will recognise it.
The habit that saves you is checking the captured value, not only the alert history. An empty value on a page you can see has content is a broken monitor, whatever its status light says.
There are two, and the heavier one is the one people reach for first.
The first is to run a real browser. It works, because the monitor then sees what you see, but it is the most expensive way to check a page. changedetection.io's Playwright fetcher page starts its browser container with `--shm-size="2g"` and documents a memory leak in Playwright that "can easily consume 200Mb->several gigabytes". The workaround it suggests is a scheduled job that restarts the service once it passes 240MB. That is fine for a handful of pages checked every few minutes, and it gets painful when you want lots of pages checked often.
The second is to watch the data instead of the page. The JavaScript that fills in the price had to get it from somewhere, usually a JSON request you can watch directly. That request is small and quick to check, and a redesign rarely breaks it, because nobody restyles JSON.
Open the Network panel
Open DevTools, go to Network, and reload the page so every request is recorded.
Filter to data requests
Click Fetch/XHR. That hides images, fonts and scripts and leaves the requests the page made for data.
Search the responses for the price
Press Ctrl+F (Cmd+F on a Mac) inside the Network panel to open its Search tab, type the price or product name as it appears on screen, and press Enter. The matching request is the one to watch.
Open that URL on its own
Paste it into a new tab. If it loads without you being signed in, a monitor can read it too.
Some platforms make this easy. A Shopify shop running a Shopify theme answers `/products/<handle>.js` with the product as JSON, including an `available` flag and the price in pence, and Shopify's Ajax API docs describe it as "an unauthenticated API. It doesn't require access tokens or a client ID to access." Careers pages are similar: most sit on an applicant tracking system with a public job list, which is the approach in our guide to careers page job alerts.
Watching a data URL is also gentler on the site than loading the whole page in a browser each time, which matters if you want to check often. There is more on that in how often you can check a website without getting blocked.
The custom monitor reads the HTML the server sends, and only opens a real browser when a site challenges the request. That keeps each check light enough to run often. It also means the View Source test above applies to it. If the text you want is in the source, point the monitor at it. If it is not, give the monitor the data URL from the Network panel instead of the page. For Shopify shops there is a dedicated Shopify monitor that reads the shop's own product data, so there is no selector to break.
Usually because the monitor read the HTML before JavaScript filled it in, or because its selector stopped matching after the site changed. View the page source and search for the text: if it is missing, it is the first; if it is there, it is the second.
Only with a browser backend. Its own wiki says that without the Playwright fetcher it fetches "using a plain non-JS built in browser", which cannot see content JavaScript adds.
Press Ctrl+U to view the source and search it for the words you want. Or open DevTools, run Disable JavaScript from the Command Menu and reload. If the price or stock label disappears, the page needs JavaScript.
The JSON, when you can find it. It is quick to check and a redesign rarely touches it. The page is the fallback when the data sits behind a login or a token.
Some can, many do not, and a broken selector often returns an empty value rather than an error. Check the value your monitor last captured, not just whether it has sent alerts.
Watch a page for free Point a monitor at the page or the data behind it and get the alert on Discord, email or push.