Compares two SEO snapshots (GSC, GSC AI Performance, rank tracker, AEO probe) and surfaces biggest movers per metric for monthly reviews, core update triage, AI citation tracking, or content refresh attribution.
How this skill is triggered — by the user, by Claude, or both
Slash command
/digital-marketing-pro:seo-drift [brand-name][brand-name]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Take two snapshots of SEO performance data — separated by weeks, a Core Update, a content refresh, or an algorithm change — and produce a structured drift report: top gainers, top losers, classifications (growth / decline / reshuffle / stable / new / lost), and diagnostic patterns. Works with classic GSC, the new GSC AI Performance Report, rank-tracker exports, and `aeo-audit` probe results.
Take two snapshots of SEO performance data — separated by weeks, a Core Update, a content refresh, or an algorithm change — and produce a structured drift report: top gainers, top losers, classifications (growth / decline / reshuffle / stable / new / lost), and diagnostic patterns. Works with classic GSC, the new GSC AI Performance Report, rank-tracker exports, and aeo-audit probe results.
Heavy skill. Grep before Read any referenced file, then Read only matched ranges with offset + limit. List ${CLAUDE_PLUGIN_DATA}/<brand>/ before opening files. On re-invocation mid-session, skip files already in context.
aeo-audit outputs to see which queries gained / lost AI Mode citations (Google AI Mode citation diff is a leading indicator for organic decline)Don't use for single-point-in-time analysis (use the source skill — seo-audit, aeo-audit, gsc-ai-performance).
~/.claude-marketing/brands/_active-brand.json for the active slug, then load ~/.claude-marketing/brands/{slug}/profile.jsonskills/context-engine/industry-profiles.md for industry-specific noise thresholds (YMYL industries should use higher --noise to filter out routine Quality Rater Guidelines volatility)| Input | Source | Required? |
|---|---|---|
| Baseline CSV | Older snapshot | yes |
| Current CSV | Newer snapshot | yes |
| Join keys | Auto-detected (query, keyword, page, url) or --join-on flag | optional |
| Noise threshold | --noise (default 5%) — % below which a metric is "stable" | optional |
| Top-N | --top (default 20) — gainers/losers per metric | optional |
Both snapshots must come from the same source. Mixing a GSC export with an Ahrefs export will produce nonsense — different sources count different things.
All outputs go to ${CLAUDE_PLUGIN_DATA}/{brand}/seo/seo-drift/{YYYY-MM-DD}/.
00-input.md — capture baseline date range, current date range, source (GSC / GSC AI / rank-tracker / aeo-audit), brand context01-baseline.csv — copy baseline export here (so the drift run is reproducible months later)02-current.csv — copy current export here03-drift-run.json — run the script:
python "scripts/seo_drift.py" \
--baseline "${CLAUDE_PLUGIN_DATA}/{brand}/seo/seo-drift/{date}/01-baseline.csv" \
--current "${CLAUDE_PLUGIN_DATA}/{brand}/seo/seo-drift/{date}/02-current.csv" \
--top 30 --noise 5 \
--out "${CLAUDE_PLUGIN_DATA}/{brand}/seo/seo-drift/{date}/03-drift-run.json"
04-quality-scorecard.md — read quality_scorecard from 03-drift-run.json. If status: needs_review, diagnose:
date_range_distinct: warn → script couldn't auto-validate. Manually confirm in 00-input.md that baseline and current cover non-overlapping windows.sample_size: fail → either input has < 50 rows. Re-export without row limits.metric_compatibility: fail → no numeric metrics in BOTH inputs. Column-name mismatch — re-export from the same source.no_lookup_collisions: fail → duplicate keys in one input (e.g., same query × page row twice). Re-export with deduplication or use --join-on to add a distinguishing column.05-biggest-gainers.md — narrative on the top 10 gainers across impressions / clicks / position. For each: hypothesis on cause (new content? backlinks gained? Core Update favoured E-E-A-T? Featured Snippet rotation?). Hand off candidates to /digital-marketing-pro:content-engine for amplification.05-biggest-losers.md — narrative on the top 10 losers. For each: triage matrix — is_yMYL × had_recent_change × Core_Update_window → action (refresh content / restore reverted change / wait for next algo cycle / accept and reallocate).06-ai-mode-shift.md (only if input source is GSC AI Performance Report) — queries that LOST AI Mode impressions are a leading indicator. Cross-reference with /digital-marketing-pro:aeo-audit to verify citation loss in synthetic probes.07-classification-distribution.md — counts table:
/digital-marketing-pro:seo-audit for diagnosis./digital-marketing-pro:aeo-geo to align with new intent patterns.PLAN.md — single-page summary: stats + scorecard + top 5 actions ranked by impact × effort, with owner suggestions (SEO lead / content lead / dev team).${CLAUDE_PLUGIN_DATA}/{brand}/seo/seo-drift/2026-06-04/
├── 00-input.md
├── 01-baseline.csv
├── 02-current.csv
├── 03-drift-run.json
├── 04-quality-scorecard.md
├── 05-biggest-gainers.md
├── 05-biggest-losers.md
├── 06-ai-mode-shift.md (only when input is GSC AI Performance Report)
├── 07-classification-distribution.md
└── PLAN.md
| Gate | What it checks | Why it matters |
|---|---|---|
| date_range_distinct | Baseline and current cover non-overlapping windows | Overlapping windows produce false-positive deltas — same data on both sides |
| sample_size | Each input has ≥ 50 rows | Below this, drift is noise |
| metric_compatibility | ≥ 1 numeric metric exists in both inputs | If columns differ (e.g., Ahrefs vs GSC), there's nothing to compare |
| no_lookup_collisions | No duplicate keys within an input | Duplicates make the delta math ambiguous |
status: ready requires sample, metric compatibility, and no-collision gates pass (date-range-distinct is warn not fail — the script can't always autodetect dates).
Each row in the report falls into one bucket:
| Classification | Trigger | Interpretation |
|---|---|---|
| growth | ≥ 2 metrics moved up > noise%, no metric down > 10% | Clear win — investigate for amplification |
| decline | ≥ 2 metrics moved down > noise%, no metric up > 10% | Clear loss — triage by YMYL × Core-Update-window |
| reshuffle | Significant moves in opposite directions (e.g., impressions up, position down) | AI Mode signature — content is being shown more broadly but for slightly different intents |
| stable | No metric moved more than noise% | No action |
| new | Absent in baseline, present in current | New content or new SERP coverage — track |
| lost | Present in baseline, absent in current | Content removed, deindexed, or fell out of tracking window |
Position is special: for position, lower numbers are better. The script automatically inverts position-delta direction for gain/loss ranking — you'll see -85.9% under position as a top gainer (page moved from position 12 to position 2).
This skill is typically a consumer + diagnostician:
/digital-marketing-pro:gsc-ai-performance or seo-audit or aeo-audit — generates the snapshots/digital-marketing-pro:seo-drift — this skill/digital-marketing-pro:seo-audit for technical-side check + /digital-marketing-pro:content-decay-scan for content-side/digital-marketing-pro:aeo-geo for intent realignment/digital-marketing-pro:content-engine for amplification briefsanalytics-analyst (primary) — interpretation + cause hypothesesseo-specialist — for technical-cause hypotheses on loserscompetitive-intel — when decline correlates with a competitor's winmarket-intelligence — for algo-update context (was there a Core Update in the window?)/digital-marketing-pro:gsc-ai-performance — pull the GSC AI Performance Report (input source)/digital-marketing-pro:seo-audit — diagnose decline causes/digital-marketing-pro:aeo-audit — diagnose AI Mode citation loss/digital-marketing-pro:content-decay-scan — for content-side decline triage/digital-marketing-pro:content-engine — for amplifying gainersscripts/seo_drift.py — the underlying drift enginenpx claudepluginhub indranilbanerjee/digital-marketing-proCaptures SEO baseline snapshots for domains/URLs and compares later runs to surface regressions in authority, traffic, keywords, backlinks, and on-page content.
Optimizes SEO using Google Search Console data: analyzes metrics like clicks/impressions/CTR/position, finds striking-distance keywords, fixes low-CTR pages, detects keyword cannibalization, identifies declining pages, builds data-driven strategies.
Analyzes GSC, Bing Webmaster Tools, and GA4 data to deliver data-backed SEO strategies for dominating rankings, AI citations, and lead funnels.