7 Common Hreflang Mistakes and How to Fix Them
The most frequent hreflang implementation errors: missing return links, wrong language codes, canonical conflicts, and more. How to identify and fix each one.
Hreflang is unforgiving. One mistake silently breaks the whole thing -- Google won't warn you, rankings won't tank immediately, and you won't notice until you're investigating why your French users are landing on your English pages.
Here are the seven mistakes that show up most often, and exactly how to fix each one.
Missing return links
If page A points to page B as its French version, page B must also point back to page A. This is called the return link requirement, and it's mandatory.
Google ignores hreflang relationships where the return link is absent. You can't declare a relationship unilaterally -- both pages have to agree.
How to detect: Crawl your site with Screaming Frog or use an hreflang validator. Look for pages where the hreflang targets don't reciprocate.
How to fix: Every page in your hreflang cluster must include the complete set of <link rel="alternate" hreflang="..."> tags pointing to all other language versions, including itself. See the full implementation guide for the correct pattern.
Wrong language or region codes
Hreflang uses ISO 639-1 language codes (two letters: en, fr, de) and optionally ISO 3166-1 alpha-2 region codes (two letters: US, GB, AU). Any deviation and Google rejects the tag.
Common errors: using en-UK instead of en-GB, using zh-TW written as zh-tw (case matters for region), using full language names like english, or using locale formats like en_US with an underscore instead of a hyphen.
How to detect: Check your tags against the official language code list. A validator will flag unrecognized codes immediately.
How to fix: Replace incorrect codes with valid ISO combinations. en-GB not en-UK. zh-Hant or zh-TW for Traditional Chinese, zh-Hans or zh-CN for Simplified. The hyphen separator is required for region variants.
Missing self-referencing hreflang tags
Every page must include an hreflang tag pointing to itself. If you have an English page at /en/about, that page needs a tag with hreflang="en" pointing to its own URL.
Skipping the self-reference is technically invalid and some implementations without it get ignored entirely.
How to detect: Check any page in your hreflang cluster -- view source and confirm one of the <link rel="alternate"> tags has an href matching the current page's URL.
How to fix: Add the self-referencing tag to every page in the cluster. It looks identical to the other alternate tags -- just happens to point to the same page you're on.
Canonical conflicts
When your canonical tag and hreflang tags disagree, you have a problem. The most common conflict: a page has a canonical pointing to a different URL, but also declares itself in an hreflang cluster.
Google's guidance here is clear -- they'll try to respect both signals, but conflicting directives cause confusion and often mean neither is followed correctly.
How to detect: For any page, check that the canonical URL matches the hreflang self-referencing URL. If they're different, you have a conflict.
How to fix: The canonical and hreflang self-reference must point to the same URL. If you're canonicalizing paginated pages or parameters, make sure hreflang only lives on the canonical version. Read more in hreflang and canonical tags.
Pointing to non-200 URLs
If your hreflang tag points to a URL that returns a redirect (301, 302) or an error (404, 410, 500), Google ignores that tag. The target URL must return a 200 status.
This happens a lot after site migrations, URL restructures, or when pages get deleted without updating hreflang tags.
How to detect: Extract all hreflang target URLs from your pages (or sitemap), then check their HTTP status codes. Any non-200 is a problem.
How to fix: Update hreflang tags to point to the final destination URL. If you've moved pages, update the tags to the new URLs. If pages were deleted, remove them from the hreflang cluster entirely.
Using relative URLs instead of absolute
Hreflang requires absolute URLs. href="/fr/about" is wrong. href="https://example.com/fr/about" is correct.
Google's documentation is explicit on this. Relative URLs in hreflang are not supported and the tags will be ignored.
How to detect: Scan your hreflang tags -- any href value that doesn't start with http:// or https:// is relative and needs fixing.
How to fix: Replace all relative URLs with their absolute equivalents. If you're generating hreflang programmatically, make sure your URL builder includes the protocol and domain.
Missing x-default tag
The x-default value tells Google which page to show when no other hreflang value matches the user's language/region. It's technically optional, but leaving it out means Google decides for itself -- which usually means defaulting to whatever it thinks is the "main" version.
For most sites, x-default should point to your language selector page or your default-language homepage.
How to detect: Check your hreflang cluster for a tag with hreflang="x-default". If it's not there, it's missing.
How to fix: Add an x-default tag to every page in the cluster. Read the full x-default guide for decisions on what URL it should point to.
Validate your hreflang implementation
Check for all 7 of these mistakes automatically. Hreflang Generator catches missing return links, bad codes, and canonical conflicts.
The underlying pattern
Most of these mistakes share a root cause: hreflang is a bilateral contract. Every relationship has to be declared by both parties, using exact URLs, valid codes, and consistent signals across canonical and alternate tags.
If you're implementing hreflang on a large site, automate the validation. Manual checks don't scale and a single template error will propagate across thousands of pages before anyone notices.
Related Articles
Part of Boring Tools -- boring tools for boring jobs.
Generate perfect hreflang tags
Create and validate hreflang markup for your multilingual site. Free.