rank-tracker · aaron-he-zhu — Claude Code skill: track keyword rankings over time
A skill that measures keyword positions in search and in AI answers, comparing each check against a baseline. Useful when you need to see what dropped after a site change.
npx skills add aaron-he-zhu/aaron-marketing-skills --skill rank-tracker -a claude-codeWhat rank-tracker does
Give it a domain and a keyword list, and it returns a position table with deltas against the previous check. Every row carries a source tag: tool export, user-provided, or estimated. It also tracks ownership of snippets, PAA blocks, local and media packs, plus AI Overview presence and citation rate.
No paid subscription required. A ledger.py script records each check as a snapshot, computes the change since the last one, and builds a series for a single keyword. Run it with `python3 "${CLAUDE_PLUGIN_ROOT}/scripts/connectors/ledger.py" record <domain> --source rank --data '{"<keyword>": <position>, ...}'`. With Search Console connected, positions come from there; otherwise the skill uses what you supply.
One thing to keep in mind: a week-scale ranking move is confounded by everything else you shipped. The author advises attributing it against a control — a holdout keyword or competitor you left alone — rather than against zero. A stale position, or one measured on a different locale, device or engine, is flagged NEEDS_REFRESH instead of being reported as current. With no keywords and nothing to infer them from, the skill stops and asks for a list.
What it helps with
- record positions for a keyword list and save them as a baseline
- measure how far a term dropped after on-page edits
- check who owns the snippet and PAA block for target queries
- see whether AI answers cite pages from the domain
- compare share of voice against competitors
Example prompts for the agent
- Set up rank tracking for example.com targeting these keywords: [keyword list]
- Analyze ranking changes for example.com over the past month
- Record current positions in the ledger and show the diff from the last check
How to install rank-tracker
1Skills CLI (Vercel)
npx skills add aaron-he-zhu/aaron-marketing-skills --skill rank-tracker -a claude-code2Manually: put the files in place
~/.claude/skills/rank-tracker/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/rank-tracker/
1Skills CLI (Vercel)
npx skills add aaron-he-zhu/aaron-marketing-skills --skill rank-tracker -a codex2Manually: put the files in place
.agents/skills/rank-tracker/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add aaron-he-zhu/aaron-marketing-skills --skill rank-tracker -a cursor2Manually: put the files in place
.cursor/skills/rank-tracker/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install aaron-he-zhu/aaron-marketing-skills rank-tracker2Manually: put the files in place
.github/skills/rank-tracker/SKILL.md1Skills CLI (Vercel)
npx skills add aaron-he-zhu/aaron-marketing-skills --skill rank-tracker -a gemini-cli2Platform CLI
gemini skills install https://github.com/aaron-he-zhu/aaron-marketing-skills --path seo-geo/evaluate/rank-trackerManually: put the files in place
.devin/skills/rank-tracker/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add aaron-he-zhu/aaron-marketing-skills --skill rank-tracker -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about rank-tracker
How do I install rank-tracker in Claude?
Run npx skills add aaron-he-zhu/aaron-marketing-skills --skill rank-tracker -a claude-code. The skill lands in ~/.claude/skills/rank-tracker/SKILL.md.
What does rank-tracker do?
It compares current keyword positions against the previous check and reports the delta. It also tracks SERP features and visibility in AI answers.
Do I need a paid SEO tool?
No. Without connected tools, positions are recorded through ledger.py from data you provide. With Search Console connected, real positions are pulled from it.
Source text
SKILL.md · Apache-2.0
---
name: rank-tracker
slug: rank-tracker
displayName: "Rank Tracker · 排名追踪"
summary: "排名追踪/SERP监控"
description: 'Use when the user asks to "track rankings" or "查排名"; measures keyword and SERP-position deltas over time from provided exports or connected tools, including AI-response checks. Not for multi-metric stakeholder reports or setting alerts — use performance-monitor (report or alert mode). 排名追踪/SERP监控'
version: "20.1.0"
license: Apache-2.0
compatibility: "Claude Code and compatible agent-skill hosts"
homepage: "https://github.com/aaron-he-zhu/aaron-marketing-skills"
when_to_use: "Use when tracking keyword rankings, monitoring position changes, comparing ranking snapshots, or detecting ranking drops."
argument-hint: "<domain> [keyword list]"
allowed-tools: WebFetch
metadata: {"author": "aaron-he-zhu", "version": "20.1.0", "discipline": "seo-geo", "phase": "evaluate", "geo-relevance": "medium", "hermes": {"tags": ["marketing", "seo-geo", "evaluate"], "category": "seo-geo"}, "openclaw": {"emoji": "🔍", "homepage": "https://github.com/aaron-he-zhu/aaron-marketing-skills"}}
---
# Rank Tracker
Tracks keyword positions, SERP feature ownership, and AI visibility over time.
## Quick Start
```
Set up rank tracking for [domain] targeting these keywords: [keyword list]
```
```
Analyze ranking changes for [domain] over the past [time period]
```
## Skill Contract
**Expected output**: a ranking report or delta summary plus the standard handoff summary for `memory/monitoring/`.
- **Reads**: current rankings, prior baselines, target keyword list, locale/language/device/engine, snapshot/source refs, observation times/windows, stable page/content bindings, and any user-provided or tool metrics.
- **Writes**: a user-facing monitoring deliverable and reusable summary.
- **Promotes**: significant changes, confirmed anomalies, follow-up actions, and pending decisions to `memory/open-loops.md`.
- **Done when**: every tracked keyword shows a current, context-matched position vs baseline with a labeled delta, or Unknown/NEEDS_REFRESH with its reason; each observation cites its source ref, observed time, window, locale/language/device/engine, evidence label, and ranking page ref; conflicts remain visible; and biggest movers and likely causes are named.
- **Primary next skill**: [performance-monitor](../performance-monitor/SKILL.md) when recurring monitoring should become automated.
### Handoff Summary
> Emit the standard shape from [skill-contract.md §Handoff Summary Format](../../../references/skill-contract.md).
## Data Sources
All integrations optional (see [CONNECTORS.md](../../../CONNECTORS.md)). With tools, pull rankings from ~~SEO tool, impressions from ~~search console, traffic from ~~analytics, and AI citations from ~~AI monitor. Without tools, ask for positions, volumes, competitor data, and SERP feature status.
**Zero-dependency measurement loop** (no paid tool needed): never narrate a ranking movement you did not measure — record each check as a snapshot and let the ledger compute the delta. `python3 "${CLAUDE_PLUGIN_ROOT}/scripts/connectors/ledger.py" record <domain> --source rank --data '{"<keyword>": <position>, ...}'`, then `ledger.py diff <domain> --source rank` for the change since the last check and `ledger.py trend <domain> --source rank --field "<keyword>"` for the series. Record real Search Console positions when connected, or the positions the user provides at Tier 1. A ranking delta is a **week-scale, confounded outcome** — attribute it against a control (a holdout keyword/competitor), not against zero; see [references/measurement-protocol.md](../../../references/measurement-protocol.md). See [scripts/connectors/README.md](../../../scripts/connectors/README.md).
## Decision Gates
**Stop and ask the user when:**
- No target keywords are provided and none can be inferred from `CLAUDE.md` or prior monitoring records — offer: (1) supply a keyword list, (2) track the domain's top known terms, (3) cancel.
**Continue silently (never stop for):**
- No prior baseline exists — record the current run as the baseline, label all positions as the first snapshot, and proceed (do not invent a "previous" position).
- Missing optional tool data (SERP features, AI citations) — mark N/A and proceed.
## Instructions
When a user requests rank tracking or analysis:
1. **Set Up Keyword Tracking** — configure domain, market/locale, device, language, engine, update frequency, priorities, competitor watchlist, and stable page refs. Apply the [SEO/GEO Evidence and Cycle Control Profile](../performance-monitor/references/evidence-and-cycle-control.md).
2. **Record Current Rankings** — output a position table where every row cites its source (tool export / user-provided / estimated), with position ranges, ranking URLs, feature ownership, and movement vs baseline.
3. **Analyze Ranking Changes** — highlight biggest wins, declines, stable terms, new rankings, lost rankings, likely causes, and recovery ideas; each delta labeled against its baseline.
4. **Track SERP Features** — compare ownership of snippets, PAA, image/video packs, local packs, and related feature shifts.
5. **Track GEO / AI Visibility** — monitor AI Overview presence, citation rate, citation position, and trend; mark each value Measured (from an ~~AI monitor) or N/A if unobserved.
6. **Compare Against Competitors** — report share of voice, head-to-head comparisons, and threat levels.
7. **Generate Ranking Report** — output overall trend, key wins, concerns, opportunities, SERP feature changes, GEO visibility, and recommendations, with each metric carrying its source tag.
Label every metric **Measured**, **User-provided**, **Calculated**, **Estimated**, **Proxy**, or **Unknown**; never present an estimate or proxy as measured. An applicable missing metric is Unknown with its reason. A stale or locale/language/device/engine-mismatched position is `NEEDS_REFRESH`, not a current ranking; N/A is only for a genuinely non-applicable field.
> **Reference**: See [Ranking Analysis Templates](references/ranking-analysis-templates.md) for the complete output templates for all seven steps.
## Example
A ranking report names the biggest winners, biggest drops, and next actions, with each position carrying its source tag and labeled delta against baseline.
## Rank Change Quick Reference
### Response Protocol
| Change | Timeframe | Action |
|--------|-----------|--------|
| Drop 1-3 positions | Wait 1-2 weeks | Monitor — may be normal fluctuation |
| Drop 3-5 positions | Investigate within 1 week | Check technical issues and competitor changes |
| Drop 5-10 positions | Investigate immediately | Run a full diagnostic: technical, content, links |
| Drop off page 1 | Emergency response | Comprehensive audit + recovery plan |
| Position gained | Document and learn | Identify what worked and replicate |
> **Reference**: See [Tracking Setup Guide](references/tracking-setup-guide.md) for tracking setup, root-cause taxonomy, CTR benchmarks, SERP feature impact, and algorithm-update assessment.
### Save Results
Ask "Save these results?" If yes, write to `memory/monitoring/` — see [Skill Contract](../../../references/skill-contract.md) §Save Results Template.
## Reference Materials
- [SEO/GEO Evidence and Cycle Control Profile](../performance-monitor/references/evidence-and-cycle-control.md) — exact search observations, freshness, page bindings, and cycle rules
- [Tracking Setup Guide](references/tracking-setup-guide.md) — Setup rules, feature tracking, and interpretation guidance
## Next Best Skill
Initial setup (no baseline) → [performance-monitor](../performance-monitor/SKILL.md). Subsequent runs (baseline exists) → Terminal. Visited-set rule applies per [skill-contract.md](../../../references/skill-contract.md).
© aaron-he-zhu · Apache-2.0 · aaron-he-zhu/aaron-marketing-skills
Similar skills
Everything for SEO and GEO →rank-tracker by other authors comes first.