/seo-drift
Compare two SEO snapshots (GSC, GSC AI Performance, rank tracker, AEO probe) and surface biggest movers per metric — impressions, clicks, position, AI citations. Use when: monthly performance reviews, post-Core-Update triage, AI Mode citation tracking, or before/after
$ npx -y skills add indranilbanerjee/digital-marketing-pro --skill seo-drift --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/seo-drift
Context preview
The summary Claude sees to decide when to auto-load this skill.
Compare two SEO snapshots (GSC, GSC AI Performance, rank tracker, AEO probe) and surface biggest movers per metric — impressions, clicks, position, AI citations. Use when: monthly performance reviews, post-Core-Update triage, AI Mode citation tracking, or before/after
SKILL.md
seo-drift.SKILL.mdname: seo-drift
description: "Compare two SEO snapshots (GSC, GSC AI Performance, rank tracker, AEO probe) and surface biggest movers per metric — impressions, clicks, position, AI citations. Use when: monthly performance reviews, post-Core-Update triage, AI Mode citation tracking, or before/after content-refresh evaluation."
argument-hint: "[brand-name]"
user-invocable: true
/digital-marketing-pro:seo-drift
Purpose
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.
Context efficiency
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.
When to Use
- **Monthly performance review** — last month vs the month before
- **Core Update triage** — pre-update vs post-update + settling window (use 14+ days after rollout-complete)
- **AI Mode citation tracking** — quarter-over-quarter `aeo-audit` outputs to see which queries gained / lost AI Mode citations (Google AI Mode citation diff is a leading indicator for organic decline)
- **Content refresh attribution** — before vs after a planned content update to attribute lift to the refresh vs other factors
- **GSC AI Performance Report** — month-over-month deltas on the new (3 Jun 2026) combined AI Overviews + AI Mode report
- **Site migration audit** — pre-migration baseline vs post-migration settling
**Don't use** for single-point-in-time analysis (use the source skill — `seo-audit`, `aeo-audit`, `gsc-ai-performance`).
Brand context (auto-applied)
1. Read `~/.claude-marketing/brands/_active-brand.json` for the active slug, then load `~/.claude-marketing/brands/{slug}/profile.json` 2. If no brand exists: ask "Set up a brand first (/digital-marketing-pro:brand-setup)?" — or proceed with defaults 3. Apply `skills/context-engine/industry-profiles.md` for industry-specific noise thresholds (YMYL industries should use higher `--noise` to filter out routine Quality Rater Guidelines volatility)
Inputs
| 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.
Process (10 steps, numbered-file output)
All outputs go to `${CLAUDE_PLUGIN_DATA}/{brand}/seo/seo-drift/{YYYY-MM-DD}/`.
1. **`00-input.md`** — capture baseline date range, current date range, source (GSC / GSC AI / rank-tracker / aeo-audit), brand context 2. **`01-baseline.csv`** — copy baseline export here (so the drift run is reproducible months later) 3. **`02-current.csv`** — copy current export here 4. **`03-drift-run.json`** — run the script:
python "${CLAUDE_PLUGIN_ROOT}/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"5. **`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.
6. **`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. 7. **`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). 8. **`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. 9. **`07-classification-distribution.md`** — counts table:
- growth / decline / reshuffle / stable / new / lost
- If >40% in decline: likely Core Update or competitor catch-up. Run `/digital-marketing-pro:seo-audit` for diagnosis.
- If >20% reshuffle: likely intent shift (AI Mode reweighting). Run `/digital-marketing-pro:aeo-geo` to align with new intent patterns.
10. **`PLAN.md`** — single-page summary: stats + scorecard + top 5 actions ranked by impact × effort, with owner suggestions (SEO lead / content lead / dev team).
Output format
${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-bRead more
name: seo-drift description: "Compare two SEO snapshots (GSC, GSC AI Performance, rank tracker, AEO probe) and surface biggest movers per metric — impressions, clicks, position, AI citations. Use when: monthly performance reviews, post-Core-Update triage, AI Mode citation tracking, or before/after content-refresh evaluation." argument-hint: "[brand-name]" user-invocable: true
/digital-marketing-pro:seo-drift
Purpose
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.
Context efficiency
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.
When to Use
- **Monthly performance review** — last month vs the month before
- **Core Update triage** — pre-update vs post-update + settling window (use 14+ days after rollout-complete)
- **AI Mode citation tracking** — quarter-over-quarter `aeo-audit` outputs to see which queries gained / lost AI Mode citations (Google AI Mode citation diff is a leading indicator for organic decline)
- **Content refresh attribution** — before vs after a planned content update to attribute lift to the refresh vs other factors
- **GSC AI Performance Report** — month-over-month deltas on the new (3 Jun 2026) combined AI Overviews + AI Mode report
- **Site migration audit** — pre-migration baseline vs post-migration settling
**Don't use** for single-point-in-time analysis (use the source skill — `seo-audit`, `aeo-audit`, `gsc-ai-performance`).
Brand context (auto-applied)
1. Read `~/.claude-marketing/brands/_active-brand.json` for the active slug, then load `~/.claude-marketing/brands/{slug}/profile.json` 2. If no brand exists: ask "Set up a brand first (/digital-marketing-pro:brand-setup)?" — or proceed with defaults 3. Apply `skills/context-engine/industry-profiles.md` for industry-specific noise thresholds (YMYL industries should use higher `--noise` to filter out routine Quality Rater Guidelines volatility)
Inputs
| 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.
Process (10 steps, numbered-file output)
All outputs go to `${CLAUDE_PLUGIN_DATA}/{brand}/seo/seo-drift/{YYYY-MM-DD}/`.
1. **`00-input.md`** — capture baseline date range, current date range, source (GSC / GSC AI / rank-tracker / aeo-audit), brand context 2. **`01-baseline.csv`** — copy baseline export here (so the drift run is reproducible months later) 3. **`02-current.csv`** — copy current export here 4. **`03-drift-run.json`** — run the script:
python "${CLAUDE_PLUGIN_ROOT}/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"5. **`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.
6. **`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. 7. **`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). 8. **`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. 9. **`07-classification-distribution.md`** — counts table:
- growth / decline / reshuffle / stable / new / lost
- If >40% in decline: likely Core Update or competitor catch-up. Run `/digital-marketing-pro:seo-audit` for diagnosis.
- If >20% reshuffle: likely intent shift (AI Mode reweighting). Run `/digital-marketing-pro:aeo-geo` to align with new intent patterns.
10. **`PLAN.md`** — single-page summary: stats + scorecard + top 5 actions ranked by impact × effort, with owner suggestions (SEO lead / content lead / dev team).
Output format
${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-bYour agency just signed a 50-brand client. The previous agency left no playbook. Three brands are bleeding budget, two have stale positioning, one is launching in a regulated jurisdiction next month. Where do you start?
Other skills on digital-marketing-pro.
- /ab-test-plan
Design A/B and multivariate tests. Use when: sample size calculation, testing hypothesis, CRO experimentation.
Open skill - /ad-creative
Generate platform-specific ad copy. Use when: Google RSA, Meta, LinkedIn, TikTok ad variations with quality scoring.
Open skill - /add-integration
Add MCP server integrations. Use when: connecting a custom tool, API, or service to the plugin via .mcp.json.
Open skill - /aeo-audit
Audit AI search visibility. Use when: checking brand presence in ChatGPT, Perplexity, AI Overviews, Gemini.
Open skill - /aeo-geo
Optimize AI engine visibility. Use when: AEO/GEO strategy, citation optimization, entity consistency across AI platforms.
Open skill - /agency-dashboard
Portfolio-level agency dashboard aggregating health metrics across all client brands — campaign status, budget pacing, KPI attainment, team utilization. Use when reviewing cross-brand portfolio health, preparing for agency leadership standups, or getting a single-view snapshot
Open skill

