SEO Opportunity Finder

VerifiedCaution

Identify high-leverage content gaps by comparing your content inventory against competitor keyword rankings, then prioritize posts to write or update.

Sby Skills Guide Bot
ContentIntermediate
8/6/2026
Claude CodeCodex
#seo#content-strategy#keyword-research#competitor-analysis#content-gap

Recommended for

Automated summary

This skill compares a site's existing content inventory against 2-3 competitors to find topics they rank for that you don't cover yet, then outputs a prioritized list of posts to write or update.

Strengths

  • Chains three skills (content cataloging, domain analysis, traffic analysis) to build a full picture of both your site and the competitors.
  • Classifies gaps into four types (hard, soft, positioning, informational) and ranks them by commercial intent.
  • Filters gaps by a commercial intent score of 3 or higher, avoiding generic high-traffic recommendations that won't convert.
  • Delivers something immediately usable: a prioritized opportunity table plus starter editorial briefs.

Limitations

  • Relies on third-party scrapers (Apify Semrush/Ahrefs) and API keys, and may return thin data for low-traffic competitors.
  • Topic coverage on your own site is inferred from titles and URL slugs, so some sub-topics may be missed.
  • Keyword difficulty estimates and production budget are not part of the final prioritization.
When to use it

Use it when a seed or Series A team wants to start a blog and pick its first topics based on where competitors already rank, instead of guessing from a blank keyword list.

When not to use it

Avoid it if you only need a technical on-page SEO audit, or if you have no access to a paid domain-analysis tool.

Security analysis

Caution
Quality score82/100

This is an orchestration skill: it shells out to python/node scripts and calls Apify SEO APIs using an env-var token, then writes a markdown report locally. No destructive commands, no piping remote content to a shell, no sending secrets to suspicious endpoints. The only meaningful risk is reliance on external, unpinned upstream scripts and paid API credentials, which is legitimate use of powerful tools — hence caution rather than safe.

Findings
  • •Requires APIFY_API_TOKEN and makes paid third-party (Apify/Semrush) network calls (~$3-10 per run) — credentials and cost exposure
  • •Executes external scripts via bash by relative path (skills/site-content-catalog/scripts/catalog_site.py, skills/seo-domain-analyzer/src/cli.js, skills/seo-traffic-analyzer/scripts/analyze_seo.py) that are not bundled with this skill — trust depends on unpinned upstream skills
  • •Writes output files into a local clients/<client-name>/ directory (benign)
How this analysis is made

Examples

Gap analysis vs competitors
Find SEO content gaps between https://acme.io and these competitors: https://rival.com, https://othertool.com. Our ICP is B2B sales ops managers at Series A startups. Output a prioritized list of posts we should write.
Where to start a blog
We're starting a blog from scratch at https://ourstartup.com. Compare us against https://competitor-a.com and https://competitor-b.com and tell me the top 10 topics to focus on first, ranked by commercial intent.
Competitor keyword spillover
What keywords is https://competitor.com ranking for that https://mysite.com is missing? Use our site content catalog first so you don't recommend things we already published.

name: seo-opportunity-finder description: > Find quick-win SEO content opportunities by comparing your site's existing content against competitor keyword rankings. Chains site-content-catalog and seo-domain-analyzer to build a content inventory, then identifies gaps — topics competitors rank for that you don't cover yet. Outputs a prioritized list of posts to write or update. Use when a seed/Series A team wants to start winning organic traffic without guessing. tags: [seo]

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

  1. Your website URL (e.g., https://yourcompany.com)
  2. 2-3 competitor URLs to compare against
  3. Primary ICP — who are you trying to attract? (This filters for commercial intent vs. general traffic)
  4. Any topics/keyword themes that are definitely in scope? (Optional — helps prioritize output)

Phase 1: Catalog Your Existing Content

Run site-content-catalog to build an inventory of your current pages and posts:

python3 skills/site-content-catalog/scripts/catalog_site.py \
  --url <your_site_url> \
  --output json

Extract from results:

  • All blog post titles and URLs
  • Inferred topics/themes per post
  • Estimated content age (from URL slugs or metadata if available)

This prevents recommending content you've already written.

Phase 2: Analyze Competitor SEO Footprint

Run seo-domain-analyzer for each competitor:

# Uses Apify Semrush/Ahrefs scrapers
node skills/seo-domain-analyzer/src/cli.js analyze --domain <competitor_domain>

Collect for each competitor:

  • Top ranking keywords (by estimated traffic volume)
  • Top pages by organic traffic
  • Domain authority / DR score
  • Keyword categories they're winning in

If seo-domain-analyzer returns limited data (low-traffic competitor), supplement with seo-traffic-analyzer:

python3 skills/seo-traffic-analyzer/scripts/analyze_seo.py \
  --url <competitor_url> \
  --output summary

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 clients/<client-name>/intelligence/seo-opportunities-[YYYY-MM-DD].md.

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_TOKEN env var
  • Upstream skills: site-content-catalog, seo-domain-analyzer, seo-traffic-analyzer

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]"

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/seo-opportunity-finder-msh3uul2/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/seo-opportunity-finder-msh3uul2' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/seo-opportunity-finder-msh3uul2/download' --output '.skill-downloads/seo-opportunity-finder-msh3uul2/SKILL.md.part' && mv '.skill-downloads/seo-opportunity-finder-msh3uul2/SKILL.md.part' '.skill-downloads/seo-opportunity-finder-msh3uul2/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.

Claude Code
test -f '.skill-downloads/seo-opportunity-finder-msh3uul2/SKILL.md' && test -s '.skill-downloads/seo-opportunity-finder-msh3uul2/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/seo-opportunity-finder' && cp -R '.skill-downloads/seo-opportunity-finder-msh3uul2' '.claude/skills/seo-opportunity-finder'

Codex
test -f '.skill-downloads/seo-opportunity-finder-msh3uul2/SKILL.md' && test -s '.skill-downloads/seo-opportunity-finder-msh3uul2/SKILL.md' && mkdir -p '.agents/skills' && test ! -e '.agents/skills/seo-opportunity-finder' && cp -R '.skill-downloads/seo-opportunity-finder-msh3uul2' '.agents/skills/seo-opportunity-finder'

OpenSkills

OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.

Official OpenSkills installation
openskills install './.skill-downloads/seo-opportunity-finder-msh3uul2'

openskills read 'seo-opportunity-finder-msh3uul2'

Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.

For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.

openskills sync

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/seo-opportunity-finder-msh3uul2/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills