In short: A content-gap analysis finds every page a competitor ranks for that you don't, then splits the result across four teams. Pull competitor keywords and landing pages with DataForSEO for a few dollars, let an LLM match their pages to yours, and the unmatched rows become SEO fixes, assortment-expansion ideas, paid campaigns and content. One real run for a Czech online shop returned 1,996 missing pages with 1,520,840 monthly searches behind them.
Last month I ran this analysis for a Czech online shop in the kids’ segment. Five competitor domains went in. The pipeline pulled every keyword those domains rank for, collapsed the keywords into pages, and an LLM matched each competitor page against the client’s site overnight. I read the result the next morning over coffee.
1,996 pages the competitors cover and the client doesn’t. Behind those missing pages, 1,520,840 searches a month.
Not keywords. Pages. 1,847 of them are commercial, category pages the shop could start building next week. The other 149 are content topics the competitors use to catch parents long before anyone types a product name. The API bill for the whole pull was a few dollars.
In twenty years of PPC I’ve pitched this exact analysis many times and mostly watched clients decline it, and I never blamed them. Before LLMs, the honest quote started at 20 to 30 hours of senior time just to stitch the keyword exports together, one CSV per competitor per tool, and then up to another 50 hours to clean the result and map it onto the site as it actually stands today. Nobody signs that off for a maybe. The same job now takes me 2 to 5 hours. What’s left is deciding what each gap means, and that’s the part worth reading for. Here’s the whole play, with that run’s real numbers throughout.
The whole play in one sentence
Find the pages your competitors rank for that you don’t even have in your portfolio, then turn that list into work for four teams. More SEO visibility, search campaigns aimed at landing pages you were missing, assortment ideas with the demand already proven, and content that feeds a remarketing list. One map, four payoffs. Everything below is how you get there.
Every SEO deck has the slide that tells you to do this. Analyze the competition, find the gaps in your content and categories. Almost nobody follows it, because the old way was a grind. Export a competitor’s keywords, eyeball which landing pages they led to, line them up against your sitemap by hand, and argue about matches in a spreadsheet for a week. So the slide stayed a slide.
Two things changed. Pulling the data stopped being expensive, because DataForSEO does for cents what Semrush does for a monthly subscription. And the matching stopped being manual. An LLM pairs a competitor’s pages against yours in minutes, and it doesn’t need to be perfect to be useful.
What’s left is the part that was always the real value, and it was never really an SEO task. A content gap is a missing category page, a product line you don’t stock, a blog that feeds a remarketing list. It touches SEO, paid, assortment and content strategy at once.
The analysis in one box
- What we're after Every page a competitor ranks for that you don't
- Tools DataForSEO API · any LLM · a site crawler
- Cost A few dollars of API credit, no subscription
- What you get A ranked gap map for SEO, paid, assortment and content
One run, five competitors, 1,996 gaps
Before the mechanics, the result. The client sells kids’ goods on a competitive Czech market, and five rival domains made the shortlist. The pipeline matched 651 of their strongest pages, carrying 10,110 ranked keywords, against the client’s own site map. Every cluster of demand with no equivalent page on the client’s side became a gap, and each gap is a page the client could build, with the search volume behind it already measured.
What the run returned
- Gap pages (they cover it, the client doesn't) 1,996
- Commercial gaps, a landing page is missing 1,847
- Content gaps, a topic is missing 149
- Monthly searches behind the gaps 1,520,840
- Evidence base 10,110 keywords · 651 competitor pages · 5 domains
And the gaps aren’t random. Seven patterns cover all but three of the 1,996 rows, and one pattern dominates everything else:
Category synonyms are the finding. The client already sells those products. The competitors simply give the shelf its own landing page under the name shoppers actually type, while the client folds the same products into one broader listing. Demand you serve without a page named the way people search is demand you’re invisible for. And each of those 1,640 rows is a cheap fix, because it needs no new product, no new supplier and no new content. Just a page.
The rest of the commercial side slices categories a different way. A category crossed with a theme, say an age band or an occasion. A brand’s line standing on its own page. A category filtered by a material or a feature. The content side mirrors it with topic clusters, licensed-character hubs and how-to guides that competitors rank for while the client has never written a line.
The gap map, up close
Every row of the deliverable reads the same way: what the competitor has, whether we have it, and which team the fix lands on. Here is one row per pattern, with the category names generalized so the client stays anonymous (the counts above are the real ones):
| Competitor page | On our side | Pattern | Lands on |
|---|---|---|---|
| Main category page | ✓ match | No gap | Nothing to do |
| The category under the synonym shoppers actually type | ✗ folded into a broader listing | Category synonym | SEO + paid |
| The category sliced by age band | ✗ | Category × theme | SEO + paid |
| A seasonal gift-guide cluster | ✗ | Content topic | Content + ads |
| A brand's line on its own page | ✗ | Category × brand | Assortment + SEO |
| The category filtered by material | ✗ | Category × attribute | Web structure |
| A hub around a licensed character | ✗ | Content franchise | Content + assortment |
| A how-to guide on choosing the right size | ✗ | Content how-to | Content + remarketing |
The ✓ rows fall away; the ✗ rows are the deliverable.
What does a gap row look like with the numbers on? Here’s an illustrative example, an invented demo domain and rounded figures, not the client’s data, so you can see the shape without me exposing anyone:
| Competitor page (demo) | Keywords ranking | Monthly searches | Est. competitor traffic | We stock it? |
|---|---|---|---|---|
| toydemo.example/montessori-toys | 112 | 38,200 | 9,800 | ✓ |
| toydemo.example/wooden-toys | 84 | 22,400 | 6,100 | ✓ |
| toydemo.example/balance-bikes | 57 | 14,900 | 4,300 | ✓ |
| toydemo.example/kids-carnival-costumes | 41 | 9,700 | 2,600 | ✗ |
Each row answers the two questions a prioritization meeting actually needs. How much demand sits behind this page, and can we serve it with today’s assortment. A ✓ with high demand is a landing page to build next sprint; a ✗ with high demand is a conversation with purchasing before anyone touches the website.
And under every row sits the cluster. Expand the montessori row and you see the queries that one competitor page collects:
| Keyword in the cluster | Monthly searches |
|---|---|
| montessori toys | 18,100 |
| montessori toys for 1 year old | 5,400 |
| wooden montessori toys | 4,900 |
| montessori sensory toys | 3,800 |
| montessori baby toys | 3,300 |
| best montessori toys for toddlers | 2,700 |
Those six queries are one circle of demand, so they get one page. One cluster, one landing page, one row in the gap map. Build that page and the full 38,200 monthly searches behind the row open up at once, which is why the map counts pages rather than keywords.
And the deliverable itself isn’t a slide deck. The client got an Excel file for the humans, a README, and underneath both an indexed SQLite database with five tables. Their own Claude connects to that database and queries it directly, so “which content gaps carry the most searches” is a question they type straight into the data instead of a request they send me and wait a day for. A deliverable an AI can query outlives any presentation of it.
The flow, end to end
Identify the real competitors, three ways
Skip who you think competes and look at who actually shows up where your money is. Use three signals together. One, run your most important search queries through DataForSEO and note who appears in paid and organic. Two, read Auction Insights in Google Ads; auction overlap tells you how close a rival really is. Three, pull keyword-overlap data, where the number of queries you share with a domain is a clean proxy for relatedness. Three lists collapse into one shortlist. Get this step wrong and every later step inherits the mistake, because you’d be mapping your gaps against a rival who was never competing for your money.
Pull the competitor's keywords and landing pages
For each competitor, pull their top organic keywords, up to about 100k per domain, and, critically, which landing page each keyword ranks with. From position and search volume you can estimate the traffic flowing into each of their pages. A keyword is an abstraction; a page is something you can copy, rebuild, or point a campaign at. So collapse the keyword list into a map of competitor pages with the keywords feeding them and the estimated traffic attached. One thing to get straight here, because it shapes everything downstream. You are not pairing individual keywords with individual pages. A single competitor category page typically ranks for dozens of related queries, and that whole group describes one circle of what users are asking for. The page is the cluster. On the kids’ run, five domains boiled down to 651 pages worth matching, carrying 10,110 keywords, roughly fifteen queries riding on each page.
Map your own site
You need the mirror image of your own pages, and it has to be complete, or you’ll chase “gaps” that are really just pages your inventory forgot to list. Crawl the site (Screaming Frog, or a throwaway Python crawler an LLM writes in five minutes), export categories from the shop platform, read the product feed, parse the XML sitemap. Usually it takes a combination. One warning from experience. Never trust the sitemap alone. It routinely misses parametric pages, filtered category views and the blog, exactly the surfaces a gap analysis cares about.
Let AI match their pages to yours
This is the step that used to take a week. Hand both inventories to an LLM, an open-source model is fine, and have it pair each cluster of competitor demand with your closest equivalent page. The matching runs at the page level, never at the keyword level. The LLM asks whether your site has a page serving the same circle of demand as the competitor’s, not whether you own a page with the same name. And when a cluster finds no home on your side, the fix is one landing page built for the whole cluster, not one page per keyword in it. You do not need 100 % accuracy; you need the unmatched rows. On the kids’ run the unmatched demand condensed into 1,996 pages with no equivalent on the client’s side. That list is the prize.
Decide what each gap means, because this is where it stops being SEO
A gap isn’t one thing. Products you already sell but never gave a proper page get a landing-page fix. Products you don’t stock but your supplier carries become an assortment shortlist with demand attached. A competitor’s strong non-commercial content becomes a content brief and a remarketing audience in one. On the kids’ run the split came out 1,847 commercial gaps to 149 content ones, and each bucket lands on a different team with a different budget.
The match doesn’t have to be perfect. People stall here waiting for 100 % precision. You don’t need it. A few mislabeled pairs cost you nothing; the value is in the clearly unmatched competitor pages, and those survive a noisy match just fine. Ship the analysis at 90 % and act on it, rather than polishing a model that was only ever a means to a shortlist.
Semrush vs. DataForSEO: why the price gap matters
The reason this analysis went from “we should” to “we did” is cost, and the Semrush number that matters here is higher than the sticker price people quote. The $139.95/mo Pro plan runs a content-gap check in the interface, by hand, with export caps. The analysis in this article is programmatic. One API call per competitor domain returns up to ~100k ranked keywords with the landing page each one hits. Semrush gates that API behind the Business plan at $499.95/mo, and even then you start with zero API units; you buy those separately, roughly $50 per million units, on top of the subscription. DataForSEO is pay-as-you-go. A $50 top-up lasts months, there is no seat to rent, and the whole five-domain run above fit into a few dollars of it.
| Semrush | DataForSEO | |
|---|---|---|
| Pricing model | Flat subscription; API billed on top | Pay-as-you-go credit |
| UI entry plan | $139.95/mo (Pro), recurring, export-capped | No seat needed; API only |
| Programmatic / API access | Business $499.95/mo + API units bought separately | Included, you just pay per call |
| Organic SERP, per 1,000 queries | Bundled into the seat | $0.60 (Regular) – $3.50 (Advanced, live) |
| One off-season gap analysis | A Business month + units, recurring | A few dollars of credit |
For a one-off, deeply technical job like a content-gap pull, that’s the difference between unlocking a $500/mo API tier and spending a coffee’s worth of credit. The data quality is there for this use case; the economics aren’t close.
Two stories from twenty years of doing this
The mechanics are new. The plays they unlock are ones I’ve watched work for two decades; they were just too laborious to set up before. And the 149 content gaps in the kids’ run are both of these stories waiting to happen again.
The children’s blog that became a sales channel
A client in the kids’ segment was getting beaten on a class of queries that had nothing to do with products. The competitor ran a strong blog full of coloring pages and bedtime stories, with enormous search volume aimed at exactly the target audience, parents. The gap analysis surfaced the whole cluster. The client adopted the strategy, built the content, pulled the traffic, dropped those visitors into remarketing, and turned a “non-commercial” content gap into purchases. (Anonymized.)
Recipes for a diet that sells meal boxes
A meal-prep and coaching business sat next to a category with two beautiful properties. Recipe queries have extreme search volume, and their clicks cost cents. The strategic competitors had built structured recipe sections and harvested a stream of people who, by definition, wanted to eat better. From there it’s a short step to a product or a coaching offer. The gap analysis is what made the opportunity visible and sized it. (Anonymized.)
The twist nobody runs: borrow from a stronger market
Here’s the angle that turns this from a defensive audit into an unfair advantage.
Say you’re the leader in a small market with no serious competition to learn from. The gap analysis at home returns nothing useful; there’s no one ahead of you to copy. So don’t run it at home. Run the exact same analysis against the strongest, most competitive foreign market in your category.
Language isn’t a barrier. The LLM maps their categories and content onto yours regardless of the language they’re written in. You import the strategies the leaders of a mature market have already proven, category structures, content angles, assortment ideas, into a market where literally nobody is doing them yet. You become the first mover at home by copying the future from abroad. It pairs naturally with a full market-expansion analysis when you’re deciding where that stronger market is.
Why this closes the loop
Notice what happened on the kids’ run. We started with a tidy SEO task, find content gaps, and the result spilled into assortment decisions, paid campaigns, remarketing audiences and content strategy. That’s not scope creep. That’s the actual shape of the work.
The data was always pullable; nobody bothered, because the manual cost outweighed the payoff. Now the pull costs a few dollars and the matching runs overnight. What’s left as the scarce ingredient is the thing that was always scarce, the idea. The seniority to look at a gap map and know that a competitor’s coloring-page blog is really a remarketing channel, and the range to connect SEO, paid and assortment in one head.
The execution got easy. The judgment is the job.
Get the complete gap-analysis instructions for your AI
The whole play above, written up as a step-by-step brief you can paste straight into Claude or any capable coding agent, including the page-matching prompt and the DataForSEO calls. You supply the competitor list and the API credit; it builds the gap map for your site. Leave your email and the file is yours.
One file, one list. I only write when there's something worth reading.
FAQ
Do I really not need 100 % matching accuracy?
Right. You’re hunting the competitor pages with no equivalent on your side, the unmatched rows. A handful of mislabeled pairs doesn’t move that shortlist. Demanding perfection here just delays acting on a list that was already good enough.
Why DataForSEO instead of Semrush?
Cost structure, and which door the API is behind. Semrush’s content-gap tools live in the UI on the $139.95/mo Pro plan; the programmatic pull this article uses needs the Business plan at $499.95/mo plus API units bought on top. DataForSEO is pay-as-you-go from a $50 credit that lasts months, at $0.60–$3.50 per 1,000 SERP queries. For a one-off technical pull, that’s a few dollars versus unlocking a recurring Business seat.
How do I pick which competitors to analyze?
Three signals together: who shows up in paid and organic for your key queries (via DataForSEO), who overlaps with you in Google Ads Auction Insights, and who shares the most keywords with you in the tool data. The intersection is your real competitor set, and it’s often not the brands you’d have named.
Isn't this just SEO?
It looks like SEO and it isn’t. On the run in this article, 1,847 gaps were missing landing pages and 149 were missing content topics. The gaps split into landing-page structure (SEO), products you should stock (assortment), audiences worth remarketing to (paid), and topics worth writing (content). The analysis is the same; the actions land on four different teams.
Can I really do this across languages and markets?
Yes, and it’s the strongest version of it. The LLM matches pages by intent, not wording, so it pairs a foreign competitor’s categories onto yours fine. If your home market has no competition to learn from, run the analysis on a stronger foreign market and import what works.
My sitemap lists all my pages. Isn't that enough for my side?
No. Sitemaps routinely omit parametric URLs, filtered category views and parts of the blog, which is precisely where gaps live. Build your own-site map from a crawl plus the product feed plus a category export, and treat the sitemap as one input, not the source of truth.
CTA: Curious what your strongest competitor ranks for that you don’t? Let’s pull the gap map.