Two of your own URLs fighting for one query is the silent tax on a long-running content site. Both stall at position 7-12, swapping places, when one consolidated page would sit at 3-5. The hard part was never the fix; it was the diagnosis at scale. A 500-page site can rank for 20,000+ queries, so eyeballing the Performance tab is hopeless. This tutorial pairs a Search Console export with an AI classification pass so you can flag every cannibalizing pair in minutes, then make the right call — merge or differentiate — per pair.
TL;DR
- Detect: Export 90 days of query-to-URL data (GSC UI or API), then flag every query where two of your URLs both rank on page 1-2. The confirming signal is rank swapping — the two URLs trading positions week to week.
- Classify with AI: Feed each pair the shared queries plus the first ~500 words of both articles. Ask for one of three verdicts: merge, differentiate, or leave alone.
- Act: Merge = 301 the weaker URL into the stronger one and fold in its unique content. Differentiate = repoint title, H1, and intent of one page to a distinct query. Leave alone if both already rank in the top 5 for different intents.
- Timing: Google consolidates 301 signals over a few weeks; expect the kept URL to move within 4-8 weeks (as of June 2026).
- Scope it: Worth running on sites with 300+ articles. Under ~100 articles, true cannibalization is rare.
What counts as cannibalization (and what doesn’t)
Not every case of two pages ranking for one keyword is a problem. The 2026 rule of thumb: if both pages sit in the top 5 for different intent variations of a query, Google has already split them usefully — leave them. Real cannibalization shows three signals:
- Split impressions — clicks and impressions for one query are spread thin across two URLs instead of concentrating on one.
- Rank swapping — the same query bounces between two of your URLs week to week (high SERP volatility for that page pair).
- Stuck-on-page-2 — a query you actively target won’t break the top 10 even though several of your articles rank for it.
A useful gut check: a user searching “how to choose an AI coding tool” wants a guide; a user searching “best AI coding tool” wants a comparison. Two of your URLs serving those two intents is healthy, not cannibalization.
Who this is for
Content sites with 300+ articles, especially ones that grew organically over 2+ years without an editorial taxonomy. SEO managers running a quarterly hygiene pass. Indie operators who suspect old posts compete with new ones but can’t prove it. The best times to run it: quarterly maintenance, after a Google core update reshuffles rankings (cannibalization gets exposed when search shifts), when launching a pillar that overlaps an old one, or when a target keyword is stuck on page 2.
Before you start
- Pull real query data. Without it, AI guesses cannibalization from titles alone, which is unreliable. Export queries, URLs, clicks, impressions, and average position for the last 90 days. 30 days is mostly noise; 90 days reveals the pattern.
- Set your merge threshold. A workable rule: two URLs sharing 3+ queries with overlapping intent, both ranking on page 1 or 2.
- Test your 301 setup. Merges depend on a single-hop, permanent redirect. A broken or chained 301 turns a merge into a deletion and a soft 404.
- Snapshot current rankings. You need a baseline (per query, per URL) to measure the lift later.
Getting the data out of Search Console
The GSC UI export caps at 1,000 rows, which is fine for a quick look but misses the long tail on a large site. For full coverage, use the Search Analytics API, which returns up to 25,000 rows per request and up to 50,000 rows per day per search type (web, image, etc.). To go beyond one request, paginate by incrementing startRow in batches of 25,000. For sites that blow past even the daily cap, enable Bulk data export in Search Console settings to stream raw data into BigQuery with no row limit (as of June 2026).
| Method | Row limit | Good for |
|---|---|---|
| GSC UI export (CSV/Sheets) | 1,000 rows | Spot-checking one keyword |
| Search Analytics API | 25,000/request, 50,000/day per type | Sites up to a few thousand pages |
| Bulk export to BigQuery | No row limit | Large sites, repeatable pipelines |
Whatever the source, pivot the result so each query shows the top 2-3 of your own URLs ranking for it. Those multi-URL queries are your candidate list.
Step by step
- Export 90 days of query, URL, clicks, impressions, and position. Pivot so each query lists the top 2-3 of your URLs.
- Flag candidate pairs — any query where two of your URLs both rank on the first two pages. A few lines of script (or a spreadsheet
COUNTIFS) surfaces these in seconds. Prioritize pairs that also show rank swapping across the 90-day window. - Classify with AI. For each pair, paste the shared queries plus the first ~500 words of both articles. Ask for one verdict — merge, differentiate, or leave alone — with a one-line reason.
- For merge candidates, have AI draft a unified outline that favors the stronger URL (more inbound links, or higher current position). The other URL gets a 301.
- For differentiate candidates, have AI propose two distinct title + intent angles, e.g. one page owns the how-to query, the other owns the comparison query.
- Execute one batch per week. Merges are riskier (redirect + rewrite + monitor); differentiations are safer (title, H1, and a few body paragraphs).
- Monitor each pair for 4-8 weeks. On a merge, the kept URL should climb 3-5 positions; differentiated pairs should both improve as intent clarifies.
A classification prompt that works
Keep it terse and force a single verdict so the output is sortable:
You are an SEO editor. Two of my URLs both rank for these shared queries:
[paste 3-8 shared queries with each URL's avg position]
URL A (first 500 words): [paste]
URL B (first 500 words): [paste]
Decide ONE verdict: MERGE, DIFFERENTIATE, or LEAVE_ALONE.
- MERGE if the two pages serve the same intent and largely duplicate.
- DIFFERENTIATE if they could serve distinct intents with a title/H1 pivot.
- LEAVE_ALONE if they already serve different intents well.
Return: verdict, the winner URL (for MERGE), and one sentence of reasoning.
GPT-5.5, Claude Sonnet 4.6, and Gemini 3.1 Pro all handle this reliably; their 1M-token context (Sonnet 4.6 and Gemini 3.1 Pro standard, GPT-5.5 on the $200 Pro tier) means you can paste full articles rather than 500-word snippets when a pair is genuinely close. Save AI’s verdict next to your final call — the disagreements are where you learn the prompt’s blind spots and tighten it for the next batch.
Quality check before you ship a fix
- Every merge has a defined winner chosen on real signals — inbound links first, current position second, content depth third. If all three disagree, keep the older URL; it has accrued more trust. Coin flips lose authority.
- Every 301 lands on a topically relevant URL, not a category index. Mismatched redirects get reclassified as soft 404s and the signal is wasted.
- After a merge, the kept URL absorbs every unique value from the redirected one. Losing unique content is the number-one way merges backfire.
- Differentiations land in the visible title and H1, not just frontmatter. Google ranks on what it can render.
Common mistakes
- Merging on title similarity alone. Similar titles can mask distinct intent — verify against query and body, then leave them.
- Deleting the loser instead of 301-ing it. Deletion drops every external link pointing at that URL; a 301 forwards the equity.
- Differentiating only the title while the body stays overlapping. Google reads the body, not just the tag.
- Merging across categories. Topical context matters; a tutorial and a news piece on the same query usually belong apart.
- Using a 30-day window. Too short to separate signal from noise. Use 90 days.
- Skipping the post-merge monitor. Occasionally the merged page ranks worse; you need to catch that inside the 8-week window to revert.
Make it repeatable
- Re-run quarterly. Cannibalization regrows whenever you publish near old content.
- Keep a “merged URL” log with each redirect target and merge date. It saves you when a future contributor accidentally recreates a merged article.
- Add a pre-publish guard. Require every new article to declare its primary query, and warn if an existing URL already ranks for it. Ahrefs and Semrush Site Audit both ship a cannibalization report you can run alongside your own pass for a second opinion.
FAQ
- How do I pick the winner URL in a merge? Inbound links first, current position second, content depth third. If all three disagree, keep the older URL — it has accrued more trust.
- Can I merge three URLs at once? Yes, but it’s rarely worth it. Three-way merges produce sprawling articles; prefer two clean two-way merges.
- What if AI says “leave alone” but I disagree? Trust your judgment on intent. AI reads text well but lacks your site context and editorial taxonomy.
- How long until rankings move on the kept URL? Plan for 4-8 weeks (as of June 2026). Google consolidates 301 signals over a few weeks, but the redirect must be crawled and the kept URL re-indexed first.
- Does cannibalization apply to category pages? Yes. A category page and a popular article competing on one query is a common pattern.
- Should the merge target be a fresh URL? No. Pick the stronger of the two existing URLs. A fresh URL starts from zero authority.