Best for
- "Our traffic dropped", "we lost rankings", "clicks fell off a cliff"
- Impressions or clicks collapsing in Search Console, on the whole site or one section
- Pages disappearing from the index, or a sudden coverage change
Thibaultbm/claude-seo-geo/skills/seo-traffic-drop/SKILL.md
Diagnose a traffic or ranking loss before fixing anything. Input: Search Console exports from a healthy period and a damaged one, plus what changed on the site. Output: whether the drop is real or a reporting artifact, the exact date and shape of the loss (visibility, ranking, click-through, demand), the pages and queries carrying it, a differential diagnosis with the test that confirms each cause, and the handoff to the skill that fixes it. Bundled zero-dependency script compares two exports an
Decision brief
A drop is a diagnostic problem, not a content problem. The failure mode of this work is not missing the cause, it is acting on the first plausible one: a core update landed near the date, so the team rewrites 40 articles, while the actual cause was a noindex shipped in a templat…
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/Thibaultbm/claude-seo-geo --skill "skills/seo-traffic-drop"Inspect the Agent Skill "seo-traffic-drop" from https://github.com/Thibaultbm/claude-seo-geo/blob/939ace55e904a78f33940864cc3d163992d70b75/skills/seo-traffic-drop/SKILL.md at commit 939ace55e904a78f33940864cc3d163992d70b75. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Before any analysis, stop changes to the site. Every deploy during an investigation destroys evidence and adds a variable, and a drop that gets "fixed" mid-diagnosis by three simultaneous changes teaches nobody anything.
Three things masquerade as traffic drops. Rule them out before spending a day on causes.
python3 scripts/gscdiff.py --dates Dates.csv
python3 scripts/gscdiff.py before/Pages.csv after/Pages.csv --sections 2 python3 scripts/gscdiff.py before/Queries.csv after/Queries.csv --top 25
Match the shape to the candidates, then run the confirming test. The test matters more than the table: a cause you cannot confirm is a guess with a citation.
Permission review
The documentation includes network, browsing, or remote request actions.
| Cliff, everything, impressions to near zero | noindex shipped, robots.txt Disallow, DNS or certificate expiry, server outage, domain not renewed, WAF blocking Googlebot, hack | Fetch the raw HTML and robots.txt; Search Console URL InspectThe documentation includes network, browsing, or remote request actions.
| A handful of URLs, others gaining | Cannibalization from a page published recently, or an internal link change | Query-level export: does the losing URL's query now map to another URL of yours; check what was published in the six weeks beEvidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 91/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 15 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
A drop is a diagnostic problem, not a content problem. The failure mode of this work is not missing the cause, it is acting on the first plausible one: a core update landed near the date, so the team rewrites 40 articles, while the actual cause was a noindex shipped in a template on the same week. The rewrite then hides the evidence.
So the order is fixed. Confirm the loss is real, date it, shape it, name the candidate causes, confirm one with a test that could have failed, and only then fix. Every step below produces evidence someone else can check.
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: the SEO action log (what was shipped and when), past incidents, the site's seasonality, migrations, and known technical debt. The action log is the highest-value note in a drop investigation, because it answers "what changed" without waiting for the client. At the end of the session, append the diagnosis, the evidence and the remediation to that log so the next incident starts with a history. Vault structure and protocols: the obsidian-brain skill.
Use it for:
Hand off once the cause is named:
| Confirmed cause | Skill that fixes it |
|---|---|
| Indexation, robots, rendering, speed, migration, hack | seo-technical |
| Client-rendered site built by an AI generator | seo-ai-site-builders |
| Thin, stale or outranked content | seo-content-blog and the page-type content skills |
| Blocks missing from a page that competitors have | seo-page-sections |
| Cannibalization, orphaned pages, weak internal links | seo-internal-linking |
| Lost or toxic backlinks | seo-backlinks |
| Local pack or Business Profile loss | seo-local |
| Lost AI citations, AI Overview displacement | geo-visibility |
| No measurement to detect the next one | geo-tracking |
Before any analysis, stop changes to the site. Every deploy during an investigation destroys evidence and adds a variable, and a drop that gets "fixed" mid-diagnosis by three simultaneous changes teaches nobody anything.
Collect, in this order:
If the client cannot say what shipped and when, that gap is itself a finding worth reporting.
Three things masquerade as traffic drops. Rule them out before spending a day on causes.
Reporting artifacts. Two documented events sit inside the window most investigations look at:
The operating rule that survives both: clicks are the metric that pays. An impressions drop with flat clicks is a measurement story until proven otherwise. Check the Data Anomalies page for the period under investigation before writing any conclusion.
Measurement breakage. If GA4 fell but Search Console did not, the problem is downstream of Google: a tag removed in a redesign, a consent banner change, a bot filter, a new cookie mode, a GA4 property or filter change. Compare Search Console clicks against GA4 organic sessions over the same days. They never match exactly; they should move together.
Seasonality and demand. Compare against the same period last year, not last month. A B2B site in August and a tax service in May both look catastrophic month-over-month and are perfectly normal year-over-year. When rankings hold and impressions fall, verify the trend in Google Trends before diagnosing anything on the site.
python3 scripts/gsc_diff.py --dates Dates.csv
The script reads a day-level export and reports the shape: a cliff (one day carries most of the decline, and the site stays down) or a slope (the loss accumulates over weeks). It dates the onset and lists the steepest steps. It discriminates by asking how much of the total decline the single steepest step explains, which is robust where counting days over a threshold is not.
The distinction sets the whole investigation:
| Shape | What it means | First question |
|---|---|---|
| Cliff | A site event or a switch being flipped | What shipped on that exact date |
| Slope over 1 to 3 weeks | An update rollout, or a competitor gaining | Which confirmed update overlaps this window |
| Slope over months | Decay, staleness, or a market moving | Which pages lost first, and what replaced them |
| Step down then partial recovery | A temporary block, an outage, a crawl issue | What was broken and for how long |
For update windows, use the Google Search Status Dashboard, which publishes confirmed ranking updates with official start and end dates (https://developers.google.com/search/help/status-dashboard). A drop that starts three days before an update window did not come from that update, and this single check kills most false attributions.
python3 scripts/gsc_diff.py before/Pages.csv after/Pages.csv --sections 2
python3 scripts/gsc_diff.py before/Queries.csv after/Queries.csv --top 25
The script reports totals with deltas, names the mechanism, measures how concentrated the loss is, lists the biggest losers with a per-row reason, flags rows that disappeared entirely, and shows what gained while the rest fell. --sections N aggregates URLs by path prefix, which is how a template-level cause becomes visible in one line.
Four mechanisms, distinguished by which metric moved:
| Mechanism | Signature | Reading |
|---|---|---|
| Visibility collapse | Impressions and clicks fall together, rows disappear | The pages are not being shown. Indexation, not ranking |
| Ranking loss | Position worsens materially, impressions follow | Being outranked. Update, regression, lost links, cannibalization |
| Click-through loss | Impressions and position hold, clicks fall | Still ranking, not being clicked. SERP layout, AI Overviews, titles |
| Demand or coverage loss | Position holds, impressions fall, CTR holds | Fewer searches or fewer matching queries. Verify externally |
Then read concentration and gainers together. A loss carried by a handful of URLs is a page-level cause; a loss spread across one directory is a template cause; a loss across everything is an update, a sitewide technical regression, or demand. And a page that gained while a similar page fell is the signature of cannibalization or internal redistribution, which has an internal cause and no amount of update analysis will explain it.
Match the shape to the candidates, then run the confirming test. The test matters more than the table: a cause you cannot confirm is a guess with a citation.
| Signature | Likely causes | Test that confirms or kills it |
|---|---|---|
| Cliff, everything, impressions to near zero | noindex shipped, robots.txt Disallow, DNS or certificate expiry, server outage, domain not renewed, WAF blocking Googlebot, hack | Fetch the raw HTML and robots.txt; Search Console URL Inspection on three URLs; check the Pages report reason; check server logs for Googlebot 4xx and 5xx |
| Cliff, everything, impressions intact | Manual action, or a tracking or property change | Search Console Manual Actions; confirm the property and filters are the same in both exports |
| Cliff, one section or template | A template regression: canonical pointing elsewhere, noindex on a template, internal links removed, rendering switched to client-side, pagination broken | Compare the raw HTML of a losing page against an archived copy; check the canonical and meta robots as served; run the rendering check from the seo-ai-site-builders skill |
| Cliff, right after a migration or redesign | Redirects missing or chained, URLs changed, content dropped, hreflang broken | Crawl the old URL inventory and check every 301 resolves in one hop to a relevant page; the migration protocol lives in seo-technical Step 7 |
| Slope over 1 to 3 weeks, sitewide, positions worse | A core or ranking system update | Confirm the window on the Search Status Dashboard; check whether losses concentrate on a content type; compare against competitors in the same SERPs |
| Slope, positions hold, CTR falls | AI Overviews or a new SERP feature on those queries, rewritten titles, competitor snippets | Inspect the live SERP for the top losing queries; measure how many now carry an AI Overview; check whether Google rewrote the titles |
| A handful of URLs, others gaining | Cannibalization from a page published recently, or an internal link change | Query-level export: does the losing URL's query now map to another URL of yours; check what was published in the six weeks before |
| Gradual, oldest content first | Content decay, staleness, competitors publishing better | Compare the losing pages against what now ranks; check publication and update dates |
| One country or one language only | Geo-blocking by a WAF or CDN, hreflang regression, a local competitor, a market event | Fetch the site through an exit in that country; check hreflang reciprocity |
| One device only | Mobile rendering or speed regression, an interstitial, a mobile template bug | Test the mobile page directly; compare Core Web Vitals per device |
| Clicks fell, conversions and revenue did not | The lost traffic was low value, or the loss is in a non-commercial section | Segment by page group and by landing page revenue before treating this as an emergency |
| Impressions fell, clicks flat | A reporting artifact, or lost long-tail visibility | Check the Data Anomalies page for the period; confirm whether the loss is in positions 20 to 100 |
| Search Console flat, GA4 down | Tagging, consent, bot filtering, a GA4 configuration change | Compare Search Console clicks against GA4 sessions day by day; check the tag fires |
Rules that keep this honest:
Not every loss is worth recovering. Before recommending work, split the loss into: recoverable by fixing something broken, recoverable by outcompeting, and structurally gone.
Structurally gone is a real category in 2026: queries absorbed by AI Overviews, informational traffic that now resolves in the answer, a product line discontinued, a market that shrank. On the AI Overview side the measured impact varies widely by study and query set, from roughly 15 percent to over 50 percent fewer clicks on affected queries (Amsive across 700,000 keywords at the conservative end, Pew across 68,000 queries near the middle, Ahrefs and Seer at the high end), so treat any single figure quoted at you as a range and measure your own queries rather than importing someone else's number.
One split in that data is directly diagnostic. In the Amsive set, non-branded queries with an AI Overview lost about 20 percent of their CTR while branded queries with one gained about 19 percent, and the worst case was a query carrying both an AI Overview and a featured snippet, at roughly 37 percent lost. So a CTR loss concentrated on non-branded, informational queries fits the AI Overview explanation; a CTR loss that includes branded queries does not, and points instead at a title rewrite, a brand problem, or a SERP competitor. Segment branded against non-branded before accepting the easy answer.
What this traffic is not is recoverable by rewriting the page: the fix is to compete for the citation and for the queries that still produce clicks, which is the geo-visibility skill's territory.
Say this plainly in the deliverable. A recovery plan that implicitly promises a return to a pre-AI-Overview baseline sets up a failure that no amount of good work will avoid.
Hand the confirmed cause to the skill that owns it (table in the "When to use" section), then:
| Check | Target | Basis |
|---|---|---|
| Compared periods | Equal length, same property, same filters | Field rule |
| Material drop | 10 percent of clicks or more | Field heuristic |
| Metric of record | Clicks, always. Impressions are context | Field rule after two documented logging artifacts |
| Manual actions check | Before any analysis | Official (binary and cheap) |
| Seasonality | Year over year, never month over month | Field rule |
| Update attribution | Only when the window is confirmed on the Search Status Dashboard and the drop starts inside it | Official plus field rule |
| Cause confirmation | Every named cause has a test that could have falsified it | Field rule |
| Site changes during diagnosis | Frozen until the cause is named | Field rule |
| Recovery expectation | Weeks after recrawl for technical fixes; next update for update losses | Official (core updates guidance) |
| Incident record | Written to the vault action log with evidence | Field rule |
Two AI-specific failure modes do not appear in Search Console at all, so a drop investigation that stops at GSC will miss them.
Losing the citation while keeping the ranking. A page can hold position 3 and stop being the source AI Overviews, ChatGPT or Perplexity quote. Classic metrics stay flat while the brand disappears from the answers that increasingly precede the click. Detection is a prompt panel, not a rank tracker: the protocol is in the geo-tracking skill, and the citability work is in geo-visibility.
Losing AI referral traffic. Referrals from chatgpt.com, perplexity.ai and similar sources fall when the site stops being retrievable: a rendering regression makes content invisible to crawlers that never execute JavaScript, a robots.txt change blocks an AI crawler, or a migration breaks the URLs the engines had learned. This drop is invisible in Search Console by construction. Check the AI channel in GA4 first, then the crawler access rules in the seo-technical reference, then rendering with the seo-ai-site-builders script.
The reverse case matters for honest reporting: when classic clicks fall while AI referrals and branded search rise, the site is not losing, the channel is shifting. Report both or the conclusion is wrong.
# Traffic drop diagnosis: {domain} ({date})
## Verdict
One sentence: what happened, when, and how confident you are.
## Is it real
Artifacts, measurement and seasonality ruled out, with the check that ruled each one out.
## When
The date or window, the shape (cliff or slope), and what shipped around it.
## Where
The mechanism (visibility, ranking, click-through, demand), how concentrated,
which sections, pages and queries carry the loss, with the numbers.
## Why
The confirmed cause, the test that confirmed it, and the causes ruled out
with the evidence that ruled them out.
## What is recoverable
Split into: broken and fixable, competitive, structurally gone. With numbers.
## Plan
Ordered fixes, each with its owning skill, effort, and expected effect.
## Re-measure
The date, the exact comparison to re-run, and the baseline to beat.
Never deliver a diagnosis without the two numbers that anchor it: clicks lost, and the share of that loss the named cause explains.
| Mistake | Consequence | Do instead |
|---|---|---|
| Blaming the nearest core update | Months of content work on a broken canonical | Confirm the window on the Status Dashboard and check the drop starts inside it |
| Reading an impressions drop as a traffic loss | Emergency response to a logging fix | Check clicks first, then the Data Anomalies page |
| Comparing unequal periods | Measuring the calendar | Equal length, same property, same filters |
| Month-over-month on a seasonal site | Diagnosing August | Year over year |
| Fixing during the investigation | Evidence destroyed, cause never known | Freeze the site until the cause is named |
| Shipping five fixes at once | No attribution, no learning | One change at a time on a dated timeline |
| Skipping the manual actions check | Weeks lost on the wrong hypothesis | Two clicks, first |
| Stopping at the first plausible cause | The real one keeps operating | Run the confirming test, and quantify each cause |
| Treating AI Overview losses as recoverable by rewriting | Promises that cannot be kept | Segment it as structural, compete for the citation |
| Ignoring gainers in the same export | Missing cannibalization entirely | Read gainers against losers |
| Diagnosing only in Search Console | AI citation and referral losses invisible | Check the AI channel and the prompt panel too |
| No incident record | The same cause diagnosed from scratch next year | Write it to the vault action log |
Frequently asked questions
A drop is a diagnostic problem, not a content problem. The failure mode of this work is not missing the cause, it is acting on the first plausible one: a core update landed near the date, so the team rewrites 40 articles, while the actual cause was a noindex shipped in a templat…
The source record exposes this install command: npx skills add https://github.com/Thibaultbm/claude-seo-geo --skill "skills/seo-traffic-drop". Inspect the command and pinned source before running it.
Static rules flagged network in the source; the page lists the matching lines and excerpts.
Alternatives
coreyhaines31/marketingskills
When the user wants to figure out which marketing actually drives conversions and revenue, choose or interpret an attribution model, or reconcile conflicting numbers across tools. Also use when the user mentions "attribution," "attribution model," "first-touch vs last-touch," "multi-touch," "which channel drives revenue," "what's my real CAC," "my dashboards disagree," "Google/Meta says X but GA says Y," "media mix model," "MMM," "incrementality," "geo lift," "holdout test," "how did you hear ab
rampstackco/claude-skills
Run QA testing on a page, feature, or full site at one of three depth tiers (smoke, standard, full). Use this skill whenever the user asks to QA a page or site, run a smoke test after a deploy, verify a page before launch, or run a regression sweep. Triggers on QA, QA sweep, smoke test, regression test, post-deploy check, pre-launch check, verify the deploy, test this page, does the page render, broken link, 404, image not loading. Also triggers proactively after a deploy or a new page launch wh
bestdeejay-design/agent-skills
Audit and polish frontend (static HTML/CSS/JS or built SPA) to measurable perfection: real-Chrome Lighthouse >=13 runs (mobile+desktop, no Playwright internals), SEO meta layer, WCAG contrast by computed luminance, heading order, a11y checks (axe-core subset: img-alt/button-name/link-name/label/aria-valid/landmark-unique), back-to-top navigation check, design tokens (zero raw hex outside tokens), adaptive checks, and OG-image generation with a crop-safe layout. Front-End Checklist-inspired check
PramodDutta/qaskills
Comprehensive website auditing skill using Lighthouse, PageSpeed Insights, and web performance APIs to audit performance, accessibility, SEO, best practices, and security.