The SEO gap analysis playbook: how to find the exact posts your competitor is winning with (as of July 2026)
TL;DR
SEO gap analysis finds the posts your competitors rank for and you don't. Here's the exact 5-step playbook: pick 5 competitors, index both sides, diff the topic clusters, score gaps by volume × rank × authority. 45 minutes manual for 5 competitors, 8 minutes with CiteClip.
SEO gap analysis is the single highest-leverage SEO task a solo founder can run. Not keyword research, not link building, not meta description tweaks. Gap analysis. It answers one question: which specific topics are my direct competitors ranking for that I have no content on? Every downstream SEO decision gets easier once you have that answer. As of July 2026 we've run this exact 5-step playbook on bulkurlchecker.com, tourkit.us, and raices.rd. The output is a scored list of 10-20 topics you can draft an article against by tomorrow morning. 45 minutes manual if you're patient with a spreadsheet, 8 minutes automated. Both paths are documented below. If you want the framework for what to do with those topics once you have them, our solo-saas-seo-five-page-framework post is the companion piece.
Step 1 — Pick 5 direct competitors, not 20
The instinct is to list every SaaS in your category. Resist it. Five direct competitors is the sweet spot — enough to see real patterns, few enough that indexing finishes in under 10 minutes. Twenty competitors gives you a mush of half-relevant topics and quadruples the work. Direct means: they solve the same job for the same buyer. Adjacency is not competition. If you sell a bulk URL checker, BrokenLinkCheck and Dr. Link Check are direct. Ahrefs is not — Ahrefs solves 40 jobs and one of them touches yours. Topic overlap will be noisy and you'll waste hours filtering. Pick criteria: (1) same primary use case, (2) same buyer persona, (3) they've published at least 20 blog posts, (4) their homepage ranks in the top 20 for your head-term. If a competitor has 3 blog posts, they're not producing content — nothing to gap-analyze. For bulkurlchecker the five were BrokenLinkCheck, HEADMasterSEO, Dr. Link Check, WhereGoes, and Sitechecker. All direct, all publishing 2+ posts a month. Write your 5 domains into cell A2:A6 of a spreadsheet before you touch step 2. Every downstream calculation depends on that list being clean. If you can't name 5 direct competitors, you have a positioning problem, not an SEO problem — go fix that first.
Step 2 — Index their content
For each competitor, fetch the sitemap. It lives at /sitemap.xml on ~95% of SaaS sites. If it doesn't, try /sitemap_index.xml or check /robots.txt (the sitemap location is usually declared there). WordPress, Ghost, Next.js, and Astro all expose sitemaps by default when configured correctly. Extract every URL matching /blog/*, /posts/*, /articles/*, or /guides/*. That's your candidate set. For most SaaS blogs you'll pull 30-150 URLs per competitor. Now group by topic. The lazy version: paste all URL slugs into a spreadsheet column, eyeball them, cluster into 8-15 topic buckets. The rigorous version: hit each URL, extract the H1 plus first paragraph, run k-means on the embeddings. CiteClip does the rigorous version automatically. The eyeball version is 80% as good in 15 minutes. Topic buckets for the bulkurlchecker competitors: bulk URL scanning, redirect chain audits, sitemap crawling, HTTPS migration, technical SEO audits, link-building outreach, broken link recovery, indexing troubleshooting. Eight topical buckets across five competitors is typical. As of July 2026 the SaaS competitor sitemaps we've indexed average 41 blog URLs — the busiest was 214, the quietest was 12. Note next to each bucket: how many URLs contribute, and which competitor dominates it. Dominance matters for step 5.
Step 3 — Index your own content the same way
Same process, applied to yourself. Fetch your own sitemap. Extract your blog and evergreen page URLs. Group them into the same topical buckets you built in step 2. Do not invent new buckets for your own content — use the competitor bucket list as the vocabulary, even if some of your posts don't fit anywhere. The unfittable posts are useful information; they mean you're publishing on topics your competitors ignore, which is either brilliant differentiation or drift. For bulkurlchecker's own 25 indexed URLs, the topical map was: bulk URL scanning (12 URLs, dominant), redirect chain audits (2 URLs, thin), sitemap crawling (0 URLs), HTTPS migration (0 URLs), technical SEO audits (1 URL), link-building outreach (0 URLs), broken link recovery (3 URLs), indexing troubleshooting (0 URLs). That map is the gap. Five of eight buckets: zero coverage. Two more: fewer than three posts. If you're a very new SaaS with fewer than 10 blog URLs, your own indexing takes 5 minutes and the gap is 'nearly everything'. That's fine — the point isn't to find one gap; it's to prioritize which of the 8 buckets to attack first. See step 5. Skip this step and you'll draft articles on topics you already cover. That's the single most common mistake we see solo founders make with AI writers.
Step 4 — Diff the topic clusters
You now have two topical maps: theirs (5 competitors × 8 buckets) and yours (1 site × 8 buckets). Diff them at the bucket level first, then at the URL level. Bucket-level diff: which buckets have >5 competitor URLs and 0-2 yours? Those are your priority buckets. For bulkurlchecker the priorities were sitemap crawling (14 competitor URLs, 0 yours), redirect chain audits (11 competitor URLs, 2 yours), and HTTPS migration (9 competitor URLs, 0 yours). Three high-leverage clusters, immediately actionable. URL-level diff: within each priority bucket, list the specific competitor URLs. Look for repeated topics — if 3 of 5 competitors have a 'redirect chain checker' post, that topic has confirmed search demand. If only 1 competitor has it, treat it as speculative. Deduplicate synonyms. 'Bulk redirect checker' and 'redirect chain audit tool' are the same buyer intent. Merge them into one target topic. As of July 2026 our clustering finds that ~30% of surface-different topics collapse into ~15 real ones once you deduplicate. The output of step 4 is a raw target list — usually 15-25 topics per 5 competitors. That's still too many to write against. Step 5 prioritizes.
Step 5 — Score gaps by volume × rank × authority
Rank each target topic on three dimensions. Score 1-5 on each. Multiply. (1) Search volume signal. Free proxies: number of competitors ranking for the topic (3+ = high demand), Google 'People Also Ask' presence (yes = high), Perplexity giving a substantive answer (yes = high). Do not use Google Keyword Planner without a paid Ads account — it withholds real numbers from free users. As of July 2026 the Ahrefs free traffic checker and Google Trends are the two best free proxies. (2) Competitor rank strength. If the top-ranking competitor URL is on page 1, score low — that URL has authority you're not overtaking easily. If competitors are on page 2-3, score high — those pages are beatable. Check with a private-window search from a cold browser session. (3) Your existing authority. Do you already have any URL ranking anywhere in the top 100 for the target topic? If yes, score 5 — an existing weak-ranking URL is much cheaper to upgrade than a new URL is to launch. If nothing exists, score 3. If you've never touched the topic, score 1. Multiply the three. Sort descending. Your top 5 targets are the ones you draft first. Everything below rank 10 goes into a backlog.
The manual version — spreadsheet + Ahrefs free tools
The full manual playbook, timed on a fresh workspace: Minute 0-5: list 5 competitors in column A. Minutes 5-15: fetch each sitemap, filter to blog URLs, paste into columns B-F. Minutes 15-25: read the slugs, eyeball-cluster into topic buckets in column G. Minutes 25-30: repeat for your own site in a second sheet. Minutes 30-35: diff at the bucket level, list target topics in column H. Minutes 35-45: score each topic on the 3-dimension rubric using Ahrefs' free traffic checker and Google Trends for volume proxies, private-window Google searches for rank checks. Total: 45 minutes if you don't get distracted, for 5 competitors. Add ~10 minutes per additional competitor above 5. Tools you actually need: one spreadsheet (Google Sheets or Excel), one browser with private windows, Ahrefs' free traffic checker at ahrefs.com/traffic-checker, Google Trends, and a text editor to hold the target topic list. Zero paid subscriptions. The 45-minute version misses two things the automated version catches: (1) topics competitors publish that never made it to their sitemap (RSS-only or blog-index-only URLs), and (2) topical drift over time — a topic a competitor started publishing 30 days ago that hasn't shown up in your sitemap-based crawl yet. If you're doing this monthly, the manual version is fine. If you're doing it weekly, the deltas start to matter.
The CiteClip version — 8 minutes, continuous
Same playbook, automated. During onboarding, CiteClip asks for your domain and auto-discovers your 5 direct competitors from public data (usually 90 seconds; see the how-we-drafted-and-published-first-seo-article-in-30-minutes case study for the actual run on bulkurlchecker). It then crawls each competitor's sitemap and RSS feed, extracts the last 50 blog posts, embeds each with text-embedding-3-large, and clusters them into topic buckets automatically. Your own site gets the same treatment. The diff runs continuously — every time a competitor publishes a new post, the topic map updates and the gap re-scores. Search volume, rank strength, and authority scores are calculated from live Google + Perplexity signals. The output surface: a ranked list of 10-20 target topics with scores, updated within 24 hours of any competitor publish. Each target links to a draft-article action that produces a 1,500-2,000 word SEO + GEO-optimized MDX file with TL;DR, FAQ, and JSON-LD schema baked in. Total elapsed time from workspace creation to a ranked gap list: 8 minutes, most of which is the discovery + first-crawl pipeline running. Then it runs forever without you touching it. As of July 2026 the CiteClip pipeline monitors an average of 4.2 competitors per active workspace and refreshes the gap list on median every 41 hours. The delta between manual and automated compounds every week.
The math on when automation pays off — and what to do this week
45 minutes manual, 8 minutes automated. Once a month, the manual version is cheaper — 45 minutes × 12 months = 9 hours a year, worth less than any paid SEO tool. Weekly, the automation flips: 45 minutes × 52 = 39 hours a year, and by month three you're spending more time on gap analysis than on writing articles. That's the point where solo founders stop doing gap analysis and start guessing at topics — the exact failure mode this playbook exists to prevent. Freshness is the second reason. Manual gap analysis is a snapshot. Competitors publish, your rank moves, SERPs shift. A gap list from 30 days ago is already stale on 2-3 targets. Continuous re-scoring keeps the ranked list current. Coverage is the third: manual crawling catches the topics a competitor still has live, but it misses deleted URLs, RSS-only content, and their drafts queued for next week. Continuous monitoring catches all three. Rule of thumb: 1-2 posts a month, use the manual playbook above. 4+ posts a month, automate. Multiple products, automate immediately. This week: pick your 5 direct competitors right now. If you can't name them off the top of your head, you're not ready to do gap analysis — go do positioning work first (the solo-saas-seo-five-page-framework post covers what to publish once you know your competitors). If you can name them, run the manual playbook in 45 minutes and you'll have a target list by end of day. If you'd rather have the automated version — continuous monitoring, embedding-based clustering, and AI-drafted articles against each identified gap — sign up at citeclip.com. First 4 articles are free, no credit card required. Compare the output against your gut. If the ranked list matches what you'd have picked manually, keep drafting. If it doesn't, email us — that's the exact feedback loop we need.