Weekly health check for your most important web pages

By General Input

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.

Integrations

  • Steel
  • Google Sheets
  • Slack Bot

Type

Deterministic Code

Categories

  • Marketing
  • Operations

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerA brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsClean out the Looker dashboards and Looks nobody opensStop cold emails to anyone with a live deal in PipedriveLiveKit live operations console for room moderationWake up dormant Keap leads with a researched reasoniMessage campaign console with pre-flight checks and delivery board