Site Health Report
Know the site works without checking it: daily alerts and a weekly report.
- Monitoring
- Trigger.dev
- Reports
Install
npx skills add webrenew/skills --skill launch-site-health-report1 file · 216 lines · any agent that reads SKILL.md
Use it when
- The owner hears about a broken form from a customer
- A certificate or domain could expire unnoticed
- You want a weekly summary of leads and site health
What your agent delivers
- Daily checks: uptime, a real form test, certificate and noindex
- Alerts that say the impact first, once per problem
- A weekly email that the owner reads in under a minute
Source files
Read every line before you install. Copy or download one file.
SKILL.md
216 lines
---
name: launch-site-health-report
description: >
Build scheduled jobs that check a small business website every morning and alert when
something breaks, plus a short plain-English weekly email for the owner: is the site up,
does the form still deliver, how fast is it, are links broken, when do the certificate and
domain expire, and how many leads came in. Use this skill for site monitoring, weekly reports,
uptime checks, form tests, Core Web Vitals tracking, broken-link checks, or "tell me if my
site breaks". Built with Trigger.dev scheduled tasks.
---
# Site Health Report: Know the Site Works Without Checking It
**RULE: A breakage alerts the same morning the daily check finds it. Everything else waits
for one short weekly email that the owner can read in under a minute.**
Most small business sites break quietly: a form stops delivering after a plugin or provider
change, a certificate expires, a page starts to 404. The owner finds out from a customer, or
never. This job finds out first.
## What to check
| Check | How | Alert at once when |
|---|---|---|
| Site is up | `GET` the home page and main landing page | Status is not 200, or the response takes over 10 s |
| Form delivers | Call the test entry point, then confirm the lead was stored and `ownerAlertedAt` is set | Not stored, or no alert after 5 minutes. A 503 from the test route (`LEAD_TEST_SECRET` or `LEAD_TEST_INBOX` unset), a 401 or 403 (the job's secret does not match the site's), or a site that is not `business.url`, is a configuration error: alert the agency, and do not tell the owner the form is broken. |
| Certificate | Read the TLS certificate and its expiry | Not valid for the hostname, or under 14 days left |
| Domain | Expiry date from RDAP (auto-renew status is only in the registrar's account) | Under 30 days left |
| Broken links | Fetch every URL in `sitemap.xml` and internal links on key pages | A page in the sitemap returns 4xx or 5xx |
| `noindex` | Check robots meta and `robots.txt` on key pages | A production page says `noindex` |
| Speed | Chrome UX Report (field data) or PageSpeed Insights | LCP, INP or CLS moves from "good" to "poor" |
| Leads | Count leads this week vs last week, by source | (report only) |
## Scheduled task
```ts
// trigger/site-health.ts
import { schedules } from "@trigger.dev/sdk"
import { runChecks } from "@/lib/site-health/checks"
import { sendAlert, sendWeeklyReport } from "@/lib/site-health/report"
export const siteHealthDaily = schedules.task({
id: "site-health-daily",
cron: { pattern: "0 7 * * *", timezone: "America/New_York", environments: ["PRODUCTION"] },
maxDuration: 300,
run: async () => {
const results = await runChecks({ quick: true }) // uptime, form, TLS, noindex
const broken = results.filter((r) => r.status === "fail")
if (broken.length > 0) await sendAlert(broken)
return { failed: broken.length }
},
})
export const siteHealthWeekly = schedules.task({
id: "site-health-weekly",
cron: { pattern: "0 8 * * 1", timezone: "America/New_York", environments: ["PRODUCTION"] },
maxDuration: 900,
run: async () => {
const results = await runChecks({ quick: false }) // everything, including links and speed
Related skills
All skills- 21
Lead Triage Agent
Launch packlaunch-lead-triage-agent
An agent sorts each lead and drafts a reply that the owner approves from a phone.
An agent sorts each lead and drafts a reply that the owner approves from a phone.
- 22
Agent Guardrails
Launch packlaunch-agent-guardrails
Rules that make a customer-facing agent safe to turn on and easy to trust.
Rules that make a customer-facing agent safe to turn on and easy to trust.
- 01
Technical SEO
Growth & marketingseo-technical
Make each page clear to search engines. Give them a path to every link.
Make each page clear to search engines. Give them a path to every link.
- 02
Local SEO
Launch packGrowth & marketinglaunch-local-seo
Get found by customers nearby, in local search and on Google Maps.
Get found by customers nearby, in local search and on Google Maps.