The short answer
Keyword cannibalization is when several pages on your site claim the same query and Google decides afresh each time which one to show. The result: instead of one page in the top five you get two pages somewhere between eighth and fifteenth, each carrying half the signals.
The diagnosis comes from data, not from similar-looking headlines. If different URLs alternate under one query in Search Console and the average position swings month to month, you have cannibalization. If one URL holds the query steadily while another shows up with a handful of impressions, that is normal and there is nothing to fix.
Why it actually hurts
The mechanics are simple: everything that makes a page strong gets split between the competitors.
External links split. One person linked to the article, another to the service page. Instead of one URL with ten links you have two with five.
Internal links and anchors split. This is the most common self-inflicted cause: the same anchor phrase points sometimes to one page and sometimes to the other. How to untangle that is covered in my piece on internal linking, which lists this exact failure mode.
User signals split. Clicks and returns to the results page scatter across two URLs, and neither builds a track record for the query.
Google wastes crawl effort. Two pages under one intent means two pages to crawl, render and re-evaluate. On a small site that is irrelevant; across tens of thousands of URLs it becomes a visible share of crawl budget.
There is also an underrated side effect: instability. Even if total traffic holds, you cannot report on positions honestly — they move not because anything changed, but because Google keeps switching between your own pages.
Cannibalization or false alarm?
Two pages about the same topic are not automatically a problem. The difference is intent.
| Situation | Cannibalization? | What to do |
|---|---|---|
| "What is X" in the blog and "X service" under services | No, if the texts do not overlap | Separate the wording, link from the article to the service |
| Two blog posts answering the same question | Yes | Merge into one, 301 the other |
| Category page and a filtered view of the same category | Yes | Canonical to the category or keep the filter out of the index |
| Estonian and English versions of one page | No | Check hreflang |
| Service page and a "service + city" page | Depends | If the cities differ only in the heading, they are duplicates |
| An article and its print version | Yes | Canonical to the main version |
The check I run before changing anything: if both pages belonged to a competitor, which one would I open for this query? If the answer is "either, no difference", merge them. If it is "depends on what I need", the intents differ and the right move is sharper separation, not a merge.
Finding it in Search Console
The main tool is free, and it is also the most accurate one, because it shows the actual results served for your site rather than a guess.
- Open the Performance report and set the window to 3–6 months. Two weeks will not accumulate enough data for alternation to show.
- Go to the Queries tab and pick a query — usually you start with the ones that have many impressions and few clicks.
- Without clearing the query filter, switch to the Pages tab. That is where the diagnosis lives: how many URLs were served for this query.
- Look at the split. One URL with 95% of impressions is fine. Two URLs at 40–50% each is cannibalization.
- Check the trend. Compare two consecutive periods: if the leading URL changed, Google still has not made up its mind.
- Run it in reverse: take a page, filter by it and look at its queries. If a page is collecting impressions for queries it was never written for, it is pulling in someone else's cluster.
A rough supporting trick is a site: search with the key phrase: site:yoursite.ee phrase. It shows which pages Google considers relevant to the topic at all. It is crude and no substitute for Search Console, but it gives you a candidate list in a minute.
What is not a diagnostic method: comparing headlines by eye, and plugins that look for overlapping keywords across texts. They find matching words, and matching words are not competition for a query.
Where cannibalization comes from
In my experience it is usually created by the system rather than by whoever writes the content.
CMS and templates. WordPress tags, date and author archives, category pagination, print versions. All of it is generated automatically and lands in the index unless someone says otherwise.
Filters and parameters in a shop. The "sofas" category and the same category sorted by price are, to Google, two pages with nearly identical content.
A blog that grew without a plan. Three articles written in different years answering the same question in different words. That happens when material is planned by topic rather than by keyword cluster: without clustering, a new article almost inevitably overlaps an old one.
No structure behind the keyword set. If pages are not mapped to intents up front, overlaps appear on their own. That gets solved at the level of site structure derived from keyword research, not by editing individual texts.
"Service + city" pages. Five pages differing only by the city name in the heading are a classic source of cannibalization in local markets. If nothing on the page is genuinely local beyond the substitution, Google is right to treat them as one page.
Four ways to fix it
There is no universal "delete the spare one". The choice depends on what the weaker page carries.
1. Merge. Right when both pages cover the same ground and both are weak. Take the better one as the base, move the unique passages across, 301 the other to it and rewrite internal links to the new address. Redirecting without moving the content is half the job: you keep the link equity but lose the text the page was ranking on.
2. Separate the intents. Right when the pages really are different but written vaguely. Strip commercial wording ("order", "price", "cost") from the informational article and three screens of theory from the service page. After that the article links to the service instead of competing with it.
3. Consolidate technically. For filters, pagination, parameters and utility pages: rel="canonical" to the main version, or noindex if the page has no business being in the results at all. Do not confuse the two — canonical is a hint Google sometimes ignores, noindex is an instruction.
4. Delete. The last resort, and only for pages with no traffic, no links and no purpose. Everything else is better redirected.
After any of these, check that no internal links with the old anchors survive — otherwise you will rebuild the competition yourself within a month.
What I see on my own projects
Cannibalization is almost never a site's only problem, and I have not seen a case where fixing it alone changed traffic by a multiple. It works differently: it lifts the ceiling where a page is already close to the top and cannot get through.
Three observations from practice.
First, the pairs are rarely where you expect them. The owner suspects two similar articles, while the data shows the service page competing with a tag page they did not know existed. That is why diagnosis starts with a report, not with a hypothesis.
Second, on multilingual sites in Estonia I regularly see fake cannibalization — the Estonian and Russian versions of one page with no hreflang in place. It looks like competition but is fixed by annotation, not by merging. The mistake is expensive: the visitor gets a version in a language they do not use and leaves.
Third, on limits: on a site of 30–40 pages it is easier to prevent cannibalization with structure than to hunt for it. On a catalogue of tens of thousands of URLs, going query by query is impossible and the work happens at template level — indexation rules for filters, canonicals and pagination, not individual pages. The method in this article is built for the first case.
If positions dip for a couple of weeks after a merge, that is expected: Google is re-evaluating the consolidated URL. Start worrying if nothing has recovered after a month.
Checklist: audit cannibalization in one pass
- Write down the 15–20 core queries for the site — from your keyword research or from the impressions report.
- For each one, check in Search Console how many URLs were served for it over 3–6 months.
- Flag the queries where two or more URLs share impressions and the position is unstable.
- For each pair, answer whether the pages have genuinely different intents.
- Pick the winner on traffic, links and intent fit — not on publication date.
- Apply the right fix: merge, separate, canonicalise or delete.
- Rewrite internal links and anchors so the key phrase points at one page only.
- Check the language versions — make sure Google is not treating them as duplicates.
- Come back to the report a month later and confirm one URL is left under the query.
If it turns out the overlaps come from templates rather than texts — filter, tag and pagination pages multiplying on their own — editing content will not close it: you need indexation rules at the engine level, which is web development. And when there are dozens of such overlaps tied to the catalogue structure, handling them one by one makes no sense — that is SEO work starting from a structure rebuild.
