---
name: seo_drift_monitoring
description: "Monitor SEO drift over time: compare Search Console periods to spot ranking, content and technical decay before traffic falls, separate confirmed algorithm update effects and seasonality from real drift, and run a monthly drift review with actions, owners and recheck dates. Triggers on SEO drift, traffic dropping slowly, pages losing rankings over time, content decay checks, or setting up ongoing SEO monitoring."
---

# SEO Drift Monitoring

## Purpose

Catch slow search decline while it is still cheap to fix. A single audit shows the state of a site on one day. Drift monitoring compares equal periods over time, classifies what moved, and forces a decision per page: refresh, fix the technical change, consolidate, or leave it alone and recheck on a date.

This skill is tool neutral. It works from Search Console exports, the Search Console API, or any rank and crawl tool that can produce the same page level numbers twice. Thresholds in this skill are triage heuristics. They decide what gets inspected first. They are not Google thresholds and they never prove a cause on their own.

## Workflow

1. Set the windows. Use 28 days against the prior 28 days for the monthly check. End the current window at least 3 days before today, because Search Console data usually takes 2 to 3 days to arrive. Use the same property, the same search type, and the same device split for both windows.

2. Pull page data first. Export clicks, impressions, CTR, and average position by page. Page rows are the reliable unit: Google omits very rare queries from the table for privacy and includes them in chart totals unless a query filter is applied, so query rows will not add up to the totals and a missing query row means unknown, not zero. The Search Console API returns up to 25,000 rows per response, paged with startRow, which beats the interface row cap for large sites.

3. Run the classifier. Run `python3 scripts/drift_check.py --prior prior.csv --current current.csv` and add `--older older.csv` with the period before prior to catch decay. It labels each page disappeared, ranking_decline, content_decay, demand_or_visibility_decline, ctr_decline, mixed_decline, growth, or noise_or_stable, with the numbers that earned the label. Read `references/drift-signals.md` for the full signal list and the thresholds behind each label.

4. Rule out the boring causes first, in this order. Check the disappeared and ranking pages live: status code, redirect target, robots, canonical, and whether the page is still indexed. Then diff the technical snapshot if one exists: title, H1, canonical, meta robots, sitemap presence, internal link count, structured data types, and Core Web Vitals status per template. A deploy that changed a template explains ten pages moving at once better than ten separate content theories.

5. Separate update noise from drift. Check the Google Search Status Dashboard for confirmed core, spam, and Discover updates that overlap the window. During a rollout, do not judge. Google guidance is to wait at least a full week after a rollout finishes, then compare the week after with the week before it began. If the drop starts on the rollout date, hits many unrelated sections at once, and peers report the same pattern, label it update overlap and set the recheck for after that waiting week. If the slide started before the update, affects one section, or matches a site change date, treat it as drift and act.

6. Separate seasonality from drift. Compare against the same period last year when the data exists, and name the confounders in the report: holidays, school terms, weather driven demand, launch spikes, paid campaigns pushing branded search. A demand decline with flat position and flat CTR is usually this bucket. Record it as such instead of assigning content work.

7. Decide per alert. Ranking decline: review intent match and the pages now ranking above, check internal links, then refresh or accept. Content decay: refresh, consolidate into a stronger page, or retire with a redirect, picked this month. CTR decline: fix title and description, check for lost rich results and new SERP features. Disappeared: technical fix today, content work waits until the page is back. Noise: no action, it stays in the log.

8. Run the monthly review. Follow `references/monthly-review.md`: site totals, alerts in classifier order, technical diff, update and change log overlay, then one action, one owner, and one recheck date per alert. Judge each fix on the measure named before it shipped, over a full window.

9. Keep the snapshots. Store each month export, the drift script output, the technical snapshots, and the review note in one dated folder. Drift work compounds: the third month of clean comparisons is worth more than any single deep dive.

## Output Contract

- A drift report with the windows compared, the property and search type, and site totals for clicks, impressions, CTR, and average position with percent change for each.
- An alert table: page, label, the evidence numbers, the likely bucket (technical change, content decay, update overlap, seasonality, cannibalisation, unknown), the action, the owner, and the recheck date.
- A technical drift section listing what changed in status, canonical, robots, titles, sitemaps, internal links, or vitals since the last snapshot, and which pages it affects.
- A clear noise section: pages that moved inside the thresholds and were left alone on purpose.
- Every number in the report comes from an export or a live check named in the report. Missing data is marked unknown. Nothing is estimated and presented as measured.

## Operating Rules

- Never diagnose from one day, from incomplete recent data, or from whole site average position alone.
- Never rewrite content during a confirmed update rollout based on partial data. Log, wait for the rollout to finish plus one week, then compare.
- Treat third party volatility charts and rank trackers as hints. The Status Dashboard confirms updates, and Search Console page data confirms what happened to this site.
- Check Core Web Vitals as field data at the 75th percentile, mobile and desktop split. Good thresholds from web.dev: Largest Contentful Paint 2.5 seconds or less, Interaction to Next Paint 200 ms or less, Cumulative Layout Shift 0.1 or less. A template slipping a band is drift even before traffic moves.
- Do not delete or redirect a decaying page on the decay label alone. Confirm the intent is covered elsewhere or gone, then decide.
- Keep style plain in the report. State the number, the label, and the action. Cut any sentence that does not change a decision.
