SEO content briefs were my biggest bottleneck. For each post, I'd spend 2-3 hours on keyword research, competitor analysis, topic clustering, intent mapping, outline creation, word count targets, and optimization guidelines. Result? Could only create 2-3 briefs per week.
Then I automated it with AI.
Now:
- 8 minutes per comprehensive brief
- Better keyword targeting
- Data-driven insights
- Ready to write immediately
10x faster. Here's exactly how.
The AI SEO Brief Generator
Create comprehensive content briefs automatically:
import openai
from duckduckgo_search import DDGS
import json
from typing import List, Dict
class SEOBriefGenerator:
"""Generate comprehensive SEO content briefs with AI."""
def __init__(self):
self.client = openai.OpenAI()
self.ddgs = DDGS()
def create_seo_brief(self, primary_keyword: str):
"""Complete SEO brief generation process."""
print(f"📊 Creating SEO brief for: {primary_keyword}\n")
# Step 1: Keyword research
keywords = self.keyword_research(primary_keyword)
# Step 2: Competitor analysis
competitors = self.analyze_top_10(primary_keyword)
# Step 3: Search intent analysis
intent = self.analyze_search_intent(primary_keyword, competitors)
# Step 4: Content gap analysis
gaps = self.find_content_gaps(competitors)
# Step 5: Generate outline
outline = self.create_content_outline(
primary_keyword=primary_keyword,
keywords=keywords,
intent=intent,
competitors=competitors,
gaps=gaps
)
# Step 6: Create optimization guidelines
guidelines = self.create_optimization_guidelines(
keywords=keywords,
competitors=competitors
)
# Step 7: Format complete brief
brief = self.format_complete_brief(
primary_keyword=primary_keyword,
keywords=keywords,
intent=intent,
competitors=competitors,
gaps=gaps,
outline=outline,
guidelines=guidelines
)
print("✅ SEO brief complete!\n")
return brief
def keyword_research(self, primary_keyword: str):
"""Research keywords and variations."""
print("🔍 Keyword research...")
results = self.ddgs.text(primary_keyword, max_results=20)
context = "\n".join([f"{r['title']} - {r['body']}" for r in results[0:10]])
prompt = f"""
Generate comprehensive keyword list for: {primary_keyword}
Search context:
{context[0:2000]}
Create keyword clusters:
1. PRIMARY KEYWORD
- The main target keyword
- Estimated difficulty: high/medium/low
2. SECONDARY KEYWORDS (5-7)
- Close variations
- Related terms
- Same intent
3. LONG-TAIL KEYWORDS (10-15)
- Specific phrases
- Question-based
- Lower competition
4. LSI KEYWORDS (8-10)
- Semantically related
- Context terms
- Topic coverage
5. QUESTION KEYWORDS (5-7)
- "How to..."
- "What is..."
- "Why..."
- "Best..."
For each keyword provide:
- Keyword phrase
- Estimated search volume (high/medium/low)
- Competition (high/medium/low)
- Search intent (informational/commercial/navigational/transactional)
- Priority (1-5, 5 being highest)
Return as JSON.
"""
response = self.client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
def analyze_top_10(self, keyword: str):
"""Analyze top 10 ranking pages."""
print("🏆 Analyzing top 10 competitors...")
results = self.ddgs.text(keyword, max_results=10)
competitors = []
for i, r in enumerate(results, 1):
competitors.append({
'rank': i,
'url': r['href'],
'title': r['title'],
'snippet': r['body']
})
competitor_data = "\n".join([
f"#{c['rank']}: {c['title']}\n{c['snippet']}\n"
for c in competitors[0:10]
])
prompt = f"""
Analyze these top 10 ranking pages for: {keyword}
{competitor_data}
Extract patterns:
1. CONTENT TYPE
- What format ranks? (guide, listicle, how-to, etc.)
- Average word count estimate
2. COMMON SECTIONS
- Sections that appear in multiple results
- Typical structure/outline
3. UNIQUE ANGLES
- Different approaches used
- Unique value propositions
4. TITLE PATTERNS
- Common words in titles
- Number usage
- Year mentions
5. CONTENT DEPTH
- Surface-level or comprehensive?
- Technical depth
- Example/case study usage
6. WEAKNESSES
- What's missing?
- Opportunities to do better
- Content gaps
Return analysis as JSON.
"""
response = self.client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
def analyze_search_intent(self, keyword: str, competitors: dict):
"""Determine primary search intent."""
print("🎯 Analyzing search intent...")
prompt = f"""
Determine search intent for: {keyword}
Top ranking content:
{json.dumps(competitors, indent=2)[0:1500]}
Classify intent:
PRIMARY INTENT (choose one):
- Informational: Learning/understanding
- Commercial: Comparing/researching before purchase
- Transactional: Ready to buy/act
- Navigational: Finding specific page/brand
SECONDARY INTENTS (if applicable):
- Additional intents present
INTENT SIGNALS:
- Words that indicate intent
- What user wants to accomplish
- Expected content type
USER JOURNEY STAGE:
- Awareness: Just learning about topic
- Consideration: Evaluating options
- Decision: Ready to choose/act
CONTENT EXPECTATIONS:
- What user expects to find
- Preferred format
- Depth required
Return as JSON.
"""
response = self.client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
def find_content_gaps(self, competitors: dict):
"""Identify gaps in competitor content."""
print("🔎 Finding content gaps...")
prompt = f"""
Analyze competitor content for gaps and opportunities:
{json.dumps(competitors, indent=2)[0:2000]}
Identify:
1. MISSING TOPICS
- Important aspects not covered
- Questions not answered
- Subtopics ignored
2. WEAK COVERAGE
- Topics mentioned but not detailed
- Surface-level treatment
- Need deeper explanation
3. OUTDATED INFORMATION
- Old statistics
- Deprecated tools/methods
- 2025 vs 2026 changes
4. MISSING PERSPECTIVES
- Beginner vs advanced
- Different use cases
- Various industries/niches
5. FORMAT GAPS
- Missing visuals
- No examples
- Lack of actionable steps
- Missing comparisons
6. OPPORTUNITIES
- How to differentiate
- What to do better
- Unique value to add
Return as JSON with specific recommendations.
"""
response = self.client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
def create_content_outline(self, primary_keyword: str, keywords: dict,
intent: dict, competitors: dict, gaps: dict):
"""Create SEO-optimized content outline."""
print("📋 Creating content outline...")
prompt = f"""
Create comprehensive content outline for: {primary_keyword}
KEYWORDS TO TARGET:
{json.dumps(keywords, indent=2)[0:1000]}
SEARCH INTENT:
{json.dumps(intent, indent=2)[0:500]}
COMPETITOR PATTERNS:
{json.dumps(competitors, indent=2)[0:1000]}
CONTENT GAPS TO FILL:
{json.dumps(gaps, indent=2)[0:1000]}
Create detailed outline:
1. TITLE OPTIONS (3-5)
- Include primary keyword
- Match search intent
- Compelling and clickable
- 50-60 characters
2. META DESCRIPTION
- 150-160 characters
- Include primary keyword
- Compelling value proposition
- Call to action
3. INTRODUCTION (200-300 words)
- Hook addressing pain point
- What reader will learn
- Why it matters
- Include primary keyword naturally
4. MAIN CONTENT SECTIONS
- 5-8 major H2 sections
- Each with 2-4 H3 subsections
- Logical flow
- Natural keyword placement
- Specific word count targets per section
5. CONCLUSION (150-200 words)
- Summary of key points
- Action steps
- CTA
6. ADDITIONAL ELEMENTS
- FAQ section (8-10 questions)
- Tables/comparisons needed
- Images/screenshots needed
- Code examples if applicable
For each section specify:
- Section title (H2 or H3)
- Key points to cover
- Keywords to include
- Word count target
- Examples/data needed
Total target: 2500-3500 words
Return detailed outline as JSON.
"""
response = self.client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
def create_optimization_guidelines(self, keywords: dict, competitors: dict):
"""Create SEO optimization checklist."""
guidelines = {
'on_page_seo': {
'title_tag': f"Include '{keywords.get('primary_keyword', 'keyword')}' near beginning",
'meta_description': 'Include primary keyword and compelling CTA',
'url_slug': 'Short, keyword-rich, hyphenated',
'h1': 'Match or closely align with title tag',
'headings': 'Use H2-H6 hierarchically, include keywords naturally',
'keyword_density': '1-2% for primary keyword (natural use)',
'keyword_placement': 'First 100 words, conclusion, headings',
'lsi_keywords': 'Sprinkle 8-10 LSI terms throughout',
'internal_links': '3-5 to relevant content',
'external_links': '2-3 to authoritative sources',
'image_optimization': 'Alt text with keywords, compressed files',
'content_length': competitors.get('content_type', {}).get('word_count', '2500-3500 words')
},
'content_quality': {
'original_research': 'Add unique data/insights',
'examples': 'Include 3-5 specific examples',
'visuals': 'Add screenshots, diagrams, or infographics',
'depth': 'More comprehensive than top 10',
'readability': 'Grade 8 reading level, short paragraphs',
'structure': 'Scannable with bullets, bold, subheadings'
},
'user_experience': {
'mobile_friendly': 'Responsive design',
'page_speed': 'Optimize images, minimize scripts',
'readability': 'Short paragraphs, white space',
'navigation': 'Table of contents for long content',
'cta': 'Clear next steps'
},
'engagement_signals': {
'hook': 'Compelling first 2 paragraphs',
'formatting': 'Easy to scan and read',
'multimedia': 'Videos, images, interactive elements',
'social_proof': 'Stats, testimonials, case studies',
'actionability': 'Practical, implementable advice'
}
}
return guidelines
def format_complete_brief(self, **components):
"""Format everything into complete brief."""
brief = f"""
# SEO CONTENT BRIEF
## Target Keyword
**Primary:** {components['primary_keyword']}
## Keyword Strategy
### Primary Keyword
{json.dumps(components['keywords'].get('primary_keyword', {}), indent=2)}
### Secondary Keywords
### Long-Tail Keywords
### LSI Keywords
## Search Intent Analysis
**Primary Intent:** {components['intent'].get('primary_intent', 'Not specified')}
**User Journey Stage:** {components['intent'].get('user_journey_stage', 'Not specified')}
**Content Expectations:** {components['intent'].get('content_expectations', 'Not specified')}
## Competitor Analysis
**Top 10 Patterns:**
{json.dumps(components['competitors'].get('content_type', {}), indent=2)}
**Common Sections:**
**Weaknesses to Exploit:**
## Content Gaps to Fill
## Content Outline
## Optimization Guidelines
### On-Page SEO
### Content Quality
### User Experience
### Engagement Signals
## Success Metrics
- **Target Position:** Top 5 within 3-6 months
- **Target Traffic:** Estimated based on keyword volume
- **Engagement Goal:** 3+ min average time on page
- **Conversion Goal:** Define based on CTA
## Additional Notes
- Publish date: {components.get('publish_date', '2026-03-08')}
- Last update check: Every 6 months
- Competitor monitoring: Monthly
- Content refresh: Based on performance
---
**Brief Created:** {components.get('created_at', '2026-03-08')}
**Writer:** [Assign]
**Editor:** [Assign]
**Target Publish:** [Set date]
"""
return brief
def _format_keyword_list(self, keywords: List):
"""Format keyword list for display."""
output = ""
for kw in keywords[0:10]:
if isinstance(kw, dict):
output += f"- {kw.get('keyword', 'N/A')} (Volume: {kw.get('volume', 'N/A')}, Competition: {kw.get('competition', 'N/A')})\n"
else:
output += f"- {kw}\n"
return output
def _format_guidelines(self, guidelines: dict):
"""Format guidelines for display."""
output = ""
for key, value in guidelines.items():
output += f"- **{key.replace('_', ' ').title()}:** {value}\n"
return output
# Usage
generator = SEOBriefGenerator()
# Create comprehensive SEO brief
brief = generator.create_seo_brief(
primary_keyword="AI content automation tools"
)
# Save to file
with open('seo-brief-ai-content-automation.md', 'w') as f:
f.write(brief)
print("SEO brief saved!")
Batch Brief Creation
Create briefs for entire content calendar:
class BatchBriefGenerator:
"""Generate multiple SEO briefs efficiently."""
def __init__(self):
self.generator = SEOBriefGenerator()
def create_content_calendar_briefs(self, keywords: List[str]):
"""Create briefs for list of keywords."""
print(f"📅 Creating {len(keywords)} SEO briefs...\n")
briefs = []
for i, keyword in enumerate(keywords, 1):
print(f"[{i}/{len(keywords)}] {keyword}")
try:
brief = self.generator.create_seo_brief(keyword)
briefs.append({
'keyword': keyword,
'brief': brief,
'status': 'ready'
})
# Save individual brief
filename = keyword.lower().replace(' ', '-')
with open(f'briefs/{filename}-brief.md', 'w') as f:
f.write(brief)
print(f"✅ Saved\n")
except Exception as e:
print(f"❌ Failed: {e}\n")
briefs.append({
'keyword': keyword,
'brief': None,
'status': 'failed'
})
print(f"🎉 Created {len([b for b in briefs if b['status'] == 'ready'])} briefs")
return briefs
# Use for whole calendar
batch = BatchBriefGenerator()
keywords = [
"AI content creation tools",
"best AI writing software 2026",
"how to automate social media",
"AI for SEO optimization",
"content automation workflow"
]
briefs = batch.create_content_calendar_briefs(keywords)
Tools & Costs
SEO brief creation stack:
- [AFFILIATE: ChatGPT Plus]: $20/month - Brief generation
- Google Search Console: Free - Performance data
- Ahrefs/Semrush: $99-129/month - Advanced keyword data (optional)
- Google Trends: Free - Trend validation
Total: $20-149/month
Minimum: $20/month (ChatGPT Plus only)
Time saved:
- Manual: 2-3 hours per brief
- AI-assisted: 8-10 minutes per brief
- Savings: 95%
My Results
Before AI briefs:
- Time per brief: 2-3 hours
- Briefs per week: 2-3
- Quality: Good but rushed
- Writer accuracy: 70% (often missed keywords)
After AI briefs:
- Time per brief: 8-10 minutes
- Briefs per week: 15-20
- Quality: Comprehensive and data-driven
- Writer accuracy: 95% (clear guidelines)
Impact: 95% faster, 6-8x more briefs, better content performance.
Getting Started
This week:
- Create first SEO brief with AI
- Test with writer, refine template
- Create 3 more briefs
- Refine based on feedback
Next month:
- Brief every piece of content before writing
Common Mistakes
- Skipping competitor analysis - Must analyze top 10.
- Ignoring search intent - Intent matters more than keywords.
- Generic briefs - Be specific, include examples, clear word counts and structure.
- No keyword prioritization - Not all keywords equal, focus on high-priority.
The Bottom Line
Good content starts with good briefs. Manual SEO briefs: 2-3 hours each, limited output. AI automates the research: Keyword clustering, competitor analysis, intent mapping, gap identification, outline creation, optimization guidelines. Results: 8-10 minutes vs 2-3 hours, 95% time savings, 6-8x more briefs, better content performance.
Create briefs in minutes. Write better, rank faster.
