Help us improve
Share bugs, ideas, or general feedback.
From seo-aeo-pro
Revenue-focused keyword research and strategy for SEO campaigns. Covers discovery, clustering, intent mapping, difficulty assessment, competitor gap analysis, topical authority, SERP features, and programmatic SEO template generation.
npx claudepluginhub mangollc/claude-seo-skill --plugin seo-aeo-proHow this skill is triggered — by the user, by Claude, or both
Slash command
/seo-aeo-pro:seo-keywordsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Always load client context first. See [rules/client-setup.md](rules/client-setup.md) for the client loading pattern.
Researches and clusters keywords with search volume, difficulty, intent classification, and content recommendations.
Expands seed keywords into ranked opportunities with live SERP volume, intent, and winnability data. Runs gap analysis against competitors and builds topic clusters.
Performs SEO keyword research to identify target keywords with search volume, difficulty, and content mapping. Guides niche analysis, competitor landscape, and page assignment.
Share bugs, ideas, or general feedback.
Always load client context first. See rules/client-setup.md for the client loading pattern.
Save all output to .seo/clients/{slug}/keywords/:
keywords/
├── research-{date}.json # Raw keyword research
├── clusters.json # Keyword clusters
├── competitor-gap.json # Gap analysis
├── topic-map.json # Topical authority map
├── serp-features-{date}.json # SERP feature analysis
├── competitor-strategy.json # Competitor content RE
└── programmatic-templates/ # Template patterns
├── location-template.json
└── comparison-template.json
For clients with business_type: "local".
# Search for core service + location combinations
firecrawl search "{service} {city}" --limit 20 -o .seo/clients/{slug}/keywords/.firecrawl/seed-{service}.json --json
firecrawl search "{service} near me" --limit 20 -o .seo/clients/{slug}/keywords/.firecrawl/seed-nearme.json --json
firecrawl search "best {service} in {city}" --limit 20 -o .seo/clients/{slug}/keywords/.firecrawl/seed-best.json --json
Run in parallel for each service and service area from client config.
# Map competitor sites to find all their pages
firecrawl map {competitor-domain} --search "{industry}" -o .seo/clients/{slug}/keywords/.firecrawl/comp-{name}-urls.txt &
# Repeat for each competitor in parallel
wait
# Scrape competitor service pages for keyword patterns
firecrawl scrape {competitor-url} --format markdown,links -o .seo/clients/{slug}/keywords/.firecrawl/comp-{name}-page.json
Extract from competitor pages: title tags, H1s, H2s, service names, location modifiers, URL slugs. These reveal the keywords they target.
Generate geo-modified variants for each core service:
{service} {city} — primary{service} {city} {state} — long-tail{service} near {neighborhood} — hyperlocal{service} in {zip_code} — zip-targetedbest {service} {city} — commercial intent{service} cost {city} — transactionalemergency {service} {city} — urgent intent{service} reviews {city} — social proofClassify each keyword by revenue potential:
Prioritize high-revenue keywords first. Low-revenue informational keywords support topical authority.
For clients with business_type: "saas" or "ecommerce".
# Search for product category and feature keywords
firecrawl search "{product-category} software" --limit 20 -o .seo/clients/{slug}/keywords/.firecrawl/product-cat.json --json
firecrawl search "{product-name} alternatives" --limit 20 -o .seo/clients/{slug}/keywords/.firecrawl/alternatives.json --json
firecrawl search "{problem-solved} tools" --limit 20 -o .seo/clients/{slug}/keywords/.firecrawl/problem-tools.json --json
Group keywords into clusters by semantic similarity and shared SERP results.
For each seed keyword group, search Google via firecrawl and compare the top 10 results. Keywords that share 3+ of the same top 10 URLs belong to the same cluster.
# Search for each keyword to see SERP overlap
firecrawl search "{keyword}" --limit 10 -o .seo/clients/{slug}/keywords/.firecrawl/serp-{keyword-slug}.json --json
{
"clusters": [
{
"name": "Cluster Name",
"pillar_keyword": "main keyword",
"keywords": ["keyword1", "keyword2", "keyword3"],
"intent": "commercial",
"estimated_volume": "high|medium|low",
"recommended_page_type": "service-page|blog-post|landing-page|comparison-page",
"current_url": null,
"gap": true
}
]
}
For each keyword, classify intent based on SERP analysis:
| Intent | SERP Signals | Examples |
|---|---|---|
| Transactional | Product pages, pricing, buy buttons dominate | "buy X", "X pricing", "X coupon" |
| Commercial | Comparison pages, reviews, listicles dominate | "best X", "X vs Y", "X reviews" |
| Informational | Blog posts, how-tos, Wikipedia dominate | "what is X", "how to X", "X guide" |
| Navigational | Brand homepages, login pages dominate | "X login", "X website", brand names |
For each target keyword, analyze the top 10 SERP results:
firecrawl search "{keyword}" --scrape --limit 10 -o .seo/clients/{slug}/keywords/.firecrawl/difficulty-{slug}.json --json
Score difficulty (1-10) based on:
Compare client's content against 2-3 competitors:
# Map all pages for client and each competitor
firecrawl map {client-domain} -o .seo/clients/{slug}/keywords/.firecrawl/client-urls.txt &
firecrawl map {competitor1-domain} -o .seo/clients/{slug}/keywords/.firecrawl/comp1-urls.txt &
firecrawl map {competitor2-domain} -o .seo/clients/{slug}/keywords/.firecrawl/comp2-urls.txt &
wait
Compare URL structures and page titles to identify topics competitors cover that the client does not. Output as prioritized gap list.
Build a content architecture around topic clusters:
From keyword clusters, identify 3-5 broad pillar topics that the client should own. Each pillar becomes a comprehensive page (2000+ words).
For each pillar, identify 8-15 supporting cluster articles that link back to the pillar page. Use keyword clusters to assign one cluster per article.
Define the linking structure:
{
"pillars": [
{
"topic": "Pillar Topic Name",
"pillar_keyword": "main keyword",
"pillar_url": "/pillar-page-slug",
"clusters": [
{
"title": "Cluster Article Title",
"target_keyword": "cluster keyword",
"url": "/cluster-slug",
"status": "exists|gap",
"links_to_pillar": true,
"interlinks": ["/related-cluster-1", "/related-cluster-2"]
}
]
}
]
}
For target keywords, identify which SERP features appear and which the client can win:
firecrawl search "{keyword}" --scrape --limit 5 -o .seo/clients/{slug}/keywords/.firecrawl/serp-{slug}.json --json
Track these SERP features:
Analyze competitor content operations:
# Map all competitor content
firecrawl map {competitor-domain} --search "blog" -o .seo/clients/{slug}/keywords/.firecrawl/comp-blog-urls.txt
firecrawl map {competitor-domain} -o .seo/clients/{slug}/keywords/.firecrawl/comp-all-urls.txt
Then scrape a sample of pages to analyze:
For SaaS/ecommerce clients with repeatable page patterns:
{
"template_type": "location",
"url_pattern": "/{service}-{city}-{state}",
"title_pattern": "{Service} in {City}, {State} | {Brand}",
"h1_pattern": "{Service} in {City}, {State}",
"sections": [
"Local intro paragraph with city-specific details",
"Service description (shared, with local modifiers)",
"Service area map / neighborhoods served",
"Local testimonials / reviews",
"FAQPage schema with city-specific FAQ",
"CTA with local phone number"
],
"schema_type": "LocalBusiness",
"internal_links": ["pillar-service-page", "nearby-location-pages"]
}
{
"template_type": "comparison",
"url_pattern": "/{product}-vs-{competitor}",
"title_pattern": "{Product} vs {Competitor}: {Year} Comparison",
"h1_pattern": "{Product} vs {Competitor}",
"sections": [
"Quick verdict / summary table",
"Feature-by-feature comparison",
"Pricing comparison",
"Pros and cons of each",
"Who should choose which",
"FAQPage schema"
],
"schema_type": "Article",
"internal_links": ["product-page", "pricing-page"]
}
{
"template_type": "category",
"url_pattern": "/best-{category}-{modifier}",
"title_pattern": "Best {Category} for {Modifier} ({Year})",
"sections": [
"Quick picks / top 3 summary",
"Evaluation criteria",
"Detailed reviews of each option",
"Comparison table",
"How to choose guide",
"FAQ section"
]
}
All keyword data should follow this format:
{
"keyword": "emergency plumber austin",
"cluster": "emergency-plumbing",
"intent": "transactional",
"difficulty": 6,
"volume_estimate": "medium",
"revenue_potential": "high",
"funnel_stage": "bofu",
"serp_features": ["local_pack", "paa", "ai_overview"],
"recommended_page_type": "service-page",
"current_url": null,
"competitor_coverage": ["comp-a", "comp-b"],
"priority": 1,
"notes": ""
}