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 Théophile Louvart, 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
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.
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.
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.
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.
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
No. hreflang is for pages that exist in several languages or for several countries. On a one-language site it adds nothing and one wrong tag can only do harm.
The version to show when no declared language matches the searcher: usually the main version or a language selector. It is optional, but Google recommends it.
The usual causes: the page does not list itself, the other version does not point back, a code is not one Google reads, or the page redirects visitors by location before Googlebot can read it. The tool checks the first three.
No. It decides which of your versions is shown to whom. Ranking stays with each page. A wrong set can show the wrong version, which loses the click.
No. The language is required; the region is optional and comes after it: en-GB. A code with only a country is ignored, and some country codes are also language codes (uk is Ukrainian).
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