hreflang: the ultimate guide

No Comments
Hreflang: the ultimate guide
TL;DR: hreflang tells Google which language and regional versions of a page belong together, so searchers get the right version in their local results. It is a hint, not a directive, and it fails silently when return links, canonicals, or language codes are wrong. Implement it in one place (head, HTTP header, or sitemap), make every reference reciprocal and self-referencing, and audit it with a crawler because you will not see the breakage by eye.
What it is
A signal linking language and region variants of a page
Ranking boost
None. It swaps URLs, it does not lift them
Golden rule
Every link must be reciprocal, or it is ignored
Placements
HTML head, HTTP header, or XML sitemap. Pick one
Audit tools
Screaming Frog, Sitebulb, Ahrefs site audit

What hreflang actually does (and does not do)

hreflang is an annotation that groups alternate versions of the same content by language and, optionally, region. A typical head implementation looks like this:

<link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/pricing/" />
<link rel="alternate" hreflang="en-us" href="https://example.com/en-us/pricing/" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/tarifs/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/pricing/" />

When the cluster is valid, Google keeps ranking whichever version has the strongest signals, then swaps in the version that matches the searcher's language and location. A user in Paris searching your brand sees the French URL instead of the English one that would otherwise rank. That swap is the entire feature.

Three things hreflang does not do, because I keep seeing these assumptions in briefs:

It does not boost rankings. If your French page has no authority, hreflang will not conjure any. It does not consolidate signals the way a canonical does; each version stays independently indexed. And it is not a directive. Google calls it a hint and will override it when the annotations contradict other signals, which is exactly why broken implementations fail silently.

The reciprocity requirement, drawn out

The rule that breaks the most implementations: hreflang only works when the pages agree with each other. If page A lists page B as an alternate, page B must list page A back. No return link, no swap. Google confirms return links as a hard requirement in its documentation on localized versions.

VALID CLUSTER: every page lists every page, including itself /en/ (en) /fr/ (fr) /de/ (de) all pairs link both ways, each page also self-references

BROKEN CLUSTER: one-way annotation, Google ignores it /en/ (en) /fr/ (fr) lists /fr/ /fr/ has no return link to /en/ result: the pair is dropped, wrong version can rank in France Cluster size grows fast: 10 languages means 10 annotations on every page, 100 in total. Generate them, never hand-write them.

Three ways to implement it

Pick exactly one method per URL set. Mixing methods across the same pages is how you end up with contradictions that nobody can debug.

MethodBest forWatch out for
HTML head link rel="alternate"Most sites; easiest to crawl and debugBloats the head on large clusters; must render server-side, annotations injected by client-side JavaScript are risky
HTTP header Link:Non-HTML files like PDFsInvisible to most eyeballing; needs curl or a crawler to verify
XML sitemap xhtml:linkLarge sites, many locales; keeps pages lean and centralizes the mappingSitemap generation bugs silently break clusters; every language version must appear as its own url entry with the full annotation set

The rules that break most implementations

1. Return links. Covered above. Every pair must be bidirectional.

2. Self-reference. Each page includes an hreflang entry pointing at itself. Skipping it makes clusters flaky.

3. Valid codes. Language codes are ISO 639-1, region codes are ISO 3166-1 Alpha 2, in that order. The classics that burn people: en-UK is invalid (the United Kingdom is GB), en-EU is invalid (the EU is not a country), and region-only values like gb alone are invalid, language is mandatory. Google skips codes it cannot parse.

4. Absolute URLs. Full protocol and host, always. Relative hreflang URLs are a known source of quiet failures.

5. Point at real, indexable URLs. hreflang targets must return 200, be indexable, and be the canonical version of themselves. Annotations pointing at redirects, noindexed pages, or non-canonical URLs get dropped. Conflicts between hreflang and canonical tags deserve their own article, but the short version: every hreflang target should carry a self-referencing canonical.

6. x-default is a fallback, not decoration. It names the version for users who match none of your locales, usually a language selector or your global English page. It is optional but recommended, and it can coexist with a regular annotation for the same URL.

How to audit hreflang without going blind

You cannot QA hreflang by viewing source on five pages. Clusters break in the long tail, on paginated URLs, on pages your CMS treats differently, on the one locale where a plugin misfires.

Crawl with Screaming Frog. Enable hreflang in the crawl config, then work through the hreflang tab filters: missing return links, invalid language codes, non-canonical alternates, alternates that redirect or error. This one report finds 90 percent of real-world problems. Sitebulb's hreflang hints and Ahrefs' site audit do the same job if that is your stack.

Check Search Console for symptoms. Google removed the dedicated International Targeting report in 2022, so you now diagnose by side effects: run a site: query or performance report filtered by country and look for the wrong language version ranking in a market, or canonical reports showing Google picking a different language as canonical (a duplicate-content smell, usually same-language regional pages that are near-identical).

Spot-check the raw output. One page per locale per template type: view source (or curl for header implementations, or the sitemap entry) and read the actual annotations. Template bugs cluster by template.

What good looks like: every indexable page in a multilingual set carries a complete, reciprocal, self-referencing annotation set with valid codes, all targets return 200 and self-canonicalize, and country-filtered SERPs show the matching language version. Boring and symmetrical is the goal.

DO
  • Generate annotations programmatically from a single source of truth
  • Include a self-referencing entry on every page
  • Use en-GB style codes: ISO 639-1 language, ISO 3166-1 Alpha 2 region
  • Add an x-default pointing at your fallback or language selector
  • Re-crawl after every locale launch or CMS migration
DON'T
  • Expect hreflang to improve rankings; it only swaps URLs
  • Point hreflang at redirects, noindexed, or non-canonical URLs
  • Mix head, header, and sitemap methods on the same pages
  • Use invented codes like en-UK or en-EU
  • Hand-maintain annotations on a site with more than two locales

FAQ

Do I need hreflang if my site is only in one language?
Only if you target multiple regions with that language, for example separate US and UK pages with different pricing or spelling. Same-language regional variants are actually hreflang's most important use case, because without it Google sees near-duplicates and may fold them together or rank the wrong one.
Can hreflang point across different domains?
Yes. Clusters can span example.com, example.fr, and example.de without issue, as long as reciprocity holds and you control all the sites. Cross-domain setups are more fragile in practice simply because different teams deploy each side and one of them eventually breaks the return links.
Does Bing support hreflang?
Barely. Bing has said it relies primarily on the HTML lang attribute, content language detection, and its own geotargeting rather than hreflang annotations. Implement hreflang for Google and Yandex, but keep your lang attributes and visible language signals correct for everyone else.
How long until hreflang changes take effect?
Google has to recrawl every page in the cluster before the annotations count, so expect days to weeks depending on crawl frequency, and longer for deep pages. Submitting updated sitemaps speeds up discovery. Do not judge a fix until the whole cluster has been recrawled.
Should machine-translated pages get hreflang?
If the pages are good enough to index, they are good enough to annotate. The real question is whether raw machine translation should be indexed at all: unreviewed auto-translated pages at scale can read as spam and drag down site quality. Translate properly or noindex until you have.
Multilingual site not ranking in the right countries?

hreflang audits are a core part of my technical review: full cluster validation, canonical conflict checks, and a prioritized fix list your dev team can act on. I find the breakage so you stop guessing.

Get an Advanced SEO Audit

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!

More from our blog