SEO Skill

Keyword cannibalization checker

See which searches show more than one of your pages in Google, and how each page splits the impressions, from your own Search Console data.

Check with your agent, no export needed

The easiest way is to let SEO Skill read Search Console for you. It pulls which pages showed for each query straight from Search Console, up to 100,000 rows from the last 28 days of final data, so there is nothing to export. It also checks the top competing URLs live: a page that now errors shows before you spend time on it, and a page that now redirects counts as the page it points to.

Add the hosted MCP server to your agent and sign in with Google:

Run it in a terminal, then sign in with Google.

Or run it on your machine

Installs the CLI, signs you in and adds the skill to your agents. Site crawls and Bing data run this way, on your own machine. A crawl fetches many pages, and Bing blocks our hosted server.

Then ask:

Which queries is example.com cannibalizing, and which page should own each one?

In a terminal, install the CLI with npm i -g seo, run seo start to connect Search Console, then run the cannibalization section of the report:

seo report --site example.com --section cannibalization

No account? Check an export in your browser

The checker below uses the same rules on a file instead. It needs a CSV with a query and a page on each row, made in the steps under it.

Check your export

Add a Search Console export with a query and a page on each row. It is read in this tab and not uploaded.

No export added

Drop the query and page CSV. Add the zip from the Search Console Export button too, for each query's own impressions.

Sample with made-up numbers

What the check left out

    Export queries and pages for the checker

    The Export button in Search Console keeps queries and pages in separate tables, so it cannot show two pages sharing one search. Get the pairs from the Search Console API with one of these free tools.

    • Search Analytics for Sheets. Install the Google Sheets add-on, pick your site and the last 28 days, group by Query and Page, and request the data. Then choose File, Download, CSV.
    • Looker Studio. Add the Search Console connector with the URL Impression table. Make a table with Query and Landing Page, plus Url Clicks, Impressions and Average Position, then export it as CSV.

    For each query’s own impressions, also export the same dates from Performance in Search Console and add that zip (or its Queries file) with the CSV. Without it, the checker adds up the page impressions, and one search that showed two of your pages counts twice.

    How the checker decides two pages compete

    It uses the same rules as the cannibalization section of the SEO report, so the same rows give the same list of queries.

    • A query needs at least 50 impressions over the export.
    • A page counts as competing when it has at least 10 of the query’s impressions and at least a tenth of them. Below that it is a stray result, not a rival.
    • When one page takes more than 80% of the competing impressions, Google has already picked it, and the query is left out.
    • Searches for your own brand are left out, along with search operators and bare web addresses.

    Queries with the most impressions and the most even split between pages come first. The page with the most clicks is marked as the first one to read, not as the one to keep.

    Decide what to do with each query

    Open every page in a row and ask whether a searcher would be happy landing on either. If yes, they compete: choose one, point your internal links at it, and merge or redirect the weaker page when it adds nothing. If they answer different needs (a category page and a how-to guide, say), keep both and make each page’s focus clearer in its title and headings.

    Two pages sharing impressions is evidence of overlap, not proof of lost traffic. Check again a few weeks after a change, with the same date range, and compare.

    Keyword cannibalization questions