# 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.

Updated 2026-09-14 · Source: https://porteur.ai/tools/hreflang-checker

## 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.

> Do not redirect visitors by their location before Google can read the page. Googlebot crawls from the United States; a site that sends every American visitor to /en never lets it see /fr.

## 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

### Does a one-language site need hreflang?

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.

### What is x-default?

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.

### Why does Google ignore my hreflang?

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.

### Does hreflang help ranking?

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.

### Can I use a country code alone, like hreflang="gb"?

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).

## Read next

- [hreflang](https://porteur.ai/glossary/hreflang): hreflang tells search engines the language and region for each page version. See when you need it, where to declare it, and how to avoid errors.
- [On-page SEO checker](https://porteur.ai/tools/on-page-seo-checker): Paste a URL and get the page read as a crawler reads it: title, description, canonical, indexability, headings, alt text, links, share tags, what to fix first.
- [Sitemap checker](https://porteur.ai/tools/sitemap-checker): Read a sitemap the way a crawler does: what it lists, how it is dated, whether robots.txt names it, and whether thirty of its addresses answer 200.
- [Internal link checker](https://porteur.ai/tools/internal-link-checker): Paste your home page and get up to sixty pages fetched and their links read: the orphans, the pages sitting deepest, the least and most linked, links per page.
- [Canonical URL](https://porteur.ai/glossary/canonical-url): A canonical URL names the original version of a page. Use it to handle parameters and duplicates, avoid split signals and keep the right page indexed.
- [Technical SEO checklist for a small site](https://porteur.ai/guides/technical-seo-checklist): Run these 20 technical SEO checks, in order. Each shows how to check it free and what fixed looks like for a site under 1,000 pages.
- [Redirect checker](https://porteur.ai/tools/redirect-checker): Follow a URL's redirects hop by hop: each status and destination, the time each took, the kind of hop, meta and script redirects, one rule to replace it.
- [XML sitemap](https://porteur.ai/glossary/xml-sitemap): What to put in sitemap.xml, how lastmod works, how to create, validate and submit your XML sitemap, and the traps to avoid.

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: https://porteur.ai/
