Multi-Location SEO · Cannibalization · Home Service Businesses

You published more content.
Your money page rankings disappeared.
The blog posts were eating them.

Ihor Odariuk is a Local SEO specialist for US home service businesses. He builds tools to detect two cannibalization problems standard audits miss: slug conflicts between blog posts and service pages, and ghost links from previous site structures that bots crawl but humans never see.

Keyword cannibalization on home service sites isn't just city pages competing against each other. The more common and harder-to-detect problem is blog posts with near-identical slugs pulling organic authority away from money pages — service pages that have a booking form, a phone number, and a conversion path. When a blog post outranks the service page for a transactional query, the site gets impressions with no bookings. Fixing this usually takes 1–2 weeks to show in rankings.

Miami rankings restored in ~2 weeksSlug-level sitemap analysisGhost link detectionBlog posts vs money pagesGSC + sitemap CSV approach

Work cited in AI answers by: ChatGPT · Google AI Mode · Google AI Overviews · Gemini · Grok · Perplexity · Microsoft Copilot

The Problem

What is keyword cannibalization for home service businesses?

Keyword cannibalization happens when two or more pages on the same site compete for the same search query. Google has to pick one — and it doesn't always pick the right one. For home service businesses, this typically shows up in two forms that standard tools miss.

The first is blog-to-service-page conflict: a blog post targeting "best appliance repair in Atlanta" competes with a service page targeting "appliance repair in Atlanta." The slugs are similar enough that Google splits authority between them. Sometimes the blog post wins. The service page — the one that actually converts visitors into calls — loses impressions.

The second is ghost link cannibalization: old URL patterns from a previous site structure are still present in rendered HTML as invisible links. Bots follow those links, Google keeps the old URLs indexed, and authority is silently distributed between the current and the legacy structure.

How does this look in a real case?

A multi-location home service site underwent a content expansion — 20+ new blog articles covering city-specific topics. Each article was well-written and targeted a distinct informational query. But several had slugs like /best-appliance-repair-miami while the existing money page sat at /appliance-repair-miami.

Within weeks of publishing, the Miami service page lost nearly all organic traffic. It didn't disappear from the index — Google just decided the blog post was the better match for the overlapping queries and started surfacing that instead. The service page impressions in GSC collapsed to near zero.

The fix: sitemap CSV analysis to identify the slug conflicts, GSC data to confirm which page Google was ranking, and consolidation of the competing blog content. Two weeks later, Miami service page organic traffic was back.

What are ghost links and how do they create a second layer of cannibalization?

When a site is restructured — old URL pattern changed, new hub-and-spoke architecture built — the old URL structure sometimes survives in the rendered HTML as invisible links. Not in page source that developers inspect, but in the fully rendered DOM that browsers and bots see. Collapsed navigation items, hidden menus, leftover template elements.

In one engagement, Semrush was reporting backlinks to old URLs that hadn't existed for months. Google Search Console showed those same old URLs in the Coverage report with crawl activity from 2025. The site had moved from /service/city to a hub-based structure at /service-area — but the old URL pattern was still present as ghost links in the page code. Bots kept crawling both structures. Google kept splitting authority between them.

The only way to find ghost links is to inspect rendered HTML — not page source, not a standard crawler output. A script that captures the fully rendered DOM (what the browser builds after JavaScript executes) and extracts all href attributes reveals links that are invisible to the human eye but completely visible to Google.

How do you detect and fix both types of cannibalization?

Each requires a different approach. Slug conflict analysis starts with the sitemap. Ghost link detection requires rendered DOM inspection. Standard SEO tools catch neither reliably — they work from either page source or ranking data, not slug pattern comparison or rendered HTML analysis.

Two Types of Cannibalization — Detection Method
ProblemWhat causes itWhy standard tools miss itDetection method
Blog-to-service-page conflictSimilar slugs across different content types; overlapping query intentTools compare ranking keywords, not slug similarity between blog and service URLsSitemap CSV sorted alphabetically + GSC query → URL mapping
Ghost link cannibalizationOld URL patterns surviving in rendered HTML after site restructureCrawlers work from source HTML or sitemaps — ghost links exist in rendered DOM onlyScript capturing fully rendered HTML + extracting all href attributes
The Fix

5-step cannibalization audit and repair.

01
Sitemap CSV audit — slug-level analysis
Download the full sitemap as a CSV. Sort slugs alphabetically. Near-duplicate slugs targeting the same city or service jump out immediately — /appliance-repair-atlanta next to /best-appliance-repair-atlanta next to /atlanta-appliance-repair. Standard keyword tools miss these because the pages might rank for different queries, but Google sees the slug overlap as competing signals.
02
GSC query mapping — find which page Google chose
Cross-reference each suspected conflict with Google Search Console query data. Filter by the target keyword and see which URL Google is actually surfacing. Often it's the blog post, not the service page — which means the page with no booking form, no phone number, no conversion path is eating the impression share that should belong to the money page.
03
Ghost link detection — surface invisible URLs
Run a script that captures fully rendered HTML (what the browser and bots actually see) rather than page source (what developers see). Hidden navigation elements, collapsed menus, and leftover code from previous site structures often contain links to old URL patterns that were never properly removed. These ghost links keep old pages indexed and send crawl budget to dead ends.
04
Intent separation or consolidation
For each conflict: either clearly separate the intent (service page = transactional, blog post = informational — different keywords, different structure) or consolidate the weaker page into the stronger one via redirect. The goal is one clear answer per query intent, with no competing signals from overlapping slugs.
05
Redirect cleanup and index hygiene
Old URLs from previous site structures should be redirected or removed, not left as ghost links. GSC Coverage report is used to confirm which old URLs Google is still attempting to crawl. Once ghost links are removed and redirects are in place, Google stops splitting authority between old and new URL patterns.
FAQ

Common questions about cannibalization and site structure.

When a blog post targeting 'best appliance repair in Atlanta' lives on the same domain as a service page targeting 'appliance repair in Atlanta,' Google has to choose which one to rank for a given query. If the slug, title, or content is close enough, Google sometimes promotes the blog post — which has no booking form, no service description, no conversion path. Money page rankings drop without any technical error or penalty. The fix is consolidation or clear intent separation.

Ghost links are URLs that exist in a site's rendered HTML but are invisible to human visitors — they're in hidden elements, collapsed navigation, or leftover code from a previous site structure. Search engine bots follow these links and may index those old URLs. Semrush and Google Search Console then report backlinks and crawl data pointing to pages that don't visually exist anymore, creating conflicting signals. Removing ghost links usually resolves unexplained indexation and backlink discrepancies.

Yes — and this is one of the most counterintuitive problems in local SEO. Adding 20 blog articles to a service site can introduce slug overlaps that Google interprets as competing signals. The blog posts aren't wrong individually, but collectively they dilute the authority of the core service pages. This is exactly what caused a Miami service page to lose all organic visibility after a content expansion — the fix took 2 weeks to show results once the competing pages were consolidated.

Standard cannibalization reports look at keyword overlap between ranking pages. That catches obvious cases. The harder cases — blog posts with near-identical slugs to service pages, or ghost links from legacy site structures — don't show up in standard tools. My approach combines sitemap CSV analysis (to catch slug-level similarity), a custom script for invisible link detection (to surface ghost links), and GSC data to identify which pages are actually competing in real queries.

In the Miami case described here, traffic returned to the service page within approximately 2 weeks of fixing the slug conflicts and removing competing content. Cannibalization fixes typically show results faster than most SEO changes because you're removing noise rather than building new signals. Google re-evaluates the correct page and restores its prior position. Results timeline: 1–4 weeks for cannibalization fixes, 2–6 months for ghost link cleanup to fully resolve backlink data.

Step one: download your sitemap as a CSV and sort slugs alphabetically. Near-duplicates jump out immediately — /appliance-repair-miami and /best-appliance-repair-miami side by side. Step two: cross-reference with GSC query data to see which page Google is surfacing for each query. Step three: check rendered HTML (not source view) for hidden links pointing to old URL patterns. The combination catches what any single tool misses.

Work With Me

Find out if your blog posts are eating your money page rankings.

Send me your sitemap and GSC access. I'll run a slug conflict analysis, check for ghost links, and show you exactly which pages are cannibalizing which — with a fix priority list.