SEO opportunity finder
Find quick-win SEO content opportunities by comparing your site's existing content against competitor keyword rankings.
How to use it
- Hit Copy SKILL.md — or use the Claude Code line below to get every file.
- Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
ChatGPT: make a Project and paste it into Instructions.
Neither? Paste it at the top of a new chat — it works for that chat. - Describe your job in plain words. The AI follows the skill from there.
npx degit gooseworks-ai/goose-skills/skills/seo/composites/seo-opportunity-finder#main ~/.claude/skills/seo-opportunity-finderFor one project only, change the path to .claude/skills/seo-opportunity-finder. This skill also uses robots.txt — copying SKILL.md alone won't be enough. See the folder on GitHub.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Show the full text150 lines
SEO Opportunity Finder
Identify the highest-leverage content gaps between your site and competitors. Combines a crawl of your existing content with competitor keyword/traffic analysis to surface a prioritized list of posts worth writing.
Core principle: Don't start from a blank keyword list. Start by knowing what you have, then find what competitors have that you don't — and pick the gaps most likely to convert.
When to Use
- "Find SEO content gaps vs our competitors"
- "What topics should we write about to rank?"
- "We're starting a blog — where should we focus first?"
- "What keywords are [competitor] ranking for that we're missing?"
Phase 0: Intake
- Your website URL (e.g.,
https://yourcompany.com) - 2-3 competitor URLs to compare against
- Primary ICP — who are you trying to attract? (This filters for commercial intent vs. general traffic)
- Any topics/keyword themes that are definitely in scope? (Optional — helps prioritize output)
Phase 1: Catalog Your Existing Content
Build an inventory of the target site's current pages and posts:
- Fetch sitemap.xml (check
/sitemap.xml,/sitemap_index.xml,robots.txtforSitemap:directives) - Fall back to RSS feeds (
/feed,/blog/feed) or blog index crawl if no sitemap - Extract: all blog post titles and URLs, inferred topics/themes per post, estimated content age
This prevents recommending content you've already written.
Phase 2: Analyze Competitor SEO Footprint
For each competitor domain, pull SEO metrics:
- Domain overview — authority score, organic traffic estimate, top ranking keywords (via Apify Semrush scraper if
APIFY_API_TOKENis set) - Top pages — highest-traffic pages and their primary keywords
- Keyword categories — which topic clusters they're winning in
If Apify data is limited, supplement with web search probes:
site:[competitor]for indexed page count- Search target keywords and note which competitors rank where
- SimilarWeb free tier for traffic estimates
Phase 3: Identify Gaps
Compare your content inventory (Phase 1) against competitor keyword/topic coverage (Phase 2):
Gap Classification
| Type | Definition | Priority |
|---|---|---|
| Hard gap | Competitor has a page/post on topic, you have nothing | High |
| Soft gap | You have content on topic but it's thin (< 500 words, old, no depth) | Medium |
| Positioning gap | Competitor owns a keyword cluster that maps to your ICP's exact problem | High |
| Informational gap | High traffic, low commercial intent — good for awareness, not conversion | Low |
Commercial Intent Filter
For each gap topic, score commercial intent (1-5):
- 5 — Directly maps to your product (e.g., "best AI SDR tools for startups")
- 4 — Problem-aware but not product-specific (e.g., "how to scale outbound SDR")
- 3 — Adjacent pain point (e.g., "cold email open rates benchmark 2026")
- 2 — Educational, tangential (e.g., "what is lead scoring")
- 1 — Generic traffic, low conversion potential
Prioritize gaps with score ≥ 3.
Phase 4: Synthesize & Output
Produce a prioritized opportunity table + editorial brief starters:
# SEO Opportunity Report — [Your Company] vs [Competitors]
Generated: [DATE]
## Your Content Snapshot
- Total indexed pages: [N]
- Blog posts: [N]
- Main topic clusters: [list]
## Competitor Benchmarks
| Domain | DR | Est. Monthly Organic Traffic | Top Keyword Clusters |
|--------|----|-----------------------------|----------------------|
| [comp1] | [X] | [X] | [topics] |
| [comp2] | [X] | [X] | [topics] |
## Top 10 Content Opportunities
### 1. [Topic/Title Suggestion]
- **Keyword target:** [keyword phrase]
- **Why it matters:** [what problem it solves for ICP]
- **Competitor owning it:** [competitor URL]
- **Est. monthly searches:** [range]
- **Commercial intent score:** [1-5]
- **Recommended format:** [listicle / how-to / comparison / landing page]
- **Estimated effort:** [hours or word count target]
### 2. [Topic/Title Suggestion]
...
## Quick Wins (update existing posts)
| Your Post | Issue | What to Add |
|-----------|-------|-------------|
| [URL] | [thin/outdated] | [recommendation] |
## Recommended Content Calendar (Next 90 Days)
| Month | Post | Intent Score | Est. Traffic Potential |
|-------|------|-------------|----------------------|
| Month 1 | [post 1] | [score] | [range] |
| Month 1 | [post 2] | [score] | [range] |
| Month 2 | [post 3] | [score] | [range] |
...
Save to the current working directory or wherever the user prefers.
Cost
| Component | Cost |
|---|---|
| Site content catalog | Free (sitemap crawl) |
| SEO domain analyzer (per competitor) | ~$1-3 (Apify Semrush scraper) |
| Traffic analyzer (supplement) | ~$0.10-0.50 (web search probes) |
| Total per run | ~$3-10 for 3 competitors |
Tools Required
- Apify API token —
APIFY_API_TOKENenv var (for Semrush/Ahrefs data; free web search probes work without it) - Web search and web fetch capabilities
Trigger Phrases
- "Find our SEO content gaps"
- "What should we write about to rank?"
- "Compare our content coverage to [competitor]"
- "Run SEO opportunity finder for [client]"
| 1 | |
| 2 | name seo-opportunity-finder |
| 3 | description > |
| 4 | Find quick-win SEO content opportunities by comparing your site's existing content |
| 5 | against competitor keyword rankings. Chains site-content-catalog and seo-domain-analyzer |
| 6 | to build a content inventory, then identifies gaps — topics competitors rank for that |
| 7 | you don't cover yet. Outputs a prioritized list of posts to write or update. |
| 8 | Use when a seed/Series A team wants to start winning organic traffic without guessing. |
| 9 | tags [seo] |
| 10 | |
| 11 | |
| 12 | # SEO Opportunity Finder |
| 13 | |
| 14 | Identify the highest-leverage content gaps between your site and competitors. Combines a crawl of your existing content with competitor keyword/traffic analysis to surface a prioritized list of posts worth writing. |
| 15 | |
| 16 | **Core principle:** Don't start from a blank keyword list. Start by knowing what you have, then find what competitors have that you don't — and pick the gaps most likely to convert. |
| 17 | |
| 18 | ## When to Use |
| 19 | |
| 20 | "Find SEO content gaps vs our competitors" |
| 21 | "What topics should we write about to rank?" |
| 22 | "We're starting a blog — where should we focus first?" |
| 23 | "What keywords are [competitor] ranking for that we're missing?" |
| 24 | |
| 25 | ## Phase 0: Intake |
| 26 | |
| 27 | Your website URL (e.g., `https://yourcompany.com`) |
| 28 | 2-3 competitor URLs to compare against |
| 29 | Primary ICP — who are you trying to attract? (This filters for commercial intent vs. general traffic) |
| 30 | Any topics/keyword themes that are definitely in scope? (Optional — helps prioritize output) |
| 31 | |
| 32 | ## Phase 1: Catalog Your Existing Content |
| 33 | |
| 34 | Build an inventory of the target site's current pages and posts: |
| 35 | |
| 36 | Fetch sitemap.xml (check `/sitemap.xml`, `/sitemap_index.xml`, `robots.txt` for `Sitemap:` directives) |
| 37 | Fall back to RSS feeds (`/feed`, `/blog/feed`) or blog index crawl if no sitemap |
| 38 | Extract: all blog post titles and URLs, inferred topics/themes per post, estimated content age |
| 39 | |
| 40 | This prevents recommending content you've already written. |
| 41 | |
| 42 | ## Phase 2: Analyze Competitor SEO Footprint |
| 43 | |
| 44 | For each competitor domain, pull SEO metrics: |
| 45 | |
| 46 | **Domain overview** — authority score, organic traffic estimate, top ranking keywords (via Apify Semrush scraper if `APIFY_API_TOKEN` is set) |
| 47 | **Top pages** — highest-traffic pages and their primary keywords |
| 48 | **Keyword categories** — which topic clusters they're winning in |
| 49 | |
| 50 | If Apify data is limited, supplement with web search probes: |
| 51 | `site:[competitor]` for indexed page count |
| 52 | Search target keywords and note which competitors rank where |
| 53 | SimilarWeb free tier for traffic estimates |
| 54 | |
| 55 | ## Phase 3: Identify Gaps |
| 56 | |
| 57 | Compare your content inventory (Phase 1) against competitor keyword/topic coverage (Phase 2): |
| 58 | |
| 59 | ### Gap Classification |
| 60 | |
| 61 | | Type | Definition | Priority | |
| 62 | |------|------------|----------| |
| 63 | | **Hard gap** | Competitor has a page/post on topic, you have nothing | High | |
| 64 | | **Soft gap** | You have content on topic but it's thin (< 500 words, old, no depth) | Medium | |
| 65 | | **Positioning gap** | Competitor owns a keyword cluster that maps to your ICP's exact problem | High | |
| 66 | | **Informational gap** | High traffic, low commercial intent — good for awareness, not conversion | Low | |
| 67 | |
| 68 | ### Commercial Intent Filter |
| 69 | |
| 70 | For each gap topic, score commercial intent (1-5): |
| 71 | **5** — Directly maps to your product (e.g., "best AI SDR tools for startups") |
| 72 | **4** — Problem-aware but not product-specific (e.g., "how to scale outbound SDR") |
| 73 | **3** — Adjacent pain point (e.g., "cold email open rates benchmark 2026") |
| 74 | **2** — Educational, tangential (e.g., "what is lead scoring") |
| 75 | **1** — Generic traffic, low conversion potential |
| 76 | |
| 77 | Prioritize gaps with score ≥ 3. |
| 78 | |
| 79 | ## Phase 4: Synthesize & Output |
| 80 | |
| 81 | Produce a prioritized opportunity table + editorial brief starters: |
| 82 | |
| 83 | |
| 84 | # SEO Opportunity Report — [Your Company] vs [Competitors] |
| 85 | Generated: [DATE] |
| 86 | |
| 87 | ## Your Content Snapshot |
| 88 | - Total indexed pages: [N] |
| 89 | - Blog posts: [N] |
| 90 | - Main topic clusters: [list] |
| 91 | |
| 92 | ## Competitor Benchmarks |
| 93 | | Domain | DR | Est. Monthly Organic Traffic | Top Keyword Clusters | |
| 94 | |--------|----|-----------------------------|----------------------| |
| 95 | | [comp1] | [X] | [X] | [topics] | |
| 96 | | [comp2] | [X] | [X] | [topics] | |
| 97 | |
| 98 | ## Top 10 Content Opportunities |
| 99 | |
| 100 | ### 1. [Topic/Title Suggestion] |
| 101 | - **Keyword target:** [keyword phrase] |
| 102 | - **Why it matters:** [what problem it solves for ICP] |
| 103 | - **Competitor owning it:** [competitor URL] |
| 104 | - **Est. monthly searches:** [range] |
| 105 | - **Commercial intent score:** [1-5] |
| 106 | - **Recommended format:** [listicle / how-to / comparison / landing page] |
| 107 | - **Estimated effort:** [hours or word count target] |
| 108 | |
| 109 | ### 2. [Topic/Title Suggestion] |
| 110 | ... |
| 111 | |
| 112 | ## Quick Wins (update existing posts) |
| 113 | |
| 114 | | Your Post | Issue | What to Add | |
| 115 | |-----------|-------|-------------| |
| 116 | | [URL] | [thin/outdated] | [recommendation] | |
| 117 | |
| 118 | ## Recommended Content Calendar (Next 90 Days) |
| 119 | |
| 120 | | Month | Post | Intent Score | Est. Traffic Potential | |
| 121 | |-------|------|-------------|----------------------| |
| 122 | | Month 1 | [post 1] | [score] | [range] | |
| 123 | | Month 1 | [post 2] | [score] | [range] | |
| 124 | | Month 2 | [post 3] | [score] | [range] | |
| 125 | ... |
| 126 | |
| 127 | |
| 128 | Save to the current working directory or wherever the user prefers. |
| 129 | |
| 130 | ## Cost |
| 131 | |
| 132 | | Component | Cost | |
| 133 | |-----------|------| |
| 134 | | Site content catalog | Free (sitemap crawl) | |
| 135 | | SEO domain analyzer (per competitor) | ~$1-3 (Apify Semrush scraper) | |
| 136 | | Traffic analyzer (supplement) | ~$0.10-0.50 (web search probes) | |
| 137 | | **Total per run** | **~$3-10 for 3 competitors** | |
| 138 | |
| 139 | ## Tools Required |
| 140 | |
| 141 | **Apify API token** — `APIFY_API_TOKEN` env var (for Semrush/Ahrefs data; free web search probes work without it) |
| 142 | Web search and web fetch capabilities |
| 143 | |
| 144 | ## Trigger Phrases |
| 145 | |
| 146 | "Find our SEO content gaps" |
| 147 | "What should we write about to rank?" |
| 148 | "Compare our content coverage to [competitor]" |
| 149 | "Run SEO opportunity finder for [client]" |
| 150 |