# Weekly health check for your most important web pages

> Every Monday at 6am we open each page on your watchlist in a real browser and tell you exactly which ones broke, with a screenshot of each one.

- Workflow type: code
- Services: Steel, Google Sheets, Slack Bot
- Categories: Marketing, Operations
- Published: 2026-08-10

## What it does

- Reads your watchlist from a Google Sheet, where each row is a page that matters: your homepage, pricing, key landing pages, and top blog posts, along with the phrase that must appear on it and the shortest acceptable length.
- Opens every page in a real browser rather than just fetching the raw file, so pages that look fine to a simple check but break for actual visitors still get caught, and saves a screenshot of what each page really looked like.
- Runs the same six checks on every page: it loaded at all, it has a title, it has a search result description under 160 characters, it has exactly one main headline, your required phrase is still on the page, and the content has not shrunk below your minimum.
- Adds one row per page per run to a results tab so the sheet becomes a history you can look back through, then posts a Slack message naming only the pages that failed and exactly which checks they failed. If everything passed, you get a single clean line.

## What you'll need

- A Steel account, which is what opens each page in a real cloud browser and takes the screenshots
- A Google account and a spreadsheet with two tabs: one holding your page watchlist, one for the results history
- A Slack workspace and a channel where the weekly result should land
- Your list of pages that matter, and for each one a phrase that must appear on it and a minimum length

## Prompt

Every Monday at 6am, run a health check across our most important public pages and tell me exactly which ones broke. Use a cron trigger set to weekly on Monday at 6am.

Start by reading the watchlist from Google Sheets with Get Values, pointed at the watchlist tab. Each row is one page that matters, such as the homepage, the pricing page, key landing pages, and top blog posts. The columns are: the page URL, a required phrase that must still appear on that page (for example the current plan name or the wording of the main call to action), and a minimum word count for that page's body. Skip the header row, and skip any row with a blank URL.

For each URL in the watchlist, do two things with Steel. Use Scrape Webpage to render the page in a real browser and return the cleaned HTML and the markdown, since JavaScript-rendered marketing pages often look fine to a plain fetch while being broken for actual visitors. Then use Capture Screenshot on the same URL to get a hosted image URL showing what the page actually looks like. Keep the hosted screenshot URL, because that is what makes the links in the spreadsheet and the Slack message work without any file handling.

Then apply this fixed checklist to each page, recording a pass or fail for each of the six checks independently. One: the page rendered instead of erroring, meaning the scrape returned usable content rather than an error or an empty body. Two: the title tag is present and not empty. Three: the meta description is present and is under 160 characters. Four: there is exactly one H1 on the page, so both zero H1s and multiple H1s are failures. Five: the row's required phrase still appears somewhere in the page text, matched case-insensitively. Six: the body word count, taken from the markdown, has not fallen below that row's minimum. A page fails the run if any one of the six checks fails.

Append one row per page per run to the results tab with Append Values, so the sheet becomes a history over time rather than being overwritten. Each row should carry the run date, the page URL, a pass or fail value for each of the six checks in its own column, the measured word count and the row's minimum, an overall pass or fail, and the hosted screenshot link.

Finally, post a Slack message with Slack Bot Send a Message to the channel I choose. Lead with the number of pages checked and the number that failed. Then list each failing page with its URL, the specific checks it failed spelled out in plain words (for example "missing meta description", "3 H1s found", "required phrase 'Start free trial' not found", or "word count 210 is below the minimum of 600"), and its screenshot link. If nothing failed, post a single clean line confirming all pages passed, including how many were checked, so the channel stays quiet but I can still tell the check actually ran.

Treat a page that could not be loaded at all as a failure of the rendered check and continue to the next URL, rather than letting one dead page stop the whole run. Every page on the watchlist should get a results row every week, even the ones that failed.

## How to customize

- The required phrase for each page, such as your current plan name, your price, or the exact wording of your main call to action button, so a silent CMS edit gets caught
- The minimum word count per page, which is what flags a thin page, a half-published draft, or a post whose body quietly disappeared
- The day and time it runs and which Slack channel hears about it, plus whether you want a message when everything passed or only when something broke

## FAQ

### What counts as a page being broken?

Six specific things, checked the same way every week: the page failed to load, the browser tab title is missing, the description that shows under your link in Google search results is missing or longer than 160 characters, the page has zero or more than one main headline, the phrase you said must appear is gone, or the page has fewer words than your minimum. You get told which of those failed, page by page, not just that something is wrong.

### Will this work on a site built with Webflow, Squarespace, WordPress, or a headless CMS?

Yes. Each page is opened in a real browser and given time to fully draw itself before anything is checked, so sites that build their content in the visitor's browser are read the same way a customer would see them. This matters because a page can look perfectly healthy to a basic check and still be blank or broken for real visitors.

### Do I get a Slack message even when nothing is wrong?

Yes, but only one line confirming all pages passed, so the channel stays quiet and you still know the check actually ran. A silent channel is ambiguous, since it could mean everything is fine or that the check stopped running weeks ago. You can turn the all clear line off if you would rather only hear about problems.

### How many pages can I put on the watchlist?

Add a row for every page you would be embarrassed to have broken, which for most teams is somewhere between ten and a hundred. Each page is opened individually, so a longer list simply takes longer to work through. Start with your homepage, pricing, your top few landing pages, and your best performing blog posts.

### Do I need to be technical to set this up?

No. The parts you control are all in the spreadsheet: the page address, the phrase that must appear, and a minimum length. If you can maintain a spreadsheet you can maintain the watchlist, and adding or removing a page later means adding or removing a row, with no need to touch the workflow itself.

Use this prompt in General Input: https://www.generalinput.com/prompts/weekly-health-check-for-your-most-important-web-pages