Hreflang Best Practices for International SEO
Battle-tested hreflang best practices: implementation rules, validation checklist, and the practices that separate working hreflang from broken hreflang.
Hreflang is one of those technical SEO elements where doing it mostly right is basically the same as doing it wrong. The spec is strict and Google's tolerance for implementation errors is low.
These are the practices that consistently separate hreflang that works from hreflang that silently does nothing.
Always include a self-referencing tag
Every page in an hreflang cluster must reference itself. If your French page is at https://example.com/fr/, it needs:
<link rel="alternate" hreflang="fr" href="https://example.com/fr/" />
Along with all its other alternates. This isn't optional -- it signals to Google that you're intentionally including this page in the cluster, not accidentally pointing to it from somewhere else.
Use absolute URLs, always
Relative URLs in hreflang are not valid. Google's documentation is explicit here. /fr/page is wrong. https://example.com/fr/page is correct.
If your CMS or template generates relative URLs by default, override it. A single relative URL quietly breaks that tag without any visible error.
Keep canonical and hreflang consistent
The canonical tag and hreflang self-reference must agree. If your canonical says https://example.com/page?lang=fr but your hreflang self-reference says https://example.com/fr/page, you've created a conflict that Google has to resolve on its own -- and it won't necessarily go the way you want.
Check every page: canonical URL = hreflang self-reference URL. Full stop. See hreflang and canonical tags for the edge cases.
Maintain reciprocal links in every cluster
Every page that references another page as an alternate must be referenced back. This is the return link requirement -- one of the most common sources of hreflang failures.
If you have en, fr, and de versions:
- The
enpage must point toen,fr, andde - The
frpage must point toen,fr, andde - The
depage must point toen,fr, andde
Every page. Every language. No exceptions. Missing even one return link can cause Google to ignore the entire relationship.
Check your hreflang implementation
Hreflang Generator validates return links, canonical consistency, and all the rules on this list.
Include x-default for your fallback page
x-default tells Google which page to serve when no hreflang value matches the user's language or region. Without it, Google makes that decision for you.
Set x-default to your language selector page if you have one, or to your primary market's homepage if you don't. Include it on every page in the cluster, pointing to the same URL.
See hreflang x-default for how to handle more complex scenarios.
Use valid ISO language and region codes
Language codes are ISO 639-1 (two letters, lowercase: en, fr, de). Region codes are ISO 3166-1 alpha-2 (two letters, uppercase: US, GB, AU). Combine them with a hyphen: en-GB, fr-CA.
Common mistakes: en-UK (should be en-GB), zh-TW written as zh-tw (region must be uppercase), using full names like english. Invalid codes are silently ignored. Check against the hreflang language codes reference.
Choose one implementation method and stick to it
You can implement hreflang in three places: HTML <head>, HTTP headers, or XML sitemaps. Pick one and use it everywhere.
Mixing methods creates duplication and potential conflicts. If you implement hreflang in both your HTML head and your XML sitemap, you're not doubling the signal -- you're adding complexity that can produce inconsistencies if the two get out of sync.
Only point to 200-status URLs
Every URL in your hreflang tags must return an HTTP 200 status code. Redirects, 404s, and server errors cause the tag to be ignored.
After any site migration or URL restructure, audit your hreflang targets. Update them to point to the new final URLs, not the old ones that now redirect.
Keep language versions in content sync
This is more about maintenance than implementation, but it matters. If your English page is updated and the French version isn't, you haven't broken hreflang technically -- but you've created a user experience problem that undermines why you implemented hreflang in the first place.
Treat translated pages as a content dependency on the original. When the original changes significantly, the translated versions need updating.
Validate after every deployment
Hreflang errors are easy to introduce and hard to spot without tooling. Template changes, CMS updates, and URL restructures can silently break an implementation that was working fine.
Build hreflang validation into your deployment checklist. At minimum: validate a sample of pages after any significant change to templates or URL structure.
Self-referencing tags on every page
Every page in the cluster must reference itself with a matching hreflang tag.
Absolute URLs throughout
No relative paths. Every hreflang href must include protocol and domain.
Canonical consistency
The canonical URL and hreflang self-reference must point to the same URL.
Complete return links
Every page references every other page in the cluster, including itself.
Valid language codes
ISO 639-1 language codes and ISO 3166-1 alpha-2 region codes only.
x-default declared
A fallback page is specified for users whose language/region has no match.
All targets return 200
No hreflang href points to a redirect, 404, or error page.
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.