Template
Keyword Cannibalization Analysis
Inspired by Jean-Christophe implementation: https://www.jcchouinard.com/seo-cannibalization-analysis
Keyword cannibalization happens when two or more pages on your site rank for the same query, forcing Google to decide which one to show. Instead of one strong ranking, you end up with several weaker listings, diluted clicks, and confused visitors. As search engines double-down on topical authority and “helpful content,” letting pages fight each other is leaving easy traffic—and revenue—on the table. For additional insights into streamlining your site’s performance, you might find our article on auditing website content at scale with AI useful.
How the “KW Cannibalization Analysis” App Works
This app takes raw Google Search Console (GSC) data and pinpoints every query where more than one of your pages is competing. Here’s the flow built in Moonlit:
1. Pulling GSC data
The Google Search Console node grabs 12 months of performance data (clicks, impressions, CTR, average position) for every query-page pair on the property you specify. By selecting both “query” and “page” dimensions, we get a row for each combination, which is exactly what we need to spot overlap.
2. Python clean-up & analysis
The custom Python block does all the detective work:
Remove branded terms. Any words you list in “Excluded keywords” are stripped out with a simple regex, so brand traffic doesn’t cloud the results.
Find true cannibalization. It groups rows by query and keeps only those that rank more than one unique page. Single-URL queries are harmless and get dropped.
Quantify the damage. For each remaining row, it calculates:
- clicks_pct_vs_query: share of total clicks that URL gets for that query.
- clicks_pct_vs_page: share of that page’s total clicks coming from this query.Flag actions. If a URL owns at least 10 % of clicks at both the query and page level, it’s labeled “Potential Opportunity” (worth consolidating or refocusing). Anything weaker is marked “Risk.” For more ideas on streamlining your content process, check out our post on Content Automation.
The script returns a tidy JSON table ready for inspection or export.
Customizing This App
Customization | Description |
---|---|
Adjust the time window | Change the |
Tweak the opportunity threshold | Modify the cut-off value (e.g., from |
Add positions or CTR logic | Incorporate average position or click-through rate checks to highlight cases where neither page ranks in the top 20—helpful for finding easy optimization wins. |
Write follow-up actions | Append columns with actionable suggestions like “merge,” “canonical,” or “re-optimize” based on detected page types or template patterns. |
Pipe to other Moonlit tools | Automatically send flagged URLs to tools like a content-brief generator or internal-linking workflow for seamless, closed-loop optimization. Check out our guide on stitching workflows here. |
Running It at Scale with Bulk Runs
Create a CSV with two columns: GSC Property name and (optional) Excluded keywords.
Head to Bulk Runs, choose this app, and upload the file.
Map each column to its corresponding input and hit Run. Moonlit spins up a separate analysis for every property—ideal for agencies managing dozens of sites.
Why It Matters
With AI content multiplying and Google rewarding clear topical hubs, cannibalization quietly erodes authority, click-throughs, and conversions. A quick monthly scan with this app surfaces the conflicts so you can consolidate pages, streamline internal links, and send stronger signals to Google—all before traffic slips away.