Detecting query cannibalisation from Search Console alone
You do not need a rank tracker to find pages competing with each other. One Search Console report with both dimensions in it will do, if you know the thresholds.

Query cannibalisation is detectable from Search Console alone, and it needs exactly one report: query and page requested together as two dimensions in the same request. Group the rows by query. Any query that comes back with two or more of your own pages attached, each carrying real impressions, is a query your site is answering twice. No rank tracker and no third-party tool is involved, because the evidence is already in the property you own.
Search Console will happily give you a report by query and a separate report by page, and neither of them can show cannibalisation. A query report says a query got 90 impressions; it does not say across how many of your URLs. A page report says a URL got impressions; it does not say for which queries. The join between them only exists inside a single request that asks for both dimensions, because that is where the API returns one row per query-and-page pair. Two reports fetched separately cannot be joined afterwards without inventing the pairing.
In Market4 the rule that looks for this refuses to run rather than guessing when those rows are missing. Its skip message says the check needs both dimensions in one report, which is a more useful answer than a clean report that only means nobody fetched the right data. A cannibalisation check on a query-only report would always come back empty, and an empty result that cannot ever be non-empty is worse than an error.
Not every second URL on a query is cannibalisation. Market4 applies a floor of 20 impressions per page before a row is considered at all, and then requires at least two surviving pages on the same query. A page picking up three impressions on a query is not competing for it; it is being shown once in a while by an engine testing something. Filtering below the floor first is what stops the check from reporting every long-tail query on the site.
The severity of a cannibalisation finding then depends on how evenly the query is split between the top two pages. The split is the second page's impressions over the combined impressions of the top two, and an even split is the worst case, because neither page can accumulate the signals it needs to win outright. A heavily lopsided split is barely cannibalisation at all — one page is clearly the answer and the other is a stray.

The queries worth a rewrite sit at positions 8 to 20 with enough impressions that a small rank gain pays for itself. Here are the thresholds, and why each boundary is where it is.

Market4 turns one release note into a changelog page, a blog post, a mail-out and a week of social posts — and then tells you which of them brought anyone back.
| Impressions, best page | Impressions, second page | Split | How much it matters |
|---|---|---|---|
| 60 | 60 | 0.50 | The worst case — neither page can pull ahead |
| 80 | 40 | 0.33 | Real, but one page is clearly leading |
| 95 | 5 | 0.05 | Barely worth calling cannibalisation |
| 60 | 15 | — | Second page is under the floor and is ignored entirely |
There are two distinct symptoms of cannibalisation and they need different evidence. The first is a split: two pages both ranking, sharing the impressions. The second is a swap: Google ranking one page for the query in one period and a different page in the next, because it cannot settle on which of yours answers it. A swap is the more damaging of the two, since neither page holds a position long enough to build anything.
A swap can only be claimed when the report carries a comparison window, and when at least two of the competing pages have comparison rows with impressions above zero. Market4 raises the score of a finding when it can show the leader actually changed, and lowers it when it can only show the shape of the split. That distinction matters in a report somebody is going to act on: telling a person their leader changed when you only ever measured one window is a claim the data does not support.
Fixing cannibalisation starts with a decision that no tool can make for you: which page should own the query. Once that is settled there are two honest routes. Merge the weaker page into the winner with a 301 redirect, so the links and the relevance stack on one URL. Or retarget the weaker page at a distinctly different query — which means changing its title, its heading and its opening paragraph, not just its meta description, because those are the parts an engine reads as the page's subject.
One thing to resist: fixing every query the report returns. Market4's own rule caps itself at ten findings per run, on the reasoning that a list nobody reads is not an insight. Cannibalisation is a slow problem, and the two or three queries with the most impressions behind them are worth more than a spreadsheet of forty.
Yes. Request one report with query and page as dimensions together, then group the rows by query. Any query returning two or more of your own URLs with meaningful impressions on each is a candidate. The data is already in the property you own, so no rank tracker or crawler is involved. What you cannot do is join a query-only report to a page-only report afterwards — the pairing exists only inside a request that asked for both.
Market4 uses a floor of 20 impressions on that specific query. Below that, a URL appearing against a query is usually an engine testing a page occasionally rather than a page genuinely competing, and counting it would make every long-tail query on the site look cannibalised. After the floor is applied, the query needs at least two surviving pages to be reported at all.
Yes, and by a wide margin. An even split means neither page can pull ahead: the links, the clicks and the relevance signals that would stack on one URL are divided between two, so both sit lower than one strong page would. A lopsided split means one page is already the answer and the other appears occasionally, which is closer to noise than to a problem worth a redirect.
You need a comparison window, and you need comparison rows on at least two of the competing pages with impressions above zero in both. Then you can sort the previous window by position, sort the current window by position, and see whether the leading URL is the same one. Without that second window you can describe the split, but you cannot say the leader changed.
Redirect it when it has nothing to say that the winner does not — a 301 stacks its links and history onto the page you chose. Rewrite it when it covers a genuinely different question that got mistargeted, and change the title, the heading and the opening paragraph so an engine reads a different subject. Changing only the meta description will not move which query the page competes for.
Search Console's regex filters are RE2 expressions, which is a deliberately smaller syntax than the one most regex tutorials teach. What RE2 leaves out, what to write in place of each missing construct, and the two things a filter does not change.

Search Console will group performance rows by seven dimensions, and searchAppearance is the one that says which result feature an impression came from. It also changes how the totals are aggregated, which is the part that surprises people.