On most sites that come to us complaining about ranking volatility we find the same thing: there is no single strong page for the target keyword, there are dozens of near identical candidates. Google shows one today and another tomorrow. From outside it looks like rankings are jumping around; in reality the site is competing with itself.
This is called cannibalisation, and in e-commerce it almost always comes from the same place: filters.
Symptoms
If two of these three are true, you probably have it:
- The page ranking for a query changes week to week
- The page that ranks is not the one you wanted; usually some filter combination
- Impressions exist but clicks are low, because the title that appears does not match what the user was looking for
There is a fourth symptom: newly published content does not show at all. The crawler already sees dozens of pages on that topic, so it treats the new one as another member of the crowd rather than a source.
The source is nearly always parameters
Picture a category page. Add colour filters, size filters, a price range and sort options, and you get hundreds of URL combinations, most of them showing almost the same product list.
If those URLs are crawlable and indexable, you have created hundreds of candidates for one keyword without noticing. On top of that, the crawler spends a meaningful part of its time on those duplicates.
Diagnosis: data, not guesswork
Open the Performance report in Search Console and filter by query. Selecting a single query shows you which pages were served for it. If more than one page appears, the diagnosis is done.
The second source is a site crawl. Dozens of pages sharing the same title and meta description are duplicates by definition.
The third source is server logs, which show what the crawler actually visits and how often. Sites where filter URLs get crawled more than the main categories are not rare at all.
The decision tree
Once the candidates are listed, we ask one question about each: does this page have a search intent of its own?
If it does, keep it separate. If people genuinely search for "black running shoes", that filter page deserves to become a category with its own title, its own copy and its own internal links.
If it does not and the content is nearly identical, the canonical should point to the main page. The vast majority of filter combinations belong in this group.
If the page is both unnecessary and being crawled, stop the crawl too. A canonical is a suggestion; it does not protect crawl budget. Parameter rules, or simply never linking to those URLs, keep the crawler out.
If two real pages chase the same intent, merge them. Keep the stronger one and redirect the other. Two weak pages do not add up to one strong page.
Order of operations
Getting the order wrong stretches the work out. Ours runs like this:
- List the candidates and decide which page survives
- Strengthen the surviving page: title, copy, internal links
- Redirect the retired pages with 301s
- Apply canonicals and parameter rules to filter URLs
- Clean the sitemap so it only contains pages you want indexed
- Watch the same query in Search Console for a few weeks
The internal linking step gets skipped a lot. Yet the clearest signal you can send about which page is the real one is how your own site links to it.
When a filter page really deserves to be a page
Not every filter combination is waste. Some map to a real search intent and deserve their own page. We separate them with four criteria:
- Is the phrase actually searched for, or does it only exist inside your system
- Are there enough products left on the page; a category with three items satisfies neither user nor crawler
- Can the page carry its own title and description
- Can you link to it from within the site, or is it only reachable by clicking a filter
If the answer is yes to all four, that filter can graduate into a category page. If even one is no, point the canonical at the main category and keep the URL out of the index.
Blog posts cannibalise too
The problem is not confined to filters. Over the years three separate posts pile up on the same topic: one old, one updated, one written last month. All three target the same query and none is strong on its own.
The decision is the same: pick the best one, move the valuable parts of the others into it, redirect the old ones. Redirecting rather than deleting matters, because the links those posts earned over the years are preserved.
Two questions before publishing a new page
Cannibalisation is usually cleaned up after the fact, when preventing it is far cheaper. Before creating a new category or post we ask two questions:
Do we already have a page for this intent? The query list in Search Console and your own site search answer that in minutes. If the answer is yes, the job is strengthening the existing page, not adding another.
On which query will this page outrank someone? Without a clear answer, the page will join the crowd rather than beat anyone.
Both questions look trivial, and asked consistently they are what stops a site from bloating over the years.
What to expect
Changes do not pay off overnight. It can take weeks for the crawler to digest the new structure, and rankings may move a little more during that window. The expected outcome: one page starts appearing consistently for the query, and click through rate rises because the right page is finally the one showing.
This is not a cosmetic fix. It simplifies the story your site tells a search engine, and it is one of the highest return jobs in technical SEO, because it lets existing content earn what it should without writing anything new.

