How to Do International SEO with Hreflang
On this page
- What the code actually says, and what counts as valid
- The x-default and the self-reference
- The return-tag rule, which is where most hreflang dies
- Common errors, enumerated
- Pick one implementation method for your scale
- Validate, then wait
- Frequently Asked Questions
- Does hreflang help me rank in a new country?
- Should every page use language-country codes like en-gb?
- Why did my hreflang stop working after I added a canonical tag?
- Sources
- Related posts:
Hreflang tells Google which language or regional version of a page to serve a given searcher, and it does only that: it does not translate content, it does not lift rankings, and it does not replace a real per-country strategy. It also fails in a way that traps most teams, which is silently and bidirectionally. The annotation works only when every version in a set links to every other version, including itself, with identical and reciprocal return tags. Miss one return tag and Google does not partially honor the set; it ignores the annotation entirely. So the discipline is mechanical: correct ISO codes, a self-reference on every page, an x-default fallback, complete return tags, no canonical that points away from the page, and a single consistent implementation method chosen for the scale you operate at.
What the code actually says, and what counts as valid
An hreflang value is a language code, optionally followed by a region. The language is ISO 639-1 (“de”, “fr”, “ja”); the region, when present, is ISO 3166-1 alpha-2 (“en-gb”, “es-mx”, “zh-cn”). Google supports only codes from those two standards. Composite or macro-region codes that are not in them, such as “es-419” for Latin America, are not honored, so do not reach for region groupings the standard does not define. Codes are case-insensitive in the spec but the safe convention is lowercase language and lowercase region with a hyphen.
Language-only versus language-country is a real decision, not a formality. Use language-only (“de”) when one version serves every German speaker regardless of country. Use language-country (“en-gb” vs “en-us”) only when the versions genuinely differ by region in price, spelling, inventory, or legal content. Inventing “en-gb”, “en-au”, and “en-ca” pages that are byte-identical creates duplicate-version churn with no benefit. And the region code is for region, never language: “en-uk” is simply wrong, because the ISO 3166-1 country code for the United Kingdom is “gb”, giving “en-gb”.
The x-default and the self-reference
x-default marks the fallback for users whose language and region match none of your declared versions. It is most honestly used on a page that itself performs language or region selection: a homepage with a country picker, a geo-routing landing page, or an international entry point that decides where to send people. It is not a generic “everyone else, go here” tag bolted onto an arbitrary version, and it does not mean “default for all other countries.”
Every page must also list itself in its own hreflang set. The self-reference is easy to forget because it feels redundant, but Google treats a set without each page’s own annotation as incomplete. Self-reference and return tags are two faces of the same rule: the cluster is only valid when it is closed.
The return-tag rule, which is where most hreflang dies
This is the single most expensive bug in international SEO. Every page in a cluster must point to all the others and back to itself, and those annotations must match across the whole set. If your set is US, UK, CA, and DE, the UK page cannot list only UK and US. The moment the return path is incomplete, Google stops trusting the entire annotation rather than honoring the part that is correct.
The practical consequence is that the debugging instinct of “is my tag present on this page” is the wrong question. The right question is “are the return tags complete and identical across every version in the set.” A tag that is present on page A but not reciprocated on page B is a broken cluster, and it will not surface as a loud error.
Common errors, enumerated
| Error | What it looks like | Fix |
|---|---|---|
| Wrong region code | en-uk, en-eu, pt-pt-pt | Use ISO 3166-1 alpha-2: en-gb, and drop invented groupings |
| Unsupported code | es-419 and other macro regions | Use only ISO 639-1 + 3166-1 alpha-2 codes Google supports |
| Missing self-reference | A page omits its own hreflang | Every page lists itself in the set |
| Missing or one-way return tags | A lists B, B does not list A | Make every annotation reciprocal and identical |
| Missing x-default | No fallback for unmatched users | Add x-default on the selection or entry page |
| Canonical conflict | Regional page canonicalizes to another region | Each regional page self-canonicalizes |
| Protocol or slash mismatch | http vs https, /page vs /page/ | Use one canonical URL form in every annotation |
The canonical conflict is worth isolating because it quietly undoes everything. Each regional page must declare itself canonical. If the UK page carries a canonical pointing at the US page, you are simultaneously telling Google “these are distinct regional versions, serve the right one” and “actually the US one is the real page”, and the contradiction collapses the set.
Pick one implementation method for your scale
Google accepts hreflang in three places, and the rule is to pick one and stay consistent rather than scatter conflicting annotations across methods. HTML head link elements are the simplest to reason about for a small set, but they become a maintenance liability at scale because every new locale means editing the head of every page in every cluster. XML sitemap annotations using xhtml:link entries centralize the whole graph in one generated file, which is why they are the durable choice for large, programmatically managed sites: one place to regenerate, one place to audit. HTTP Link headers exist for non-HTML resources such as PDFs, where there is no head to edit.
One more scoping rule: a page that exists for a single market with no alternates should carry no hreflang at all. Annotating a page that has nothing to point to adds risk and no value.
Validate, then wait
The legacy International Targeting report in Search Console was deprecated and removed in 2022, so do not build a workflow around it or tell anyone to “check hreflang errors there.” Google still fully supports and uses hreflang; it simply no longer surfaces those errors in that report. Validate with a crawler that maps reciprocity across the whole set, such as Screaming Frog, Sitebulb, or Ahrefs, and spot-check individual URLs with the URL Inspection tool. After you ship fixes, expect processing to take weeks, because Google has to recrawl and reprocess every page in every cluster before the corrected annotations take effect. Hreflang is slow to reward correctness, which is exactly why getting the return tags right the first time matters.
Frequently Asked Questions
Does hreflang help me rank in a new country?
No. Hreflang is a serving instruction that routes the right existing version to the right user and prevents your own regional versions from competing as duplicates. Ranking in a market still depends on relevance, authority, and a real localization and content strategy for that market. Treat hreflang as plumbing, not as a growth lever.
Should every page use language-country codes like en-gb?
Only when the versions truly differ by region. If one English page serves all English speakers, use language-only “en”. Spinning up “en-gb”, “en-au”, and “en-ca” copies that are identical creates duplicate-version handling with no upside; reserve country codes for pages that actually diverge in price, spelling, stock, or legal terms.
Why did my hreflang stop working after I added a canonical tag?
Almost certainly a canonical conflict. If a regional page canonicalizes to a different region’s URL, you are telling Google that page is not the real one, which contradicts the hreflang declaration that it is a distinct version. Each regional page must self-canonicalize for the annotation to hold.
Sources
- Google Search Central: Tell Google about localized versions of your page. https://developers.google.com/search/docs/specialty/international/localized-versions
- Google Search Console Help: The International Targeting report is deprecated. https://support.google.com/webmasters/answer/12474899