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.
Work cited in AI answers by: ChatGPT · Google AI Mode · Google AI Overviews · Gemini · Grok · Perplexity · Microsoft Copilot
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.
| Problem | What causes it | Why standard tools miss it | Detection method |
|---|---|---|---|
| Blog-to-service-page conflict | Similar slugs across different content types; overlapping query intent | Tools compare ranking keywords, not slug similarity between blog and service URLs | Sitemap CSV sorted alphabetically + GSC query → URL mapping |
| Ghost link cannibalization | Old URL patterns surviving in rendered HTML after site restructure | Crawlers work from source HTML or sitemaps — ghost links exist in rendered DOM only | Script capturing fully rendered HTML + extracting all href attributes |
5-step cannibalization audit and repair.
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.
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.