
What a duplicate hreflang actually is
Hreflang is a set of annotations that tell Google and Yandex which URL serves which language and region. Each annotation is a pairing: a value like en-gb or fr-ca mapped to exactly one URL. A duplicate breaks that one-to-one contract in one of two ways.
The first flavor is a repeated value pointing at different URLs. You declare hreflang="de" twice on the same page, once for /de/pricing/ and once for /de-at/pricing/. Now the search engine has two candidate German pages and no rule to choose between them. The second flavor is the exact same URL declared twice under the same value, usually because two plugins or a plugin plus a hand-coded tag both fired. Less harmful, but still noise that pollutes the cluster and hints at a config that is out of control.
Either way the annotation set is now contradictory. Google's documentation is blunt about this: if hreflang tags are ambiguous or invalid, they get ignored. You do not get partial credit. One duplicate can knock out the localization signal for the entire page group, which is a rough trade for a copy-paste slip.
Why it hurts rankings and the user experience
When hreflang works, a searcher in Munich gets your German page and a searcher in Manchester gets your UK English page, even if both queries are otherwise identical. That mapping protects click-through rate and cuts pogo-sticking, because people land on a page in their own language.
Kill the cluster with a duplicate and Google falls back to its own guess, usually the page with the strongest links or the closest geo signal. English speakers start seeing the German URL in results, bounce rates climb, and your carefully built regional pages stop getting the traffic they were meant to catch. The pages are still indexed, so this failure is quiet. Nothing 404s. Rankings just drift and you spend a quarter wondering why the Austrian site underperforms.
How duplicate hreflang gets introduced
In my experience the usual culprit is two systems both claiming ownership of hreflang. A multilingual plugin like WPML or Polylang injects the tags, then a well-meaning SEO plugin or a hardcoded template adds its own set. Content management migrations are another repeat offender: the old and new hreflang blocks both survive in the template. Sitemaps get duplicated too, when a page is listed twice with the same xhtml:link children.
Detecting it
Do not eyeball this at scale. Use tools built for it.
| Tool | What it flags | Where to look |
|---|---|---|
| Screaming Frog | Duplicate hreflang values and entries per URL | Hreflang tab, "Non-Unique" and "Duplicate" filters |
| Search Console | Live rendering plus international targeting warnings | URL Inspection and legacy International Targeting report |
| Sitebulb | Hreflang hints with duplicate and conflict detection | International hints section |
| Server logs / view-source | Two systems both writing tags | Raw HTML head, count the link rel="alternate" lines |
Screaming Frog is my first stop. Crawl the site, open the Hreflang tab, and sort by URL. If one page shows the same language value on two rows, you have a duplicate. Then view-source on that page and confirm whether the tags come from one system emitting garbage or two systems fighting. That distinction decides your fix.
Fixing it, step by step
1. Decide on a single source of truth for hreflang. One plugin, one template block, or one sitemap. Never two.
2. Disable the extra emitters. If WPML owns hreflang, turn off the SEO plugin's hreflang feature and strip any hardcoded tags from the theme header.
3. Enforce one URL per language-region value. If /de/ and /de-at/ are genuinely different pages, give Austria its own de-at value instead of overloading de.
4. Deduplicate the XML sitemap so each page appears once with a single clean set of alternates.
5. Re-crawl, confirm the Hreflang tab is clean, then request re-indexing on a sample page and watch International Targeting for warnings to clear.
- Keep every language-region value unique on a page
- Point each value at exactly one canonical URL
- Pick one system to own hreflang site-wide
- Include a self-referencing hreflang on each page
- Re-crawl after every template or plugin change
- Let two plugins both emit hreflang tags
- Map one value to two different URLs
- Overload a broad code like "de" for multiple regions
- Leave stale hreflang blocks after a migration
- Assume indexed means the signal is working
What good looks like
A healthy page has one clean set of alternates: each language-region value appears once, each points to one live 200 URL, and the page references itself. Crawl it in Screaming Frog and the Hreflang tab shows zero duplicates and zero conflicts. Search Console's International Targeting is quiet. If you have an x-default, it appears once and points to your language selector or global default. Boring is the goal here.
FAQ
Does a single duplicate break the whole page or the whole site?
Is declaring the same URL twice under the same value harmful?
Can I use de and de-at together?
Do hreflang tags in the sitemap and the head conflict?
If your international pages are competing with each other instead of ranking, a duplicate or conflict is usually hiding in the annotations. We audit the whole cluster and hand you a clean fix list.
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.
Subscribe to our newsletter!
Recent Posts
- Can AI Crawlers Actually Read Your Site? I Measured 400 of the Biggest September 5, 2026
- The Pre-Publish Quality Gate for AI-Assisted Content August 6, 2026
- AGENTS.md vs llms.txt vs llms-full.txt: Which Agent File Does What July 18, 2026







