Appearance
Content Gap Analysis Workflow
FreshEnd-to-end workflow for identifying and filling content gaps using vector embeddings and competitive analysis.
Overview
This workflow uses vector embeddings to semantically compare your content against competitors, identifying topics they cover that you don't.
Prerequisites
- [ ] ChatGPT Plus or API access
- [ ] Google Colab account
- [ ] OpenAI API key
- [ ] Screaming Frog license
- [ ] Ahrefs/SEMrush access (for traffic estimates)
Phase 1: Competitor Selection
Objective: Choose the right competitors for comparison
Step 1.1: Identify True Competitors
Not just business competitors - content competitors:
- Sites ranking for your target keywords
- Industry publications
- Resource sites in your niche
Step 1.2: Scope the Comparison
| Scope | When to Use |
|---|---|
| Full site | Small sites (<1000 pages) |
| Section only | Large sites (compare /blog to /blog) |
| Topic cluster | Focused analysis |
Phase 2: Data Collection
Objective: Gather URLs and content from both sites
Step 2.1: Crawl Your Site
Using Screaming Frog:
- Configure to extract page content
- Enable custom extraction for embeddings
- Export: URL, Title, Content, Embeddings
Step 2.2: Crawl Competitor
Same process for competitor site. Alternatively, use Colab to crawl directly.
Step 2.3: Data Format
Prepare CSVs:
your_site.csv:
| URL | Title | Embeddings |
|---|---|---|
| /page1 | Title 1 | [0.123, ...] |
competitor.csv:
| URL | Title | Embeddings |
|---|---|---|
| /page-a | Title A | [0.456, ...] |
Phase 3: Embedding Comparison
Objective: Find semantic gaps using vector similarity
Step 3.1: Generate Comparison Code
Use ChatGPT with this prompt:
I need Python code for Google Colab.
I have two CSVs:
- my_site.csv with columns: URL, Title, Embeddings
- competitor.csv with columns: URL, Title, Embeddings
For each competitor URL, find the best matching URL on my site using cosine similarity.
Output a CSV with:
- Competitor URL
- Competitor Title
- Best Match URL (my site)
- Best Match Title (my site)
- Similarity Score
Sort by similarity score ascending (lowest first = biggest gaps).Step 3.2: Run Analysis
- Upload both CSVs to Colab
- Run the generated code
- Download results
Step 3.3: Interpret Results
| Score Range | Meaning | Action |
|---|---|---|
| 0.00 - 0.25 | No matching content | High priority gap |
| 0.25 - 0.40 | Weak coverage | Consider new content |
| 0.40 - 0.60 | Partial coverage | Enhance existing |
| 0.60+ | Good coverage | Low priority |
Phase 4: Gap Prioritization
Objective: Focus on highest-value opportunities
Step 4.1: Add Traffic Data
Enrich gap list with:
- Competitor page traffic (Ahrefs/SEMrush)
- Keywords the page ranks for
- Backlink count
Step 4.2: Scoring Matrix
Step 4.3: Final Priority List
Create prioritized list:
- High traffic + Big gap = Immediate priority
- High traffic + Small gap = Enhance existing
- Low traffic + Big gap = Secondary priority
- Low traffic + Small gap = Backlog
Phase 5: Content Planning
Objective: Turn gaps into actionable content plans
Step 5.1: Content Brief Creation
For each priority gap:
- Target keywords
- Search intent
- Content format (guide, tool, comparison)
- Word count estimate
- Internal linking opportunities
Step 5.2: Cluster Gaps
Group related gaps into topic clusters:
- Create pillar page for cluster
- Plan supporting content
- Map internal link structure
Phase 6: Implementation
Objective: Create content and integrate with existing site
Step 6.1: Content Creation
Follow your content creation process, ensuring:
- Unique angle (not just copying competitor)
- Better depth or freshness
- Proper E-E-A-T signals
Step 6.2: Internal Linking
Using Internal Linking SOP:
- Link from existing high-authority pages
- Add new pages to navigation
- Update related content to reference new pages
Step 6.3: Submission
- Add to XML sitemap
- Request indexing in Search Console
- Share on social/email for initial signals
Verification Checklist
- [ ] Competitors selected and scoped
- [ ] Both sites crawled with embeddings
- [ ] Comparison analysis complete
- [ ] Gaps prioritized by value
- [ ] Content briefs created
- [ ] Internal linking planned
- [ ] Implementation timeline set
Troubleshooting
Embeddings not matching well
- Check you're using the same embedding model for both sites
- Ensure content (not just titles) is included
Too many gaps identified
- Narrow scope to specific sections
- Increase similarity threshold
- Filter by traffic potential
Competitor has thin content
- Focus on their high-traffic pages only
- Consider multiple competitors