Template · Marketing

Monthly website content audit

On the first of each month, Jimothy checks every page on your list responds, then Claude Code reads each one against your current facts: pricing, plan names, integrations, customer counts. It flags anything out of date, broken outbound links and weak titles or descriptions, and posts a fix list ordered by how much each page matters.

Download .json

Schedule0 8 1 * *Monthly website content audit1st · 08:00
Pipeline
  1. Check pages respond Shell
  2. Audit content Claude Code · Sonnet
  3. Post to Slack Shell
Slack#marketing11 fixes: pricing page still says $29, 3 broken links on /integrationsPosted
The pipeline

What each step does

  1. Check pages respond

    Shell

    Requests each page and records its HTTP status.

  2. Audit content

    Claude Code · Sonnet

    Reads every page against your current facts and checks outbound links, titles and descriptions.

  3. Post to Slack

    Shell

    Posts the fix list to Slack.

Set it up

From copy to first run

  1. Copy the pipeline JSON with the button above.
  2. In Jimothy, open Pipelines → New pipeline, paste it under “Or import a pipeline JSON” and click Import.
  3. Fill in the variables below under Pipeline settings → Variables.
  4. Triggers → Add trigger → Schedule, cron 0 8 1 * * (08:00 on the 1st of each month).
Variables

What to fill in

The prompts and commands read these as {{vars.<name>}}. The examples are placeholders: replace them with your own.

VariableWhat to put in itExample
pagesThe pages to audit, one URL per line, most important first.https://acme.example/ https://acme.example/pricing https://acme.example/integrations
factsWhat’s true today: prices, plan names, integrations, numbers you quote. Pages are checked against it.Plans: Starter $39/user/month, Team $79/user/month, Enterprise custom. Integrations: Net…
slackWebhookUrlA Slack incoming webhook for the channel that gets the fix list.—
Show the pipeline JSON
{
  "jimothyPipeline": 1,
  "name": "Monthly website content audit",
  "description": "Checks key pages for broken links, outdated claims and weak titles, and posts a prioritised fix list.",
  "icon": "sparkles",
  "color": "#be185d",
  "repo": {
    "mode": "scratch"
  },
  "concurrency": 1,
  "variables": {
    "pages": "https://acme.example/\nhttps://acme.example/pricing\nhttps://acme.example/integrations",
    "facts": "Plans: Starter $39/user/month, Team $79/user/month, Enterprise custom. Integrations: NetSuite, QuickBooks, Xero, Sage Intacct. 1,400 customers. SOC 2 Type II.",
    "slackWebhookUrl": ""
  },
  "steps": [
    {
      "id": "status",
      "name": "Check pages respond",
      "type": "shell",
      "description": "Requests each page and records its HTTP status.",
      "timeoutMinutes": 5,
      "command": "printf '%s\\n' {{vars.pages}} | while read -r u; do [ -n \"$u\" ] && printf '%s %s\\n' \"$(curl -s -o /dev/null -L -m 20 -w '%{http_code}' \"$u\")\" \"$u\"; done"
    },
    {
      "id": "audit",
      "name": "Audit content",
      "type": "agent",
      "description": "Reads every page against your current facts and checks outbound links, titles and descriptions.",
      "harnessId": "claude-code",
      "model": "sonnet",
      "dependsOn": [
        "status"
      ],
      "timeoutMinutes": 40,
      "prompt": "Audit these pages (HTTP status first):\n{{steps.status.output}}\n\nWhat is true today:\n{{vars.facts}}\n\nFor each page that responded: read it, and check\n- claims, prices, plan names, numbers and integrations against the facts above;\n- dates and \"new\" or \"coming soon\" language that is now stale;\n- outbound links (request each one; list any that fail);\n- the title tag and meta description (missing, duplicated, over 60 or 160 characters, or vague).\n\nYour final answer is a Slack message (*bold*, - bullets): pages that didn't respond first, then fixes ordered by page importance (the list order) and severity. Each fix names the page, quotes the current text and says what it should say. Skip pages with nothing to fix. If nothing needs fixing anywhere, say so in one line."
    },
    {
      "id": "post",
      "name": "Post to Slack",
      "type": "shell",
      "description": "Posts the fix list to Slack.",
      "dependsOn": [
        "audit"
      ],
      "timeoutMinutes": 2,
      "command": "printf '{\"text\":%s}' {{steps.audit.output | json}} | curl -fsS -X POST -H 'Content-Type: application/json' --data @- {{vars.slackWebhookUrl}}"
    }
  ]
}