Ordinary uptime monitoring asks three things: does the URL respond, with what status code, and how fast.

All three share a blind spot: they look at the response, not the content.

A page can be a 200 and empty at once

The frame of the page is rendered by a template. The content is filled in from a data source. When the data source comes back with nothing, the frame renders anyway.

So you get a page with a 200, a title, a menu, a footer and a complete structure, and a blank space in the middle.

The monitoring is happy. The visitor sees an empty page.

Judge by content instead

Our probes no longer look at status codes. They look at how much text is in the main content area.

They grab the main content block, strip the tags and count the characters that are left. Below the threshold, it’s red, whatever the status code says.

The threshold has to be set page by page, since a listing page and a contact page differ by an order of magnitude. If you can’t settle on a number for a page, at least set “not zero.”

The same shape shows up elsewhere

“It ran successfully” doesn’t mean “it produced something.” A batch job that exits with code 0 might have processed 300 records, or none.

“The file exists” doesn’t mean “the file has something in it.” A failed write can leave a zero-byte file behind, and most downstream steps only check that it exists.

⭐ Every green light should answer one question: does it prove “I finished,” or “the thing is there”? The distance between those two is exactly how much room it has to lie.