
What this issue means
hreflang is a lookup table. Each row maps one language or language plus region code to one URL: en-us goes here, fr-fr goes there, x-default goes to the fallback. The rule that makes the table usable is that every code appears once and points at a single canonical URL. This check flags the case where the same code shows up twice with different destinations, for example two separate en-gb lines aimed at two different pages within the same cluster.
When that happens you have handed the search engine a contradiction. You told it that British English lives at page A and also at page B. There is no rule that lets it choose, so the safe behavior is to distrust the annotation. In practice the conflicting code, and sometimes the entire cluster, gets thrown out, which quietly disables the language targeting you built the whole international setup to get.
How it sneaks in
Nobody writes two en-gb tags on purpose. It creeps in through automation and duplication.
- A CMS plugin injects hreflang into the head while a hardcoded template also outputs it, so you get two sources stacking the same codes.
- An XML sitemap declares one target for a code while the on page tag declares another, and the two disagree.
- A parametered and a clean version of the same localized page both get listed under one code, for example
/de/?ref=navand/de/. - www and non www, or http and https, variants of the same page both appear, which the crawler reads as two distinct URLs for one code.
- A trailing slash difference produces two URL strings the parser treats as separate targets.
Why it matters for rankings
hreflang does not boost rankings on its own. What it does is make sure the right localized page is the one shown to the right audience once you are already ranking. Break it and Google falls back to its own guess, which frequently means the US page surfaces in a UK search, or a language the user does not read appears. The user bounces, the localized page you invested in gets no traffic, and your regional numbers look soft for no obvious reason. Because the English or primary version is unaffected, this is a classic silent leak that survives for months until someone audits the cluster.
How to detect it
- Screaming Frog: crawl with hreflang storage on, then check the Hreflang tab for the Multiple Entries and Inconsistent filters. It lists any code that resolves to more than one URL.
- Google Search Console URL Inspection: view the rendered alternates for a suspect page and eyeball whether a code appears twice.
- View source and the HTTP headers: a fast manual check is to search the page source for a code like
en-gband count the hits. More than one with different hrefs is your problem. Remember hreflang can live in the head, the sitemap, or HTTP headers, so check all three. - Sitebulb: its hreflang audit surfaces conflicting and duplicated targets with the reciprocal map alongside.
How to fix it
- Find every place hreflang is emitted for the affected pages: template, plugin, sitemap, and headers. Duplicate sources are the usual root cause.
- Pick one canonical URL per code. It should be the indexable, self canonical, 200 responding version, no parameters, correct protocol, correct slash.
- Remove the second emitter or reconcile the two so the code maps to that single URL everywhere.
- Normalize the URL strings: pick www or non www, https, and a single trailing slash convention, and apply it across every annotation.
- Confirm the return links stay reciprocal after the cleanup, since collapsing two targets into one can orphan a return link.
- Recrawl and verify the Multiple Entries filter is empty.
Do this, not that
- Map exactly one canonical URL to each code.
- Emit hreflang from a single source of truth.
- Normalize protocol, host, parameters, and slashes.
- Point at self canonical, 200 URLs only.
- Recrawl to confirm no code has multiple entries.
- Let a plugin and a template both output hreflang.
- List a parametered and a clean URL under one code.
- Mix www and non www variants in the cluster.
- Assume the sitemap and on page tags agree.
- Point a code at a non canonical duplicate.
Reference: valid versus conflicting
| Code | Conflicting setup | Valid setup |
|---|---|---|
| en-us | /us/ and /en/ both listed | /us/ only |
| fr-fr | /fr/ and /fr/?ref=nav | /fr/ only |
| de-de | http and https versions | https only |
| x-default | two fallback URLs | one fallback URL |
FAQ
Can two different codes point at the same URL?
fr-fr, fr-be, and fr-ca. The rule this check enforces is the reverse: one code must not point at two URLs.Is a trailing slash difference really enough to trigger this?
/de/ and /de read as two targets for one code. Normalize your slash convention and the phantom duplicate disappears.Which target does Google keep when there is a conflict?
The conflict comes from my sitemap and my page tags disagreeing. Which wins?
Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.
About SEO ProCheck
Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.
Work With Me
Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.







