hreflang checker

hreflang only works as a set. Every version of a page must list every version, itself included, with a code Google reads, and each of those pages must list this one back. Miss one side and Google ignores the pair. This tool reads the versions a page declares in its head and in its Link header, checks the codes, checks the self-reference, then fetches up to ten of the versions and asks each whether it points back.

By , founder of Porteur · Updated 14 September 2026 · Markdown

What it checks

  • Every link rel="alternate" hreflang in the head, and every hreflang declared in the HTTP Link header, as absolute addresses.
  • Each code: a two-letter ISO 639-1 language (en, fr, de), optionally with an ISO 15924 script (zh-Hant) and an ISO 3166-1 alpha-2 region (en-GB, fr-CA), or x-default. Three-letter languages and country-only codes are flagged, because Google ignores them.
  • The same code declared twice, which makes the set ambiguous.
  • The self-reference: this page listed in its own set.
  • x-default: optional, and noted when missing.
  • The return links: up to ten of the declared versions are fetched, their status read, and their own hreflang set searched for this page.

A page with no hreflang at all gets a plain answer: none on this page, which is right for a site in one language. The tag is for pages that exist in several languages or for several countries; it is not a signal of quality and adds nothing to a page with no sibling.

Why a one-way hreflang is no hreflang

hreflang tells Google which version of a page to show a searcher in a given language and country. It does not merge ranking between versions; it picks. For Google to trust the picking, the declarations must agree from every side: page A says B is the French version, and B says A is the English one. A one-way declaration can be a mistake or a hijack, so it is dropped.

The mistakes are quiet. A template that lists the other languages but forgets the page itself. A French version whose head still lists the staging addresses. A region code where a language code should be (uk for the United Kingdom is a language code for Ukrainian). A sitemap that declares one set while the head declares another. Search Console's international targeting report, which used to list these, was retired in 2022, so the tool is the report now.

How to read the result

The verdict says whether the set holds: valid codes, the page listed in its own set, every fetched version pointing back. Under it, one row per declared version: the code, the address, what the address answered, and whether it points back, with a note when it does not (it declares no hreflang, it lists other versions but not this one, it answers 404).

A worked example. yourproduct.com/fr/pricing declares en, fr, de and x-default. The codes are valid and the page lists itself. The tool fetches /pricing and /de/pricing: the English page points back as fr, the German page answers 200 and declares no hreflang at all. Verdict: one of two versions does not point back. The fix is the German template, which was built before hreflang was added to the others, and it fixes every German page at once.

What to do with it

  1. Declare the set from one source

    A page's set of versions should come from one place in the code (the translations table, the CMS field), and every version should render the same set from it. Two templates maintaining two lists drift within a month.

  2. Include the page itself and an x-default

    The self-reference is required for the set to count. x-default names the version for everyone else, usually the English page or a language picker.

  3. Use codes Google reads

    Language first, region second, hyphenated: en, en-GB, fr-CA, pt-BR, zh-Hant-TW. Not en_GB, not gb, not eng.

  4. Check the sitemap agrees

    If hreflang is also declared in the XML sitemap, it must say the same thing as the head. One of the two is enough; both must agree.

  5. Run the check on one page of each template

    A product page, a guide, the pricing page, in one language each. A template fixed once fixes its whole family.

Limits

  • Ten versions are fetched per check. A page in eighty languages is checked on the first ten declared; run the check from a page in another language to cover a different ten.
  • hreflang declared only in the XML sitemap is not read here; the head and the HTTP Link header are.
  • The tool checks the declarations, not the translations. A French page whose text is English passes.
  • Thirty checks an hour per visitor, public addresses only. Nothing is stored.

Questions

Check my site, free

This checks the declarations on one page. The free check reads the site, the searches around it and the rivals on them, in whatever language they are in, and says what to change first.

  • Free check, no card
  • Read-only, your own accounts
  • Readable by your agent

Read next