Date: December 7, 2025
Status:
- Hyper-niche variations - Added before scoring ✅
- Volume lookup timing - Happens after final limit (efficient) ✅
- Error handling - Most steps have try/catch ✅
- Deduplication - Multiple passes catch duplicates ✅
- Parallel processing - AI generation batches run in parallel ✅
Issue:
- Gap keywords use
aeo_scorefrom SE Ranking as theirscore - Scoring function skips gap_analysis keywords (line 1056)
aeo_score≠ company-fit score
Code:
# Line 373: Gap keywords get aeo_score as score
"score": gap.get("aeo_score", 50),
# Line 1056: Scoring function skips gap keywords
ai_keywords = [kw for kw in keywords if kw.get("source") != "gap_analysis"]Impact:
- Gap keywords might not reflect company-fit accurately
aeo_scoreis based on volume/difficulty, not company relevance
Fix:
- Option A: Score gap keywords too (recommended)
- Option B: Rename
aeo_score→gap_scoreand keep separate from company-fitscore
Issue:
- Bonus keywords from PAA added AFTER scoring step
- Hardcoded score of 60 (line 273)
- Not scored for company-fit
Code:
# Line 270-276: Bonus keywords added after scoring
bonus_kw_dicts = [
{"keyword": kw, "intent": "question" if "?" in kw else "informational",
"score": 60, "source": "serp_paa", "is_question": "?" in kw}
for kw in bonus_keywords[:config.target_count // 4]
]
all_keywords.extend(bonus_kw_dicts)Impact:
- Bonus keywords might not be relevant to company
- Score of 60 might be too low/high depending on relevance
- Could filter out good keywords or include bad ones
Fix:
- Score bonus keywords properly before adding them
- Or add them before scoring step
Status: ✅ NOT AN ISSUE (False alarm)
Reality:
- SERP analysis happens AFTER clustering
- Final limit happens AFTER SERP analysis (line 281)
- So we analyze keywords that will be in final result
Why it's OK:
- We want SERP data for final keywords
- Analyzing before limit ensures we have data for top keywords
- Only analyzes top 15 anyway (configurable)
Verdict: ✅ Working as intended
Status:
Reality:
- Code exists (
GoogleTrendsAnalyzer,AutocompleteAnalyzer) - But not called in main pipeline
Impact:
- Missing trending keyword detection
- Missing autocomplete suggestions
- Missing seasonality data
Fix:
- Add as optional steps in pipeline
- Integrate after research, before gap analysis
Status: ✅ INTENTIONAL (not an issue)
Reality:
- Fast dedup after research/gap/AI (Step 3)
- Fast dedup after hyper-niche (Step 3.5)
- Semantic dedup after scoring (Step 5)
- Fast dedup after bonus keywords (Step 8)
Why it's OK:
- Each step adds new keywords
- Need to dedupe after each addition
- Fast dedup is O(n) - very fast
- Semantic dedup catches near-duplicates
Verdict: ✅ Good design
Current:
# Bonus keywords added after scoring with hardcoded score
bonus_kw_dicts = [{"score": 60, ...}]
all_keywords.extend(bonus_kw_dicts)Fix:
# Option A: Score bonus keywords before adding
if bonus_keywords:
bonus_kw_dicts = [
{"keyword": kw, "intent": "question" if "?" in kw else "informational",
"score": 0, "source": "serp_paa", "is_question": "?" in kw}
for kw in bonus_keywords[:config.target_count // 4]
]
all_keywords.extend(bonus_kw_dicts)
# Score them properly
all_keywords = await self._score_keywords(all_keywords, company_info)OR:
# Option B: Add bonus keywords BEFORE scoring step
# Move bonus keyword extraction to before Step 4 (scoring)Current:
# Gap keywords use aeo_score as score
"score": gap.get("aeo_score", 50),
# Scoring function skips them
ai_keywords = [kw for kw in keywords if kw.get("source") != "gap_analysis"]Fix:
# Option A: Score gap keywords too
# Remove the filter, score all keywords
# Option B: Keep separate scores
# Rename aeo_score → gap_score, keep score for company-fitRecommendation: Option A - Score gap keywords for company-fit too
Add as optional steps:
# Step 1.5: Google Trends (if enabled)
if config.enable_trends:
trend_data = await trends_analyzer.analyze_keywords(keywords)
# Enrich keywords with trend data
# Step 0.5: Autocomplete (if enabled)
if config.enable_autocomplete:
autocomplete_keywords = await autocomplete_analyzer.get_suggestions(seed)
all_keywords.extend(autocomplete_keywords)| Issue | Priority | Status | Impact |
|---|---|---|---|
| Bonus keywords scoring | HIGH | Keywords might not be relevant | |
| Gap analysis scoring | MEDIUM | Scores might not reflect company-fit | |
| SERP timing | LOW | ✅ OK | Working as intended |
| Google Trends missing | LOW | Missing trending keywords | |
| Multiple dedup | LOW | ✅ OK | Good design |
Pipeline is mostly solid with 2 issues to fix:
- Bonus keywords need proper scoring (HIGH priority)
- Gap keywords should get company-fit scores (MEDIUM priority)
Everything else is working as intended!
- ✅ Fix bonus keywords scoring (add before scoring or score after adding)
- ✅ Fix gap analysis scoring (score gap keywords too)
⚠️ Consider integrating Google Trends/Autocomplete (optional)