AI SEO In Detail

AI SEO In Detail › Module E · Gap Analysis › Episode 39

Episode 39 · coming soon

Keyword Gap: What They Have and You Don't

Episode 39 of AI SEO In Detail, a free course in practical SEO analysis: Keyword Gap: What They Have and You Don't.

Episode 39: Keyword Gap: What They Have and You Don't Video coming soon

This episode is scripted and in production. The transcript below is the script as written; it may change before the video is published.

Full transcript

1,039 words · script draft, under review.

Intro

You've exported everything your competitors rank for. Eighteen thousand rows. Subtract your own keywords, and you get a list of thousands of "gaps".

Most of them aren't. Some are the same keyword written differently. Some are the competitor's brand name. Some you already rank for, and the data just missed it. And some are positions from three months ago.

In this episode, we turn that raw difference into a short, verified keyword gap: what they really have, that you really don't.

Three kinds of result, not one

The basic idea is a set difference. Take the keywords your competitors rank for, remove the ones you rank for, and what's left is the gap.

But a plain yes-or-no throws information away. I split every keyword into three groups.

Missing: at least one competitor ranks, and you don't appear at all. That's the classic content gap. Usually it means you don't have a page for it.

Weak: you rank, but far behind. Say a competitor is in the top five and you're at position thirty-five. You have a page, it just isn't competing. That's a different fix: improve the page, not build a new one.

Where do you draw the line between weak and shared? Pick a simple rule and write it down. Mine: if the best competitor is in the top ten and I'm more than ten positions behind, it's weak. The exact number matters less than using the same rule every time you rerun.

Shared: you both rank well. Not a gap. But keep it, because it tells you where you're already competitive.

All three come from one query over the table we built in episode thirty-eight, joined on the normalized keyword.

Normalize before you compare

A set difference is only as good as the matching. If one list says "Burr Grinder" with capital letters and the other says "burr grinder", the computer sees two keywords. So everything goes through the normalized column first. Lowercase, trimmed, single spaces, punctuation stripped.

Then the harder cases. Singular and plural. Should "hand grinder for espresso" and "hand grinders for espresso" count as the same keyword? Sometimes. As we saw in episode twenty, Google often groups close variants. When two forms show exactly the same volume, they're very likely one synonym group in Google's data. Treat them as one keyword, and never add the volumes together.

But don't merge forms automatically when the volumes differ. Then they really are different searches, and the form you choose matters.

Next, brand terms. Your competitors rank for their own name, their product lines, their support pages. None of that is a gap for you. Build a short list of brand patterns per competitor, and drop those rows.

And finally, language and location. If one export was pulled for a different country, by mistake, the whole comparison is off. Check that every export has the same settings before you join.

Filters that turn thousands into hundreds

Here's the funnel on our demo site. Made-up numbers for illustration.

Eighteen thousand four hundred rows, across three competitors. After normalizing and removing duplicates, nine thousand one hundred unique keywords. Six thousand three hundred of them are missing or weak for us.

Now three filters. Competitor position: at least one competitor in the top ten. If nobody ranks well, it's not proven demand on a winnable page, it's just noise. Volume: above a floor you choose. And topic: does the keyword belong to what the site does? A coffee equipment shop doesn't need the review site's keywords about tea. That leaves eight hundred and twenty.

Then the strongest single signal: how many competitors rank for it. One competitor ranking could be luck, or an old article. Two or three competitors ranking for the same keyword means the topic is established in your niche. That leaves two hundred and ten.

Look at what the funnel did. It didn't throw away good ideas. It threw away duplicates, brand names, off-topic terms and one-off rankings. The two hundred and ten that remain are the ones where your niche has already proven that a page can rank.

Check your own data first

Before you call anything missing, check your own Search Console data. It's free, and it's the best source for your own site.

The Labs database only sees what it crawled. It can easily miss you on a keyword where Search Console shows impressions every week. In that case, the keyword isn't missing, it's weak. You don't need a new page, you need a better one.

So join the gap list with your Search Console queries. Anything with real impressions moves from missing to weak. It's a small step, and it stops you from building duplicate pages that compete with your own.

Verify with the live SERP

Now the staleness check from episode thirty-eight. The gap list is built on a database snapshot. Before any of it drives a decision, verify the top of the list against the live results page.

I take the top forty and run a live SERP call for each, at depth thirty. That's about half a cent per keyword. Forty keywords, roughly a quarter of a dollar. For each one I check: is the competitor still there, is the ranking URL still the same page, and am I anywhere in the top thirty?

Some rows will fail. A competitor has dropped. A page has been removed. That's normal. The point is that the rows that survive are facts as of today, not as of the last crawl.

And sometimes the live check finds you. Your page sits at position twenty-six, and neither database saw it. Good news: that row moves to weak, and you just saved yourself a new page.

The output: a verified gap list

What you get out of this is a gap list with one row per keyword. It says whether it's missing or weak, how many competitors rank, the best competitor URL, the volume, and the date you verified it.

Notice what's not in it yet: a score. Ranking these against each other is episode forty-three. And notice what it can't show: a whole type of page you don't have. That's next.

Wrap-up

Normalize, split, filter, check your own data, then verify. The SQL for the gap query and the normalize function are linked in the description. Next episode: the gaps keyword lists can't show you, the page types your competitors have and you don't. See you there.