Skip to content

Keyword cannibalization detection

Watches a keyword sheet, pulls 30 days of GSC data per site, and has an AI model flag which keywords have several pages competing – with fixes written back to the sheet.

What the keyword cannibalization checker does

You keep a Google Sheet of target keywords – the ones each of your clients is trying to rank for. This keyword cannibalization checker watches that sheet. Whenever you add or edit a keyword, it triggers: it pulls 30 days of Google Search Console data for the right client, finds every page on that client's site that's ranking for the keyword, and asks an AI model to assess cannibalization risk.

The output goes back into the sheet next to each keyword: High / Moderate / Low / None risk, plus a sentence explaining the reasoning ("5 pages from the same domain rank for this keyword, top page is at position 8, others scattered 14-42 – classic cannibalization") and a remediation step ("Consolidate the 3 weakest pages into the strongest, 301 redirect the others").

About 2-4 minutes per keyword from edit-the-sheet to risk-assessment-written-back. Across 100-200 keywords, a full portfolio check runs unattended overnight instead of taking someone a week.

How to identify keyword cannibalization before traffic splits

Cannibalization is one of those SEO problems that's obvious in hindsight and invisible until you go looking. You write a post about "B2B email marketing best practices" in 2022. In 2023 a new strategist writes a similar post titled "Email marketing for B2B SaaS".

In 2024 someone updates a product page with the H1 "B2B email marketing software". Now Google sees three pages from your domain all kinda-sorta targeting the same intent, and none of them ranks well because Google can't decide which one is the real answer.

Most teams find out about cannibalization in one of three ways:

  1. They don't. The pages quietly underperform. Traffic that should be going to one page at position 2 is instead split across three pages at positions 14, 27, and 41. None of them earns meaningful traffic.
  2. A consultant audits the site and points it out. That's a paid, one-off keyword cannibalization audit that takes weeks and produces a single report. Six months later there's new cannibalization it didn't catch.
  3. They run a keyword cannibalization tool. Existing tools (Keylogs, Ahrefs cannibalization report, etc.) flag pairs of URLs ranking for the same keyword. But "two URLs rank for the same keyword" isn't cannibalization on its own – sometimes it's totally fine (a category page + a deep article that target related but distinct intents). The signal-to-noise ratio is bad enough that most teams turn the alerts off.

This workflow gets the signal-to-noise right because of the AI step. The model looks at the full ranking pattern (how many pages, at what positions, with what click distribution) and judges whether it's a real cannibalization problem or just two pages doing different jobs.

It's the difference between "1 page at position 4 + 1 page at position 38 = probably fine, they target different intents" and "5 pages between positions 8-42 = clear cannibalization, consolidate".

If you look after several sites, the workflow turns cannibalization checking from a periodic audit into a permanent monitor that catches new cases within days. The pattern it hunts for is the one to look for by hand too: several URLs from one domain ranking for the same query, with none of them holding a top position.

The sheet and GSC access it runs on

A one-time setup:

  • Google Sheet with two tabs:
    • Tab 1: Client URLs – one row per client (domain + GSC property)
    • Tab 2: Target Keywords – one row per keyword (keyword text + which client it's for)
  • GSC access to each client's property (service account)
  • An OpenAI API key

Per-run inputs: none. The workflow runs every time someone edits the Target Keywords sheet.

Risk levels, reasons and how to fix keyword cannibalization

For each keyword you add or edit, within 2-4 minutes the sheet row gets these columns populated:

  • Risk level – High / Moderate / Low / None
  • Reasoning – 1-2 sentences explaining the risk assessment (which pages compete, at what positions, what the pattern suggests)
  • Observations – Specific data points the AI noticed (e.g. "Top-ranking page has 4x the impressions but worst CTR – likely outdated meta description")
  • Remediation steps – Concrete next actions (consolidate-and-redirect, rewrite-the-loser, distinguish-the-intents, leave-alone)
  • The competing URLs themselves – Each cannibalizing page's URL, current position, clicks, impressions, CTR

The sheet becomes your live cannibalization dashboard. Sort by risk level, filter to a single client, hand the "High" rows to your strategist as a fix list. The "None" rows are already audited – no work needed.

When the fix is rewriting the page that should win, that URL and its keyword are exactly what the content refresh workflow starts from.

Two to four minutes per keyword

Workflow time: 2-4 minutes per keyword. GSC API call (1 min), grouping + matching logic (a few seconds), AI analysis (1-2 min), write back to sheet (a few seconds).

Your time: seconds. You add a keyword, the workflow does the rest while you go do something else. Come back later, the row is populated.

For a full portfolio audit of 200 keywords across 4 clients: about 8-12 hours of workflow runtime (parallel where possible), zero hours of human time during the run. Checking the same 200 keywords by hand at five to ten minutes each would take roughly 17 to 33 hours.

Who gets the most from it

The checker pays back its setup when most of these are already true:

  • You manage multiple client sites (the four-way client routing is built for agencies and multi-brand teams). For a single site, the manual version is fine.
  • Your clients have at least 50 indexed pages each. Below that, cannibalization is rare and easy to spot by eye.
  • You're already maintaining a target keyword sheet per client. The workflow piggybacks on that – it doesn't ask you to create new infrastructure.
  • You're willing to act on the output. Cannibalization risks need a strategist's call (consolidate? rewrite? leave alone?). The workflow does the detection + suggestion, not the execution.

If the last point is the shaky one, fix that first. A risk score nobody acts on is just a nicer-looking spreadsheet.

When a manual keyword cannibalization audit is enough

Four situations where the setup isn't worth it:

  • You manage one site. Build the manual version in an afternoon, save 1-2 weeks of setup.
  • You don't have target keywords sheeted out. The workflow needs that as input – without it, there's no scope of what to check.
  • You're trying to automate the fix as well as the detection. The remediation steps are suggestions; the actual consolidating / redirecting / rewriting needs human judgement and access to your CMS. Different workflow.
  • Your clients use non-Google-Search-Console SEO tooling exclusively. The workflow runs on GSC API. Bing Webmaster Tools data is out of scope.

The manual check itself is quick: open the GSC Performance report, filter to a single query, and switch to the Pages tab. Two or more URLs splitting the clicks is your shortlist to review.

What runs inside n8n

About 25 n8n nodes do the work, in this order:

  1. Google Sheets trigger – watches the Target Keywords tab, fires on edit
  2. Fetch client URLs from the Client URLs tab
  3. Router – 4-way client routing based on which client the edited keyword belongs to
  4. Per-client branch: fetch 30 days of GSC data for that client
  5. Per-client branch: group the GSC response by keyword (each keyword gets an array of pages that rank for it, with position + clicks + impressions + CTR)
  6. Merge – combine all 4 client branches back into one stream
  7. Match the target keywords from the sheet against the actual GSC data – flag keywords not found in GSC, only continue with the ones that have ranking data
  8. AI agent – for each matched keyword, ask the model (GPT-4o in the current build) to assess cannibalization risk given the page rankings
  9. Structured output parser – force the AI response into a fixed JSON shape (risk level + reasoning + observations + remediation + competing URLs)
  10. Write the parsed result back to the Target Keywords sheet

The four-way routing is what lets SEO cannibalization detection scale past one site. Each client's GSC property has its own service-account access and its own rate-limit budget – running them in parallel branches means the workflow doesn't choke on the slowest client.

The AI prompt is where the signal-to-noise problem gets solved. It encodes the rules: 5+ pages from the same domain ranking for the keyword = High risk. 3-4 pages with overlapping intent = Moderate. 2 pages with clear dominance (one at position 1-3, one below 20) = Low or None.

The prompt also gets the click and impression distribution, so it can tell "2 pages competing but one is winning" (often fine) from "2 pages competing and splitting the clicks" (a real problem).

The files and prompts you keep

Everything is handed over in a form your team can read and change:

  • The full n8n workflow file
  • The Google Sheet templates (Client URLs tab + Target Keywords tab) with the column structure the workflow expects
  • The prompt + structured output schema, documented in plain English
  • A setup doc covering service account creation per client, GSC permission grants, OpenAI key setup, Sheets sharing
  • A runbook for the common errors: GSC quota exceeded for a single client, AI parser failure when the model invents fields, sheet-row-conflict when two edits hit close together
  • A Loom showing one keyword going through the full workflow
  • Optional add-on: scale beyond 4 clients (the workflow can be parameterized to N clients with a different routing approach – mention if you have 5+ retainers)
  • Optional add-on: bulk-import of historic target keywords (so you can audit 1,000+ legacy keywords in one batch run instead of one-at-a-time)

None of it depends on staying a client. The workflow runs on your n8n instance, your OpenAI key and your Google account.

Three calls that make the risk scores trustworthy

The mechanics are roughly: GSC API + an OpenAI model + Google Sheets. The hard part is the risk-classification logic, which is where most cannibalization tools (including the well-funded ones) fail.

Three specific decisions in this workflow that took iteration:

  • The "is this actually cannibalization or just multiple pages doing different jobs" check. The model is good at this if you give it the click + impression + position distribution. Naive versions just count pages ("3 pages = cannibalization") and bury the real cases under false positives.
  • The 30-day window. Too short (7 days) and the data is too noisy – Google's SERP shuffles a lot week-to-week. Too long (90 days) and you miss recent cannibalization. 30 days is the sweet spot for B2B SaaS sites; we'd retune for sites with very different traffic profiles.
  • The structured output parsing. The model's natural output drifts in format – sometimes risk levels are "High / Med / Low", sometimes "1/2/3/4", sometimes "Critical / Warning / OK / Fine". The structured output parser locks the shape so the sheet always gets exactly the same column structure regardless of how the model phrased the response.

These are the things that turn the workflow from "interesting demo" into "thing that runs unattended and produces output your strategist trusts". The setup phase tunes them for your specific portfolio.

Token costs per keyword

Per keyword: about $0.02-0.05 in OpenAI tokens (the model is the cost driver; the GSC API is free). For 200 keywords audited per month: $5-15/month in OpenAI cost.

n8n hosting: about $10-15/month if self-hosted at the volume an agency uses.

It isn't sold as a one-off build. The checker runs as part of execution capacity, $2,000 a month flat for AI agents and automations, added to a fractional Head of Content engagement. The slowest part of setup is tuning the prompt against real cannibalization examples from your portfolio, so the risk calls match what your strategist would have made by hand.

Test it on keywords you already know

Start with one site you already understand. Bring its target-keyword sheet and GSC access to a call, and we'll run the checker on 10-20 keywords live, so you can judge the output against what you already know. Adding more sites after that is mostly service-account plumbing.

Want this built for your team?

Book a call and walk through what we'd adapt for your stack.