If you publish in more than one language or region, hreflang decides whether the right version reaches the right user, and it's the single most error-prone area in technical SEO. Here's how it works and what breaks it.
hreflang only works when every page in a language group references every other version correctly, reciprocally, and with valid codes. One missing return tag or typo silently breaks the whole cluster.
If you publish the same content for more than one language or region, hreflang is what tells search engines which version to show which user. Get it right and a Turkish searcher gets your Turkish page while an American gets your US English page, with no duplicate-content confusion between them. Get it wrong and the wrong-language result can rank, or your versions cannibalise each other in search.
hreflang is the most error-prone area in technical SEO for one reason: it demands strict reciprocity and accuracy across every page in a language group at once. A single missing return tag or a typo'd code can invalidate the whole cluster. These are the three rules that break most often.
If page A lists page B as an alternate, B must list A in return. Missing return tags are the number-one hreflang error and make search engines ignore the annotation.
Every page in the group must include an hreflang entry for itself. Without a self-reference the cluster is incomplete and the versions may not be linked correctly.
Use valid ISO language/region codes, include an x-default fallback, and point only at canonical, 200-status URLs, never a redirect, a 404, or a non-canonical page.
The complete, error-by-error guide to getting hreflang right.
Grounded in the real checks the crawler runs.
These frequently overlap with Indexability, since every hreflang target must also be canonical and indexable.
hreflang tells search engines which language and region each version of a page targets, so they can serve the right one to the right user. You need it whenever you publish the same content in multiple languages or for multiple regions, whether that's a full translation or a regional variant of the same language.
Without it, search engines may show the wrong-language page to a user, or treat your versions as duplicates of one another. Both outcomes cost you: the first sends visitors to a page they can't read, the second lets your own pages compete for the same result.
hreflang requires strict reciprocity and accuracy across every page in a group at once. Each page must reference all its alternates including itself, return tags must be mutual, codes must be valid, and every target must be canonical and return 200. That is a lot of conditions to satisfy simultaneously.
Because the annotation is evaluated as a cluster rather than page by page, one missing return tag or one typo'd code can invalidate the whole group. That all-or-nothing behaviour is why hreflang generates more audit errors than almost any other area, and why hand-maintaining the tags rarely survives contact with a growing site.
An x-default entry is recommended though not strictly required. It specifies the fallback page to serve when none of the listed locales match the user, typically a language selector or your primary version.
Without one, search engines guess the fallback themselves, which can show the wrong version to users outside your targeted locales. Since that group includes every market you haven't explicitly listed, the guess is often wrong in exactly the cases where you have the least visibility.
hreflang can be declared in HTML head tags, in HTTP headers, or in the XML sitemap. Any of the three works; the important thing is to pick one and be consistent. HTML head tags are the easiest to inspect and debug, the XML sitemap method scales well for large sites and keeps page markup lighter, and HTTP headers suit non-HTML files such as PDFs.
Don't mix methods for the same set of pages, which can create conflicts between declarations that are difficult to trace. See the complete guide for the full rule set and the errors each one prevents.
Free to start. Find broken return tags, invalid codes and missing x-defaults across every locale.
Start my free audit