Cannibalisation: deciding which of the two pages stays
An advice article and a product page rank for the same query. Sometimes one sits at position 6, sometimes the other at position 9, and the clicks are split across two addresses, neither of which ever makes it to the top. What makes this expensive is not the lost rank on its own but that every improvement to one of the two pages takes impressions away from the other, the numbers eat each other, and the work goes round in circles. Two halves do not make a whole.
How to go about it in JMX
- Sign in on the Search Console tab and run Load data for the period you want. Without these numbers everything that follows is guesswork.
- The Search insights tab, Analyse button. The section “Own pages competing” groups all of your own pages per query, best placed at the top. A group appears from 50 impressions in the period; the individual row inside it needs only 5, because otherwise exactly the weaker page — the one this is about — would drop out. Google usually shows the stronger one.
- The Semantics tab: compute a vector set once, via OpenAI, Mistral, Gemini, OpenRouter or locally via Ollama. The Pages that mean the same view lists pairs from a cosine of 0.92; with Recompute you lower the threshold without triggering a second paid call.
- The Issues tab:
SEO.DUPLICATE.TITLEshows the pairs that already promise the same thing in the title,SEO.DUPLICATE.CONTENT_NEARthe near-duplicates found via SimHash. Semantics covers the other half: same topic, no shared sentence. - The Results tab: switch on the Link score column (internal PageRank, 0 to 100) and the internal link counters. The page carried internally is the candidate that stays.
- The Page assessment tab: it lays Search Console and Matomo over the same URL and assigns each page an action — Fine, Rework snippet, Rework content, Expand, Refresh, Retire. The Queries column names the two strongest queries of the page.
- After merging, crawl again, then go to the History tab: a page that now answers 404 or carries
noindexstands there as Critical. In the nightly run,jmx-cli … --changes changes.xlsx --fail-on-change Criticaldoes that job.
What to watch out for
Two of your own pages on one query are not a mistake. A category page and an advice article may well appear side by side. It only becomes a finding when the weaker page takes impressions away from the stronger one without delivering itself — the note above the table says so, and position, clicks and click-through rate stand next to each page involved.
The limit lies in the period. The shortest the analysis offers is 28 days, the longest 16 months, the retention window of Search Console. The position you read in the group is the average over that period, and what averages out in it is exactly the movement you came here for: two pages that displace each other daily both show up in a middling spot, and JMX does not show a day-by-day curve per query. That two pages are running for the same query is what the list evidences. Which one was ahead on which day is not.
Discover and News publish no queries; the section is omitted there, and says so. Semantic similarity is a statement about the topic and not about the ranking: 0.94 between two pages means they mean the same thing — not that Google is setting them against each other. Only the intersection of both lists is a case. Claude and Grok are missing from the provider list for semantics because they do not offer vectors.
As long as both pages stay up, Google makes the decision — anew every week, and with no record of what for.