Back to Tools

Keyword Gap Analyser

Use cases

Finding competitor keywords you are missing Identifying content opportunities Matching gaps to existing pages for optimisation Competitive analysis for content strategy

Set difference to identify competitor keywords you are missing.

TF-IDF vectorisation (sklearn, English stopwords, 10k max features) with cosine similarity for content matching.

Similarity threshold 0.1.

Lowercase normalisation.

Exact match prioritisation over semantic matches.

Streamlit App

Platform

Browser-based (no installation required)

Input

Your keyword export (CSV/Excel)

Competitor keyword export (same format)

Optional: Content data with URL, text, H1 columns

Output

Gap keywords with volume, competitor URLs, best-matching page URL, match type, and H1 tag.

Launch App View Source

Features

  • Set difference gap identification
  • TF-IDF + cosine similarity content matching
  • Exact match prioritisation
  • Minimum search volume filtering
  • H1 heading relevance in matches

How to use

  1. 1 Upload your keyword data
  2. 2 Upload competitor keyword data
  3. 3 Optionally add content for page matching
  4. 4 Map columns and set volume filter
  5. 5 Review gaps with match type (exact/semantic)

Frequently asked questions

Does it need any API keys or make any web requests?
No. The whole analysis runs offline on the files you upload: your keyword export, the competitor's export (from Ahrefs, SEMrush or similar), and an optional content file. Nothing is crawled or fetched.
Why are near-identical keywords showing up as gaps?
The gap calculation is an exact set difference after lowercasing, with no stemming or fuzzy matching. 'llc formation' and 'llc formations' are treated as different keywords, so plural and word-order variants of terms you already rank for will appear as gaps. Expect to skim the output for these rather than treating every row as a genuine miss.
What should the optional content file contain?
One row per page with a URL column and a column holding the page text, plus optionally an H1 column; a Screaming Frog crawl with a content extraction works well. The tool lowercases the text, indexes words longer than two characters, and builds a TF-IDF matrix (English stopwords, 10,000 max features) from it.
What is the difference between an exact and a semantic match?
An exact match means the gap keyword appears verbatim as a substring of a page's content, with an H1 relevance score of 1.0 if it also appears in the H1. A semantic match is a TF-IDF cosine similarity above 0.1 when no exact match exists on that page. Exact matches always outrank semantic ones, and only the single best match is written to the best_match_url column even though up to three are computed.
My competitor file has the same keyword on several rows. Which one is used?
Only the first matching row: its volume and URL are taken and the rest are ignored. If your export has one row per keyword per URL, pre-aggregate it (for example keep the top-ranking row) so the volume and competitor_url columns reflect the row you care about.

Need something built for your business?

This tool started as bespoke client work. I build custom scripts, data pipelines, and full apps for SEO and product data problems that off-the-shelf tools don't solve.

Tell Me What You Need