Site structure
Is keyword cannibalization killing your map rankings?
How a page for every city can quietly push a contractor out of the map pack, what it looked like on a real plumbing site, and how to find and fix it on yours.
Short answerKeyword cannibalization is when several pages on your site answer the same search, so Google can’t tell which one should rank. On contractor sites it usually comes from near-identical city pages and overlapping service pages. Fix it by giving each search intent one page, merging the rest with 301 redirects and pointing internal links at the winner.
Keyword cannibalization gets described as a small leak: two pages splitting clicks, a bit of lost momentum. On a home service website it can be a lot worse than that. When dozens of pages all raise their hand for “plumber near me”, Google picks one, discounts the rest, and the authority your site earned gets spread thin across weak pages. The result can show up on the map, not just in the blue links, and it happens with no warning message from Google.
This guide covers what that looks like in practice, how to diagnose it on your own site, and how to fix it without throwing away pages that are doing real work.
What keyword cannibalization looked like on a plumbing site
Digital Ducats worked with a plumbing company whose map rankings had eroded across its service area. Its ranking grid (a scan of map positions from points across the area) for a core keyword showed the business in first place at its own address and in positions five through ten almost everywhere else. That put it outside the 3-pack, the three businesses Google shows on the map, for most of the people searching nearby.
Nothing was wrong with the Google Business Profile. No lost reviews, no spam action. The problem was the website. Over several years it had picked up a page for every city it served, plus service pages added one at a time: a repair page, a service page, an emergency page. Each sounded distinct in a planning meeting. In a search result they were the same answer. Multiply that by a city page for each term and the site had dozens of URLs competing for one query.
The fix was consolidation, not new content. Decide which page owns each intent, 301-redirect the pages that no longer had a job, and point internal links at the page meant to win. Six days after the work was finished, nearly the whole grid had moved into the top three, most of it at first place: roughly a 70% improvement in average ranking position. A second tracked keyword, which had been stuck mid-pack across the same grid, climbed with it. The full write-up, with the before and after grids, is in Digital Ducats’ plumber Google Maps case study.
Those rankings weren’t built in six days. They were unblocked. The authority was already there; it was just split across pages fighting each other.
Why city page cannibalization can drag down the map
Google says local results are based mainly on relevance, distance and prominence, and that your position in regular web results counts toward prominence (Google Business Profile Help, “Tips to improve your local ranking on Google”). So the organic strength of the page your profile links to isn’t separate from your map rankings. If that page is losing a tug-of-war with fifteen clones of itself, the map can feel it.
There’s a policy angle too. Google’s spam policies in Search Essentials describe doorway pages, and one of the listed examples is having pages targeted at specific regions or cities that funnel users to one page. A batch of city pages that differ only by the town name in the headline sits uncomfortably close to that description. Most cannibalization isn’t spam. But the same habit that causes it, publishing the same page over and over with a word swapped, is the habit Google warns about.
How to diagnose SEO cannibalization on a contractor site
You don’t need special software to find most of it. You need a page list, Google Search Console and an honest eye.
1. List every page Google can index
Pull your XML sitemap or export the page list from WordPress. Include blog posts. Old posts like “Signs you need a new water heater” often compete with the service page you actually want ranking.
2. Run the same-search test
Go through the list and ask one question of each group: if a customer typed this page’s main search into Google, would the other page satisfy them just as well? If yes, they’re competing. “Drain cleaning” and “drain unclogging” are one intent. “Water heater repair” and “tankless water heater installation” are two. City pages are the hardest call: “AC repair Plano” and “AC repair Allen” are different searches, but if both pages say the same thing in the same order, Google has little reason to treat them as different answers.
3. Check Search Console for URL swapping
In Search Console’s Performance report, filter by one of your money queries, then open the Pages tab. If several of your URLs show impressions for that one query, or the ranking URL keeps changing from week to week, that’s the clearest sign of cannibalization you’ll get from Google’s own data.
4. Inspect the canonical Google picked
Run your key pages through the URL Inspection tool. It shows the canonical you declared and the “Google-selected canonical”. When Google picks a different page than you did, it’s telling you it sees the two as duplicates.
5. Compare against your map grid
If your grid looks like the plumber’s before picture, strong at your address and weak everywhere else, and your profile is healthy, look at site structure before you spend on links or reviews.
| What you see | What it usually means |
|---|---|
| Two or more URLs getting impressions for the same money query | Pages competing for one intent |
| The ranking URL changes week to week | Google can’t settle on a winner |
| A blog post ranks above your service page | The post covers the service intent better than the service page does |
| Google-selected canonical differs from yours | Google sees the pages as duplicates |
| City pages indexed but getting almost no impressions | Google is discounting the set as thin or repetitive |
How to fix it
Every fix comes back to one rule: one search intent, one page. Pick the page that should own each intent, usually the one with the most links, the best rankings history or the clearest content, then deal with the rest.
- Merge and redirect. Move anything useful from the losing page into the winner, then 301-redirect the old URL to it. Google’s documentation describes a permanent server-side redirect as the strongest signal that one URL has replaced another. This is what the plumbing site did, and it’s the right call most of the time.
- Differentiate. If two pages really serve different jobs, rewrite them so the difference is obvious: different titles, different headlines, different content. An emergency page that’s about after-hours response, pricing and what to do before the truck arrives is a real page. One that repeats the repair page with “24/7” added isn’t.
- Canonical tag. For near-duplicates that need to stay live for users, point a canonical tag at the main page. Google treats canonicals as a hint, not a command, so don’t rely on them for pages you could simply merge.
- Remove. A page with no traffic, no links and nothing worth saving can be deleted. If it has any links pointing at it, redirect it instead.
Then clean up the plumbing around it:
- Update internal links, menus and footers so they point straight at the winning pages, not at redirects.
- Remove redirected URLs from your XML sitemap.
- Make sure your Google Business Profile links to the page that now owns your main service.
- Run the same grid and Search Console checks two to four weeks later and compare.
Mistakes that make it worse
- Deleting pages without redirects. You throw away whatever links and history those pages had.
- Noindexing the strongest page by accident. Check which page actually ranks and earns calls before you choose a winner.
- Consolidating, then rebuilding the clones. If your agency’s monthly plan is “five new city pages”, the problem comes back.
- Treating it as a content refresh. Rewriting fifteen near-duplicates into fifteen slightly different near-duplicates rarely changes Google’s mind.
Do you still need city pages?
Sometimes. A city page earns its place when it has something the others don’t: real jobs, photos and reviews from that area, local conditions that change the work, and a reason for a homeowner there to call you. If you can’t write that, you don’t need the page yet. How to build the ones worth building is covered in city pages that actually rank.
If your rankings have been sliding with no obvious cause, site structure is one of the first things we check in an SEO audit. Want a second set of eyes on your page list and your map grid? Get in touch and we’ll walk through both on a discovery call. More guides like this one are in our local SEO resources.
Cannibalization questions
Is keyword cannibalization a Google penalty?
No. There’s no manual action and no Search Console message for it. Google simply has several pages competing for one search, picks one, and discounts the rest. That’s why it’s easy to miss: rankings erode across your area instead of dropping overnight, and owners notice it as a quieter phone rather than a technical problem.
How many city pages is too many?
There’s no safe number. The question is whether each page says something the others don’t. A city page with real jobs, photos, reviews and local detail from that area can earn its place. Pages that only swap the town name are the problem, whether you have five of them or fifty.
Will 301 redirects lose the rankings my old pages had?
Google’s documentation treats a permanent redirect as a strong signal that the new URL replaces the old one, so links and history are passed along rather than thrown away. Redirect each old page to its closest match, not all of them to the homepage, and update your internal links so they point straight at the new page.
Can a blog post cannibalize a service page?
Yes, and it’s common. A post like “How much does drain cleaning cost?” can outrank your drain cleaning page if it covers the service better. Either fold the useful parts into the service page and redirect, or rewrite the post so it answers a different question and links to the service page.