---
title: "Keyword Cannibalization in Google Search Console · GSC PAP"
source: https://gscpap.com/guides/detect-keyword-cannibalization
updated: 2026-09-18
---

[All guides](https://gscpap.com/guides)

Guide · about 8 minutes

# How to find keyword cannibalization in Google Search Console

By the [GSC PAP team](https://gscpap.com/about) · Updated September 18, 2026

Keyword cannibalization is when two or more pages on your site show up for the same search query and compete with each other instead of one page clearly owning it. The typical signs: the URL Google shows for a query keeps changing, its position stalls, and clicks and links are split between pages that each rank worse than one strong page could.

Google Search Console is the most direct place to check for it, because it records which of your URLs Google actually showed for each query. This guide covers how to find cannibalization there by hand, how to tell a real problem from harmless overlap, and how to fix the cases that matter. Then it runs the same audit in one prompt with Claude and GSC PAP.

## What is keyword cannibalization?

It is the situation where several distinct pages on one site target the same search intent, so they end up competing for the same queries. Instead of one page collecting the relevance, internal links and clicks for a topic, they are spread across two or three pages, and Google has to keep choosing between them.

It is not the same as duplicate content. Near-identical URLs, such as tracking parameters, filtered views or print versions of one page, are a canonicalization issue: Google groups them and picks one URL to show. Cannibalization is about separate pages, written separately, that answer the same question.

## How do you find keyword cannibalization in Google Search Console?

Search Console has no cannibalization report, but the Performance report shows it one query at a time:

-   Open Performance, then Search results. Set the date range to the last 3 months and turn on Average position.
-   On the Queries tab, click a query you care about. Search Console adds it as a filter.
-   Switch to the Pages tab. Every URL listed was shown to searchers for that query during the period, each with its own clicks, impressions and average position.
-   Read the split. One URL with nearly all the impressions is healthy. Two or more URLs that each hold a real share is the pattern to investigate.
-   Check for flip-flopping. Keep the query filter, open the Compare tab in the date picker, and compare two periods. If the leading URL changed between them, Google is switching between your pages.
-   Repeat for your most important queries.

[![Search Console Performance report filtered to one query, with the Pages tab showing two URLs that split its impressions](https://gscpap.com/images/guides/detect-keyword-cannibalization.webp)](https://gscpap.com/images/guides/detect-keyword-cannibalization.webp)

Click a query to filter on it (1), then open the Pages tab (2). Here two posts split the impressions and neither reaches page one. Recreated with example data for a made-up site.

## How do you check keyword cannibalization across a whole site?

Checking query by query works for your top 20 terms, not for thousands. The Performance table shows one dimension at a time, so it cannot list query and page pairs side by side, and it shows at most 1,000 rows.

For a full audit, pull query and page together from the Search Console API (up to 25,000 rows per request), group the rows by query, and keep the queries that more than one of your URLs appeared for. Sort them by the total impressions at stake.

Set a minimum before you start, such as 100 impressions per query. Otherwise the list fills with noise: a second URL that appeared once at position 90 is not competing with anything. This is what the find_cannibalization tool in GSC PAP does in one call, as the worked example below shows.

## Is keyword cannibalization always a problem?

No, and it is easy to overdiagnose. In a 2025 answer reported by Search Engine Journal, Google's John Mueller said that several of your pages appearing for the same query is not a problem just because there is more than one, and that pages "aren't duplicates just because they happen to appear in the same search results page." His advice: reduce unnecessary duplication, put your effort into one excellent page, and judge each case with knowledge of your site and your users.

Overlap is usually fine when two of your pages rank on the same results page together, when a broad or branded query is served by different pages for different needs, when the pages match different intents (a how-to guide and a pricing page), or when the second URL has a handful of impressions at a deep position.

It is worth fixing when:

-   Two pages answer the same question for the same reader, and neither ranks well for it.
-   The URL Google shows for the query keeps switching from one period to the next.
-   The wrong page leads: an old post, a thin tag page or an archive page shows instead of the page you want to rank.
-   You are about to publish a new page on a topic an existing page already covers. Expand the existing page instead.

## How do you fix keyword cannibalization?

First decide which page should own the query. Usually it is the one with more clicks and links, or the one that better fits what the searcher wants. Then pick the lightest fix that makes that choice clear:

-   Consolidate. Move the useful parts of the weaker page into the owner, then 301 redirect the weaker URL to it. This is the right call when both pages answer the same question.
-   Redirect. If the weaker page adds nothing, 301 redirect it to the owner and drop it from your sitemap.
-   Differentiate. If both pages deserve to exist, give each a distinct intent, make the titles, H1s and opening paragraphs reflect it, and link the two pages to each other.
-   Fix internal links. Point links about the topic, with matching anchor text, at the owner instead of splitting them across both pages.
-   Canonical tag, for near-duplicates only. Use rel=canonical when both URLs must stay live but are versions of the same content. It is not a way to choose between two different pages, and Google can still pick a different canonical than the one you declare.
-   Noindex, as a last resort, for a page that has to exist for visitors but should not appear in search.
-   Before you redirect or remove anything, check the losing page for backlinks, conversions and internal links, and note the date so you can compare before and after.

## Finding keyword cannibalization with Claude

The prompt works in any client connected to GSC PAP. Not set up in Claude yet? [Connect GSC PAP to Claude](https://gscpap.com/integrations/claude-ai-connectors)

### The scenario

You have a content site with 200+ blog posts published over five years. You suspect overlap: one writer covered "customer interview templates" in 2022 and another covered "user research interview guides" in 2024, probably for the same intent. You want a definitive list of competing queries before deciding which pages to keep.

### The prompt

```prompt
Use the gsc-pap MCP server. For https://example.com, find keyword cannibalization in the last 90 days: queries where 2 or more of my URLs got impressions, with at least 100 impressions per query. For each one, list the URLs with their clicks, impressions and position, tell me whether it looks like real cannibalization or harmless overlap, and recommend merge, redirect, differentiate, or leave alone.
```

### What happens

1.  #### Claude calls find_cannibalization
    
    The tool takes your site URL, a date range, a minimum impressions threshold (default 100) and a minimum number of pages per query (default 2). It returns every query that more than one of your URLs appeared for, with the page count, total clicks and impressions, and a per-URL breakdown of clicks, impressions, CTR and average position.
    
2.  #### Claude separates real overlap from noise
    
    Not every flagged query deserves action. Claude looks at how the impressions split: if one URL has 480 of 490 impressions and a second appeared twice at position 60, that is noise. The ones worth a look have two or more URLs with a real share each, or a leading URL that is clearly the wrong page. Claude sorts those into three patterns: near-duplicate intent (merge and redirect), different intent on an overlapping query (differentiate and cross-link), and an old post outranking a newer, better one (redirect old to new).
    
3.  #### Claude recommends the smallest fix
    
    Sample output: "Query: 'customer interview templates', 4,200 impressions in 90 days. /blog/customer-interview-templates (position 12, 45 clicks) vs. /blog/user-research-interview-guides (position 18, 22 clicks). Pattern: near-duplicate intent. Action: move the unique sections of the second post into the first, 301 redirect /blog/user-research-interview-guides to /blog/customer-interview-templates, and update internal links that point at the old URL." For a closer look at intent, Claude can call get_search_by_page_query on each URL to see every query that page ranks for.
    

### What the answer looks like

Claude with GSC PAP connected

Find keyword cannibalization from the last 90 days and tell me which cases are worth fixing.

`find_cannibalization` at least 100 impressions per query, 2 or more pages

| Query | Page | Impressions | Clicks | Position |
| --- | --- | --- | --- | --- |
| customer interview templates | /blog/customer-interview-templates | 2,650 | 45 | 12.1 |
| customer interview templates | /blog/user-research-interview-guides | 1,550 | 22 | 18.4 |
| user onboarding checklist | /blog/onboarding-checklist | 480 | 31 | 6.2 |
| user onboarding checklist | /templates/onboarding | 10 | 0 | 60.3 |

One case is worth fixing. "customer interview templates" is split between two posts that answer the same question, and neither reaches page one: move the unique sections of /blog/user-research-interview-guides into /blog/customer-interview-templates and 301 redirect it. "user onboarding checklist" is noise, with 10 of 490 impressions on the second URL at position 60. Leave it alone.

Illustrative answer for a made-up example.com. Your queries and numbers will differ.

### Outcome

You end up with two lists: a short one of queries that are genuinely split, each with an owner page and one action, and a longer one you can safely leave alone. Most fixes are small: a redirect, a merged section, a retitled H1, a few internal links. Run the audit again a month after shipping and check that each fixed query now has one clear page.

### Where to take it next

-   Check branded queries separately ("only queries containing my brand name"). Several of your pages showing for your own brand is normal; what matters is whether the right one leads.
-   After a merge, run historical_position_trend on the query to confirm the surviving URL holds or climbs.
-   Before you publish a new post, ask Claude to run get_search_by_page_query on your closest existing page, so you can see which queries it already owns and expand it instead.
-   Re-audit every few months. New content keeps creating overlap with older posts you have forgotten.

## Frequently asked questions

### How do I check for keyword cannibalization in Google Search Console?

Go to Performance, then Search results, click a query on the Queries tab, and switch to the Pages tab. If two or more of your URLs each hold a meaningful share of the impressions for that query, those pages are competing. To check every query at once, pull query and page data together from the Search Console API, or use a tool like GSC PAP's find_cannibalization that groups it for you.

### Does Google penalize keyword cannibalization?

No, it is not a penalty. The cost is indirect: Google has to choose between similar pages, the one it picks may not be your best, and links and clicks are split between them. Google's John Mueller has said that several of your pages appearing for one query is not a problem in itself.

### Should I use a 301 redirect or a canonical tag?

Use a 301 redirect when one page should replace the other for visitors and search engines alike. Use a canonical tag when both URLs have to stay reachable but are versions of the same content, such as filter or parameter variants. Even then, Google can choose a different canonical than the one you set.

### How many pages ranking for one keyword is too many?

There is no fixed number. Two of your pages on the same results page can be a good outcome. It becomes a problem when the pages serve the same intent and none of them ranks well, or when the URL Google shows keeps changing. Judge by the impressions split and the positions, not by the count.

## Other guides

[All guides](https://gscpap.com/guides)

[

### AI queries in Google Search Console: how to tell people, AI Mode and agents apart

Search Console mixes AI Mode follow-ups, AI agent searches and scripts into your query report. How to spot each one, with regex filters and real data.

14 min read

](https://gscpap.com/guides/ai-queries-in-google-search-console)[

### Good position, no clicks: find the SERP features eating your CTR

Ranking third and getting no clicks usually means something sits above you: an AI Overview, a featured snippet or a map pack. How to check which, query by query.

7 min read

](https://gscpap.com/guides/low-ctr-at-good-position-serp-features)[

### Find the pages quietly losing organic traffic, before the rankings go

Content decay is slow enough to miss on a dashboard. How to find the pages whose clicks keep sliding, tell decay from seasonality, and decide what to refresh.

7 min read

](https://gscpap.com/guides/find-pages-losing-organic-traffic)[

### Traffic changed: how to compare two Search Console periods and find out why

Clicks are down 18% and nobody knows why. How to compare two periods properly, avoid the three traps that fake a drop, and find the queries and pages behind it.

7 min read

](https://gscpap.com/guides/compare-search-console-date-ranges)[

### Google Search Console anonymized queries: measure the traffic you can't see

Search Console hides anonymized queries from query rows but counts them in totals. Learn what they are, why no tool reveals them, and how to measure them.

6 min read

](https://gscpap.com/guides/google-search-console-anonymized-queries)[

### GSC clicks vs GA4 sessions: why they differ and how to tie clicks to conversions

A Search Console click and a GA4 session measure different things. Why the numbers never match, what gap is normal, and how to compare and combine them page by page.

11 min read

](https://gscpap.com/guides/correlate-organic-clicks-to-ga4-conversions)[

### Audit Core Web Vitals across your site with AI

Audit Core Web Vitals with Claude through a hosted PageSpeed Insights MCP server: Lighthouse lab data and real-user CrUX field data for your top pages.

7 min read

](https://gscpap.com/guides/audit-core-web-vitals-with-ai)[

### Google Search Console historical data: how to keep it past 16 months

Google Search Console keeps 16 months of historical data, then deletes it. Here is what it includes and how to keep it longer, from BigQuery to an archive.

8 min read

](https://gscpap.com/guides/recover-search-console-history-past-16-months)[

### Build a weekly SEO health report with Claude

Automate a weekly SEO report with Claude: one saved prompt pulls Search Console changes, quick wins, decaying pages, GA4 conversions and Core Web Vitals.

8 min read

](https://gscpap.com/guides/weekly-seo-health-report-via-claude)[

### Bulk URL inspection in Google Search Console: diagnose indexing issues at scale

Search Console inspects one URL at a time. The URL Inspection API allows 2,000 checks a day per property. How to inspect in bulk and find indexing issues.

8 min read

](https://gscpap.com/guides/diagnose-indexing-issues-bulk-url-inspection)[

### Track keyword rankings in Google Search Console, past the 16-month limit

See a keyword's position history in Google Search Console, what that average really measures, and how to keep ranking history past the 16-month limit.

6 min read

](https://gscpap.com/guides/track-keyword-rankings-over-years)[

### How to find striking distance keywords in Google Search Console

Striking distance keywords rank just off page one of Google. Find them in Search Console, pick the ones worth fixing, and learn what to change on the page.

8 min read

](https://gscpap.com/guides/find-seo-quick-wins)

### Tools that automate this workflow

The MCP exposes 36 tools across 9 categories. These are the ones most relevant to this page:

-   [find_cannibalization](https://gscpap.com/tools#find_cannibalization) · Detect keyword cannibalization where multiple URLs compete for the same query, splitting click-through and confusing Google.
-   [get_search_by_page_query](https://gscpap.com/tools#get_search_by_page_query) · Drill into a specific page to see which queries drive its traffic, impressions, and average position.
-   [search_analytics_query](https://gscpap.com/tools#search_analytics_query) · Run any Search Analytics query with full dimension and filter support, identical to what you'd hit the GSC API for, but inline in chat.
-   [historical_position_trend](https://gscpap.com/tools#historical_position_trend) · Plot a query's position over the last N days to see whether you're trending up, down, or volatile.

[Browse all 36 tools](https://gscpap.com/tools)

### Skip the GCP project. Just sign in.

GSC PAP is hosted, free, and read-only. No service account JSON, no Python venv, no API keys. Sign in with Google, mint a bearer token, paste it into Claude / Cursor / Claude Code. About 60 seconds end to end.

[Sign in with Google](https://app.gscpap.com/login) Read-only Search Console scope, revoke anytime

Want a guide for a workflow we have not covered? Email [support@gscpap.com](mailto:support@gscpap.com).
