Keyword research and gap analysis. Activates when discussing keywords, keyword gaps, keyword research, search terms, ranking opportunities, low-hanging fruit, keyword mapping, or SERP analysis for local businesses. Phase 6. Output: {AUDIT_DIR}/keyword-gaps.md
From local-seo-auditnpx claudepluginhub anthropics/claude-plugins-community --plugin local-seo-audit-systemThis skill uses the workspace's default tool permissions.
references/keyword-classification.mdProvides Kotlin patterns for JetBrains Exposed ORM: DSL/DAO queries, coroutine transactions, HikariCP pooling, Flyway migrations, repository pattern.
Provides Ktor server patterns for routing DSL, plugins (auth, CORS, serialization), Koin DI, WebSockets, services, and testApplication testing.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
Keyword gap analysis identifies the highest-ROI search opportunities a business is currently missing. In 2025, the keyword landscape has shifted: "near me" searches grew 200%+ in 5 years, AIO (AI Overviews) appears for 20–35% of local service queries reducing organic P1 CTR by 30–45%, and zero-click searches hit 58% (SparkToro 2024). The most impactful keyword opportunities are no longer just the high-volume head terms but: (1) P4–10 keywords already ranking that need a push — highest ROI, (2) long-tail transactional keywords with KD <20 where a single optimized page can rank within 1–4 months, (3) emerging AI-recommendation query patterns. This phase maps the client's full keyword universe vs. competitors, identifies the highest-priority gaps, and produces a prioritized content + optimization plan.
2025 keyword benchmarks:
Numbered Action Plan:
Read {AUDIT_DIR}/intake-data.md — business name, services, location.
Read {AUDIT_DIR}/competitor-profiles.md — competitor keyword strategies.
Read {AUDIT_DIR}/content-inventory.md — client's current page/keyword mapping.
Read {AUDIT_DIR}/content-gaps.md — identified content gaps to inform keyword research.
Tools for this phase:
| Tool | Purpose | Cost |
|---|---|---|
| Ahrefs | Keyword Explorer, Site Explorer → Organic Keywords, Keywords Gap | Paid |
| SEMrush | Keyword Gap tool, Keyword Magic Tool, Position Tracking | Paid |
| Google Search Console | Actual click/impression data per keyword — real performance | Free (requires access) |
| Google Keyword Planner | Volume estimates, CPC (signals commercial intent), trend data | Free (Google Ads account) |
| Ubersuggest | Keyword ideas, volume, CPC, SEO difficulty — good free tier | Free/Paid |
| AlsoAsked.com | PAA-based question keyword mapping per topic | Freemium |
| Google Autocomplete | Real-time long-tail keyword discovery by typing prefix + letters | Free |
| Google Trends | Keyword momentum — seasonal peaks, rising vs. declining terms | Free |
2025 Keyword Research Context:
From Ahrefs Site Explorer → Organic Keywords → export all:
| URL | Primary Keyword | Position | Monthly Clicks | Secondary Keywords |
|---|---|---|---|---|
| /services/[slug] | [keyword] | [pos] | [clicks] | [keywords] |
| /blog/[slug] | [keyword] | [pos] | [clicks] | [keywords] |
For each competitor (Ahrefs → Site Explorer → enter competitor → Organic Keywords):
Use Ahrefs Keyword Gap or SEMrush Keyword Gap tool:
| Category | Keywords | Count | Action |
|---|---|---|---|
| Client only (unique — client ranks, competitors don't) | [list top 5] | [X] | Maintain + strengthen |
| Shared with 1 competitor | [list top 5] | [X] | Improve ranking position |
| Shared with 2+ competitors (table stakes) | [list top 5] | [X] | Must win — critical priority |
| Competitor-only gaps (competitors rank, client doesn't) | [list top 10] | [X] | Create content / optimize |
For every identified gap keyword, classify along 5 dimensions:
| Type | Definition | Local Example | Competition | Timeline |
|---|---|---|---|---|
| Head (1–2 words) | "plumber [city]" | "plumber chicago" | High — 60–80 KD | 6–18 months |
| Mid-tail (2–3 words) | "emergency plumber chicago" | "drain cleaning chicago" | Medium — 30–60 KD | 3–9 months |
| Long-tail (4+ words) | "24 hour emergency plumber lincoln park chicago" | Low — <30 KD | 1–4 months |
| Intent | Description | Content Match | Conversion Rate |
|---|---|---|---|
| Informational | "how to fix a leaky faucet" | Blog guide, how-to | Low (~1–3%) |
| Commercial | "best plumber chicago reviews" | Comparison, local | Medium (~3–8%) |
| Transactional | "hire plumber chicago same day" | Service page + CTA | High (~8–20%) |
| Navigational | "[brand] chicago plumbing" | About/homepage | High (brand intent) |
| Pattern | Example | Volume Type | Priority |
|---|---|---|---|
| Location-modified | "plumber chicago" | Medium | Critical |
| "Near me" variant | "plumber near me" | High | Critical |
| Neighborhood-specific | "plumber lincoln park" | Low-Medium | High |
| No modifier | "leak repair" | High (national) | Secondary |
| "Open now" | "plumber open now" | Medium | High (emergency intent) |
| "Same day" / "24 hour" | "same day plumber chicago" | Medium | High |
| Stage | Examples | Page Type | Priority |
|---|---|---|---|
| TOFU (Awareness) | "signs of a water leak", "why water bill high" | Blog/guide | Medium |
| MOFU (Consideration) | "plumber vs. DIY", "cost to fix burst pipe" | FAQ/comparison | High |
| BOFU (Decision) | "hire emergency plumber chicago", "plumber quote" | Service page | Critical |
| Band | Monthly Volume | Strategy |
|---|---|---|
| High | 1,000+ | Content + links + GBP optimization |
| Medium | 100–999 | Optimized service/location page |
| Low | 10–99 | Long-tail service page or blog section |
| Micro | <10 | FAQ entry, location page detail, schema |
From GSC or Ahrefs → filter positions 4–10 + volume >50/month:
| Keyword | Position | URL | Monthly Volume | Action | Effort | Expected Traffic Gain |
|---|---|---|---|---|---|---|
| [keyword] | 5 | [url] | [vol] | Add FAQ + schema + internal links | 1–2 hrs | +[X]/month |
| [keyword] | 8 | [url] | [vol] | Expand 500 words + Surfer optimize | 2–3 hrs | +[X]/month |
Impact: Moving position 5 → position 1 typically 6–10× more clicks (CTR: ~2.5% → ~25–30%).
From GSC → filter positions 11–20 + volume >100/month:
| Keyword | Position | URL | Volume | Action | Effort |
|---|---|---|---|---|---|
| [keyword] | 14 | [url] | [vol] | Rewrite + earn 3–5 local links | 4–6 hrs + link outreach |
From GSC → Performance → filter: Impressions >100/month, CTR <2%:
| Keyword | Impressions/Month | CTR | Position | Fix | Effort |
|---|---|---|---|---|---|
| [keyword] | [X] | [X%] | [pos] | Rewrite title — add year/city/benefit | 15 min |
Potential: Improving CTR from 1% → 3% on 1,000 impressions = +20 additional monthly clicks.
| Keyword | Volume | KD (Ahrefs) | Intent | Page Needed |
|---|---|---|---|---|
| "[service] cost [city] 2025" | 50–200 | <20 | MOFU | Pricing guide page |
| "[service] vs [alternative] [city]" | 30–100 | <15 | MOFU | Comparison blog post |
| "best [service] [neighborhood]" | 20–80 | <25 | Commercial | Location content |
| "emergency [service] [city] open now" | 50–200 | <30 | BOFU | Emergency service page |
Prevent cannibalization — every keyword should have exactly ONE target page:
| Keyword | Target Page | Status | Action |
|---|---|---|---|
| [keyword 1] | /services/drain-cleaning/ | Under-optimized | Add to title + H1 + schema |
| [keyword 2] | NEW PAGE | Missing | Create service/location page |
| [keyword 3] | /services/drains/ + /drain-repair/ | Cannibalization | Merge → redirect weaker |
Cannibalization detection: Ahrefs → Site Explorer → Organic Keywords → sort by keyword → look for same keyword appearing on 2+ URLs. Also GSC → Performance → click keyword → "Pages" tab — if 2+ pages show, cannibalization likely.
Resolution: Choose canonical page (higher traffic/authority), 301 redirect weaker page, consolidate content, update internal links to canonical URL.
For each high-priority keyword, analyze the SERP to understand what's needed to win:
| Keyword | Volume | KD | SERP Features | #1 Ranker | Required Content | AIO? | Achievable? |
|---|---|---|---|---|---|---|---|
| [keyword] | [X] | [X] | Local Pack/AIO/Snippet/PAA | [domain] | Service page + FAQs | Yes/No | Yes/Hard/No |
SERP Feature targeting strategy:
| Feature | Required Content | Schema | Effort |
|---|---|---|---|
| Featured Snippet | Direct answer in first 50 words, H2 matching query | N/A | 30 min/page |
| Local Pack | GBP optimization + reviews + proximity | LocalBusiness | Ongoing |
| AIO citation | FAQPage schema + direct answers + ≥4.3 stars | FAQPage + AggregateRating | 1–2 hrs |
| PAA box | Question-format H2/H3 with concise answer | FAQPage | 30 min/FAQ |
| People Also Search | Related entity content on page | Article + mentions | 2–4 hrs |
New keyword patterns to capture for local businesses:
| Pattern | Example | Volume Trend | Content Type |
|---|---|---|---|
| AI-recommendation queries | "best plumber recommended by AI in chicago" | Rising ↑ | FAQ + AIO-optimized service |
| Voice/conversational queries | "Hey Google, find a plumber open now near me" | High | "Open now" GBP + local page |
| Hyperlocal (intersection/landmark) | "plumber near Wrigley Field Chicago" | Low volume, high intent | Location micro-page or FAQ |
| "According to" queries | "best plumber according to google reviews" | Rising ↑ | Review-focused content |
| Comparison with AI | "plumber vs AI DIY [city]" | Emerging | Comparison blog post |
Score each gap keyword on 5 dimensions:
| Keyword | Volume (1–5) | Intent (1–5) | Competition (5=low, 1=high) | Time to Rank (5=quick) | Relevance (1–5) | Priority Score | Target Page | Timeline |
|---|---|---|---|---|---|---|---|---|
| [keyword 1] | 3 | 5 | 4 | 4 | 5 | 4.2 | New service page | 1–3 months |
| [keyword 2] | 2 | 4 | 5 | 5 | 5 | 4.2 | Expand existing | 2–4 weeks |
Top 20 Priority Keywords (ordered by Priority Score):
| Rank | Keyword | Volume | Intent | Score | Target Page | Effort | Timeline |
|---|---|---|---|---|---|---|---|
| 1 | [keyword] | [vol] | Transactional | [X.X] | [URL or New] | [X hrs] | 1–3 months |
| 2 | [keyword] | [vol] | Commercial | [X.X] | [URL or New] | [X hrs] | 2–4 weeks |
Write complete analysis to {AUDIT_DIR}/keyword-gaps.md with YAML frontmatter:
---
skill: research/keyword-gaps
phase: 6
date: [YYYY-MM-DD]
business: [Business Name]
url: [URL]
score: [X/100]
keywords_audited: [X]
quick_wins: [X]
gaps_identified: [X]
cannibalization_issues: [X]
---
Include:
Output files:
{AUDIT_DIR}/keyword-gaps.md — keyword gap analysis with priority matrix{REPORTS_DIR}/phase-6-keyword-gaps.pdf — auto-generated PDF after phase completesKey consumers:
research/topical-gaps — keywords inform topical map and cluster structureoutput/report-generation — keyword opportunities in master report section 6audit/onpage-seo — keyword-to-page assignments for optimization| Keyword Type | Volume Range | KD Target | AIO Risk | Priority | Action |
|---|---|---|---|---|---|
| P4–10 existing rankers | Any | Ranked | Low | 25 (5×5) | On-page optimization (no new content) |
| Long-tail transactional | 50–500/mo | <20 | Low | 20 (5×4) | Create 800–1,200 word page |
| "Near me" variants | 100–2,000/mo | <30 | Medium | 20 (4×5) | GBP optimization + location page |
| Voice search queries | 10–200/mo | <15 | High | 15 (5×3) | FAQ pages with FAQPage schema |
| High-volume head terms | 1,000+/mo | >50 | High | 12 (4×3) | Long-term cluster building |
| Featured snippet targets | 50–500/mo | <40 | Medium | 16 (4×4) | Add structured response block to page |
GBP keywords now feed directly into local pack visibility. Add top-priority keywords to:
INP (Interaction to Next Paint) replaced FID as a Core Web Vital in March 2024. It is a confirmed page experience signal that affects keyword rankings:
Keyword targeting implication: For competitive keywords (KD >40) where page experience is a tiebreaker, poor INP on target pages directly suppresses keyword potential. When prioritizing keyword opportunities in this phase, flag any target page with INP >200ms as needing simultaneous technical fix (Phase 10) to unlock ranking potential.
Use this structure when reporting gaps found via Ahrefs / SEMrush keyword gap tool:
| Gap Keyword | Client Position | Comp 1 Position | Comp 2 Position | Monthly Searches | KD | Intent | Priority Action |
|---|---|---|---|---|---|---|---|
| [service keyword] | Not ranking | P3 | P5 | [volume] | [KD] | BOFU | Create service page |
| [near me variant] | P12 | P2 | P4 | [volume] | [KD] | Local | GBP + location page |
| [question keyword] | Not ranking | P1 (snippet) | P8 | [volume] | [KD] | MOFU | FAQ page + FAQPage schema |
| [cost/price query] | Not ranking | P2 | P6 | [volume] | <20 | MOFU | Pricing guide page |
INP note: keyword-optimized pages must also meet INP <200ms threshold (replaced FID March 2024) — fast pages with good keyword targeting outrank slow pages with identical targeting.