If your site serves the same content in multiple languages or to multiple regions, hreflang tells search engines which version to show to which audience. Without it, you risk the wrong language ranking, or pages competing with each other.
The syntax
Each version links to all others, including itself:
<link rel="alternate" hreflang="en-US" href="https://example.com/us/" />
<link rel="alternate" hreflang="en-GB" href="https://example.com/uk/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />- Language is ISO 639-1 (
en,de,pt); you may add a region (en-US,pt-BR) x-defaultpoints to the fallback page for unmatched languages
The rules
- Reciprocal: if A links to B, B must link back to A
- Self-referencing: each page includes an hreflang pointing to itself
- Absolute URLs: always full
https://…links - One language per URL: do not serve two languages at the same URL
Hreflang is not canonical
Canonical says "this is the preferred URL for this content." Hreflang says "this is the same content in another language." Each language version should keep its own self-canonical while cross-linking with hreflang.
Common mistakes
- Missing return links (the most frequent error)
- Using
hreflang="en"when you meant a specific region - Pointing at redirects instead of final URLs
- Forgetting
x-default
Generate the block
List each language and URL in the free hreflang generator to get a clean, reciprocal set of tags. There are framework-specific versions for WordPress and Next.js.