Hreflang Checker — Example Report Run Your Own Audit →
📋 Example Report — Demo Data

Hreflang Checker Example: 12 Tags Across 4 Languages

This example shows the aiwebpageseo Hreflang Checker for a multilingual SaaS site with 4 language variants. The report validates all 12 hreflang tags, finds 2 missing return links and identifies an incorrect locale code that could cause Google to ignore the international targeting.

Hreflang Tags — multilingual-saas.example.com ⚠ 2 issues found
✓ 12 tags found ✓ 4 languages ⚠ 2 missing return links ⚠ 1 incorrect locale ✓ x-default present
Lang/RegionURLStatusReturn Link
en/en/features✅ Valid✅ Yes
en-GB/en-gb/features✅ Valid✅ Yes
de/de/funktionen✅ Valid✅ Yes
de-AT/de-at/funktionen⚠ Check❌ Missing
fr/fr/fonctionnalites✅ Valid✅ Yes
fr-BE/fr-be/fonctionnalites✅ Valid❌ Missing
es_ES/es/caracteristicas❌ Invalid locale✅ Yes
x-default/features✅ Present✅ Yes
Issues Found
ERROR

es: Invalid locale code — should be "es-ES" not "es_ES"

The Spanish hreflang uses an underscore (es_ES) instead of a hyphen (es-ES). Google will not recognise this locale and will ignore the entire hreflang set for Spanish pages. Fix: Change hreflang="es_ES" to hreflang="es-ES" across all pages in the Spanish hreflang set.

WARN

de-AT page missing return hreflang link

The Austrian German page (/de-at/funktionen) does not include a hreflang tag pointing back to the main German page (/de/funktionen). Without this reciprocal link the claim is unconfirmed, and Google may disregard the annotations across the whole cluster — not just these two pages. Fix: Add all hreflang tags to the de-AT page including a self-referencing tag.

WARN

fr-BE page missing return hreflang link

Same issue on the Belgian French page — it's missing reciprocal hreflang links. Fix: Add a complete hreflang set to /fr-be/fonctionnalites referencing all language variants.

What hreflang does — and what it does not

Two corrections before anything else, because both misconceptions cause real, wasted effort.

1

There is no duplicate content penalty, so hreflang is not protecting you from one

Google has said this for years: duplicate content is not a penalty. Publishing your English page for the US and the UK does not trigger a sanction. What Google does is consolidate — it picks one version as canonical and shows that one. Hreflang does not shield you from punishment. It tells Google which variant to show to which audience, so that your British visitors see the British page rather than whichever one Google happened to consolidate on.

2

Hreflang does not improve rankings. At all.

It is a serving signal, not a ranking signal. It does not help a page rank higher — it swaps which URL is displayed at the position the page has already earned. If your German page does not rank in Germany, hreflang will not fix that; you have a content or authority problem, and no amount of annotation will substitute.

What it does fix is the specific, maddening failure where you are ranking, and Google is showing the wrong language version to the wrong country. That is a real problem worth solving. It is just not the problem most people think they are solving.

The es_ES error, and the locale mistake that catches everyone

The underscore is a straightforward transcription error — hreflang uses a hyphen, always. The confusion is understandable, because og:locale uses an underscore (en_GB) while lang, hreflang and every other web standard uses a hyphen (en-GB). Same value, two conventions, one attribute away from each other.

But there is a worse locale mistake, and it is far more common. It is this:

hreflang="en-uk" ❌
hreflang="en-gb" ✅

There is no country code "UK". The ISO 3166-1 code for the United Kingdom is GB. And "UK" is not merely unrecognised — it is the code for Ukraine's language, Ukrainian, in the language standard. So en-uk is not a typo Google quietly forgives; it is an invalid combination, and Google will ignore the annotation entirely.

The rules, precisely: language is ISO 639-1 (two letters, mandatory); region is ISO 3166-1 Alpha-2 (two letters, optional); joined with a hyphen. Language alone is valid — de targets German speakers everywhere. Region alone is not valid. There is no such thing as hreflang="gb"; that reads as the language "gb", which does not exist.

Reciprocity: why two missing tags break more than two pages

The two missing return links are flagged as warnings. They deserve to be errors, because of how the rule actually works.

Hreflang is a claim that requires confirmation. Page A saying "the German version is over there" is an unverified assertion — anyone could point a tag at any page on the internet. Google only accepts the relationship if the German page agrees, by pointing back. Without the return link, the claim is unconfirmed and Google discards it.

The consequence is disproportionate. This is not two broken pages — an incomplete cluster can cause Google to disregard the annotations across the set. The nine correctly-configured tags in the table are doing nothing for the pages whose partners never replied. The set is only as good as its weakest member.

and

Every page must include a self-referencing tag

This is the rule that is silently omitted most often. The German page's hreflang set must list every variant — including German itself. A cluster of four languages means every one of the four pages carries all four tags, plus x-default. Each page's set is identical, and each page appears in it. Omit the self-reference and the set is malformed.

The canonical conflict that silently destroys hreflang

This one is worth more than everything else on this page, because it is invisible to most hreflang checkers — the tags all validate, the return links are all present, and the whole thing is being ignored.

The rule: every language variant must have a self-referencing canonical. The German page's canonical points at the German page.

What goes wrong: somebody, reasoning that the English page is the "original", sets the canonical on every translated page to point at the English one. This is a perfectly natural intuition and it is fatal. That canonical says "do not index me, index the English page instead." The hreflang tags simultaneously say "index me, and show me to German speakers."

Two contradictory instructions. Google resolves the conflict by trusting the canonical — and your entire international setup evaporates while every tag in it validates perfectly.

Canonical and hreflang answer different questions. The canonical says "which URL is the definitive version of this page". Hreflang says "which other pages are alternates of this one". A translated page is not a duplicate of its source — it is a different page, and it canonicalises to itself. If your hreflang is not working and everything appears correct, check the canonicals first.

Three ways to implement it — and which one to choose
MethodBest forThe catch
HTML <head>Small sites, few languagesEvery page carries every tag. With 6 languages and 10,000 pages, that is 60,000 tags to keep in sync — and page weight on every request.
HTTP headerNon-HTML files (PDFs)The only option where there is no <head> to put tags in.
XML sitemapAnything at scaleNothing appears in the page source, so it is harder to eyeball — but it is one file, it is generated programmatically, and it cannot drift out of sync.

Pick one and use only that one. Implementing hreflang in both the head and the sitemap gives Google two sources to reconcile, and the moment they disagree — which they will, because one of them will be updated and the other forgotten — you have a conflict rather than a redundancy.

Two final requirements that quietly break sets: the URLs must be absolute, with protocol and domain — a relative path is ignored. And every URL in the set must return a 200. An hreflang pointing at a redirect, a 404 or a noindex page invalidates that entry, and an invalid entry can take the cluster with it. When a language is retired, remove it from every set. Leaving a dead tag behind is not a tidiness problem; it is a live fault.

Frequently asked questions

What are hreflang tags?

Hreflang tags are HTML attributes that tell Google which language and region a page is intended for. They help Google show the correct language version to users in each country, and they help it understand that your variants are alternates of one another rather than unrelated pages.

What is a missing return link?

If page A has a hreflang tag pointing to page B, page B must also have a hreflang tag pointing back to page A. Hreflang is a claim requiring confirmation — anyone could point a tag at any page on the internet, so Google only accepts the relationship if the other page agrees. Without the reciprocal link the claim is unconfirmed and Google discards it, and an incomplete cluster can cause the annotations to be disregarded across the whole set.

What is x-default in hreflang?

x-default is a special hreflang value that tells Google which page to show when no other language variant matches the user's language. It is typically set on the homepage or a language selector page. Missing x-default is not an error but is recommended best practice.

Does hreflang improve my rankings?

No. Hreflang is a serving signal, not a ranking signal — it does not help a page rank higher, it changes which URL is displayed at the position the page has already earned. If your German page does not rank in Germany, hreflang will not fix that; you have a content or authority problem. What it does fix is the specific failure where you are ranking but Google shows the wrong language version to the wrong country.

Is hreflang="en-uk" correct for the United Kingdom?

No, and this is the most common locale error there is. There is no ISO country code "UK" — the code for the United Kingdom is GB, so the correct value is en-gb. Worse, "uk" is the language code for Ukrainian, so en-uk is not a typo Google quietly forgives but an invalid combination that causes the annotation to be ignored. The rules: language is ISO 639-1, region is ISO 3166-1 Alpha-2, joined with a hyphen. Language alone is valid; region alone is not.

My hreflang tags all validate but Google ignores them. Why?

Check your canonicals first. Every language variant must have a self-referencing canonical. If someone has set the canonical on each translated page to point at the English "original" — a natural intuition and a fatal one — then the canonical says "do not index me, index the English page" while the hreflang says "index me and show me to German speakers". Google resolves the contradiction by trusting the canonical, and the entire international setup evaporates while every tag validates perfectly. A translated page is not a duplicate of its source; it is a different page, and it canonicalises to itself.

Should I put hreflang in the head or the sitemap?

Use the sitemap for anything at scale, and use only one method. Head tags mean every page carries every tag — with six languages and ten thousand pages that is sixty thousand tags to keep in sync. The sitemap is a single file, generated programmatically, that cannot drift. Implementing both gives Google two sources to reconcile, and the moment one is updated and the other is forgotten you have a conflict rather than a redundancy. Also ensure every URL in the set is absolute and returns a 200: an hreflang pointing at a redirect, a 404 or a noindex page is an invalid entry, and an invalid entry can invalidate the cluster.

Related Demo Reports

Run Hreflang Checker on Your Own Site

Get your real audit report with specific issues, fixes and actionable improvements.

⚡ Run Free Audit View Plans