---
name: google-search-console-decay-rewrite-list
description: "Monthly: pages losing Search Console clicks, how long since each was edited, and whether a fresher competitor page now outranks it, ranked by payoff. Use when the user asks for this, or when it runs on a schedule."
---

# Decaying pages worth rewriting: Search Console, your repo and Ahrefs

Monthly: pages losing Search Console clicks, how long since each was edited, and whether a fresher competitor page now outranks it, ranked by payoff.

A list of pages losing clicks does not tell you which to rewrite. A page edited last month that slipped probably needs patience; a page nobody has touched in a year, now sitting under a competitor's article from three weeks ago, needs a rewrite. That difference lives in your repository's history and in today's results page, not in Search Console.

Once a month the agent finds the pages that lost clicks against three months earlier, looks up when each page's source file was last edited, and checks the current top results for the page's main query in Ahrefs. The card ranks the rewrites that are likely to pay: old pages that a recently updated rival has overtaken.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- A pattern that maps URLs to source files in the repo (or a CMS with a modified date), and read access to the repo through `gh`, the GitHub MCP server or a full local clone (a shallow clone gives wrong dates).
- Read access to the Search Console property, and Ahrefs API v3 access (MCP server or `AHREFS_API_KEY`); one SERP overview per decaying page.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Find pages that lost clicks** (Google Search Console): Call `searchanalytics.query` with `dimensions: ["page"]` for the 28 days ending 2 days ago and for the 28 days ending 91 days earlier (13 weeks back, so weekdays line up). Keep pages down 30% or more and by at least 60 clicks. For those, query `dimensions: ["page", "query"]` on the earlier window and take the query with the most clicks as the page's main query.
2. **Find each page's last edit** (GitHub): Map the URL path to its source file with the pattern in settings (for example `/blog/<slug>` to `content/blog/<slug>.mdx`), then run `git log -1 --format=%cs -- <file>` in a full clone or call `GET /repos/{owner}/{repo}/commits?path=<file>&per_page=5`. Skip commits whose message matches `format|lint|prettier|rename|bump`, which touch files without changing the content. For a CMS, read its modified date instead (WordPress: `modified` from `/wp-json/wp/v2/posts?slug=<slug>`).
3. **Check who outranks you now** (Ahrefs): For each main query, call `GET /v3/serp-overview/serp-overview?keyword=<query>&country=us&top_positions=10&select=position,url,title,domain_rating,traffic,update_date`. Find your URL and keep the results above it; fetch each of those pages and read `dateModified` or `datePublished` from its JSON-LD, or `article:modified_time`, as the competitor's last update.
4. **Join and rank the rewrites**: Join on the normalized URL path (lowercase, no query string or trailing slash): Search Console page to source file, and Search Console page to your row in the Ahrefs results. Rank first the pages untouched for 300 days or more with a competitor above them updated in the last 90 days, then the other untouched pages, each group by clicks lost. Pages with no source file are listed as "edit date unknown"; pages missing from the Ahrefs top 10 as "out of the top 10".
5. **Ask which to brief**: Post an action card with the ranked list: page, clicks then and now, days since the last edit, and the fresher page above it with its date. Offer to draft a rewrite brief for the pages picked, built from the competitor pages and the queries the page lost.

## Route B: the browser

### What you need

- Signed in to Search Console, to GitHub with read access to the repo (or to your CMS), and to Ahrefs on a plan with Keywords Explorer.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://search.google.com/search-console/performance/search-analytics. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Compare clicks with three months ago**: Pick the property, open Date > Compare > Custom, and set the last 28 days against the 28 days ending 91 days earlier. On the Pages tab, sort by the Clicks difference and keep pages down 30% or more and by at least 60 clicks.
2. **Note each page's main query**: Click each page, open the Queries tab, and note the query with the most clicks in the earlier period. Remove the page filter before the next one.
3. **Read the last edit date**: On GitHub, open `https://github.com/<owner>/<repo>/commits/main/<path to file>` for each page's source file and note the date of the last commit that changed the text, skipping formatting or rename commits. In a CMS, read the page's last modified date.
4. **Check the results above you**: In Ahrefs, open Keywords Explorer, enter the main query, and scroll to the SERP overview. Find your page, open each result above it and note its updated or published date.
5. **Rank and ask**: Put pages untouched for 300 days or more with a rival above them updated in the last 90 days first, then the rest, by clicks lost. Ask which rewrites to brief.

Note: Competitor dates come from what each page shows, which some sites hide or refresh without real changes; treat a missing or suspicious date as unknown. Ten pages take about 20 minutes of clicking; past that the API route is the better one.

## The report

- **Decaying pages** that lost 30% or more of their clicks against three months ago.
- **Days since last edit** for each, from the repo or the CMS.
- **Fresher rivals**: the competitor page above you and when it was updated.
- **Ranked rewrite list**: old pages with a fresh rival first.
- The ask: which rewrites to brief.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "google-search-console-decay-rewrite-list/<date of this run, e.g. 2026-10-16>",
  "item_key": "google-search-console-decay-rewrite-list",
  "project": "example.com",
  "source": "Decaying pages worth rewriting: Search Console, your repo and Ahrefs skill",
  "kind": "action",
  "title": "9 decaying pages untouched for 300+ days; fresher rivals beat 5",
  "summary": "**9 pages** lost 2,380 clicks against the same 28 days three months ago, and none has been edited in 300 days or more. On **5 of them** a competitor page updated in September now ranks above you.",
  "action": {
    "request": "Which rewrites should I brief first?",
    "options": [
      "Brief the top 5",
      "Only /blog/invoice-template",
      "Show the lost queries",
      "Skip this month"
    ]
  },
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Page",
          "Clicks then",
          "Clicks now",
          "Days since edit",
          "Fresher page above you"
        ],
        "align": [
          "left",
          "right",
          "right",
          "right",
          "left"
        ],
        "rows": [
          [
            "/blog/invoice-template",
            2140,
            1320,
            412,
            "ledgerly.example, Sep 18"
          ],
          [
            "/blog/what-is-net-30",
            980,
            610,
            530,
            "billpath.example, Sep 9"
          ],
          [
            "/blog/late-payment-email",
            760,
            430,
            365,
            "ledgerly.example, Sep 25"
          ],
          [
            "/blog/proforma-vs-commercial-invoice",
            540,
            300,
            610,
            "tradedocs.example, Sep 2"
          ],
          [
            "/blog/how-to-invoice-as-freelancer",
            470,
            280,
            338,
            "gigbooks.example, Sep 30"
          ],
          [
            "/blog/invoice-numbering",
            390,
            250,
            702,
            "none newer"
          ],
          [
            "/blog/receipt-vs-invoice",
            310,
            190,
            455,
            "none newer"
          ],
          [
            "/glossary/accounts-receivable",
            260,
            170,
            389,
            "none newer"
          ],
          [
            "/blog/recurring-invoices-guide",
            220,
            140,
            301,
            "none newer"
          ]
        ]
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: 2nd of the month at 9:00 (`0 9 2 * *`). From cron, with the agent signed in on that machine:

```bash
0 9 2 * * claude -p "Run the google-search-console-decay-rewrite-list skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/google-search-console-decay-rewrite-list#schedule

Source: https://briefkin.dev/skills/google-search-console-decay-rewrite-list
