seo · 7 min read

Why an hreflang cluster fails silently

hreflang has one property that makes its failures unusually expensive: it is all or nothing. Get one page wrong and Google drops the entire set, and no report anywhere names the page responsible.

What hreflang is for

It tells Google that several URLs are the same page in different languages, so it serves the right one to the right reader and stops treating them as duplicates competing with each other. It is a signal about which version to show. It is not a ranking signal, and no amount of it makes a page rank higher.

Failure one: the missing self-reference

The rule is that every page in a set names every page in the set — itself included. So both pages carry the identical block:

<link rel="alternate" hreflang="en" href="https://example.com/page/" />
<link rel="alternate" hreflang="ar" href="https://example.com/ar/page/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/page/" />

The instinct is to have each page point at the others, which reads as the efficient version and is the broken one. If the English page lists only the Arabic URL, the cluster has no reciprocity and Google discards it — not the English half, the whole thing.

It is also why the block is easiest to get right when it is generated rather than written. The same block on every page is a template concern; hand-editing two files to point at each other is where the asymmetry creeps in.

Failure two: a relative href

href="/ar/page/" looks reasonable. It resolves in a browser. It validates against every schema. Google discards it without a word.

This site published 936 relative hreflang hrefs in its sitemap — 312 pages with three alternates each. Search Console reported a number and no indication of which part was wrong. The count went to zero the day they were made absolute, which was the only evidence available that this had been the problem.

And a third, smaller one: the tag itself

The language goes first in lowercase, the region after it in uppercase: en-GB. Not en_GB, not EN-gb. And a region alone is never valid — there is no hreflang="GB", because a country is not a language. x-default is the one exception to the shape, and it is not a language at all.

Where to declare it

Three places will carry a cluster: the head of each page, an HTTP header, or the sitemap. Pick one. Declaring the same set in two places is not redundancy — it is two chances to disagree, and a disagreement invalidates both declarations rather than falling back to the correct one.

The sitemap is usually the cheapest for a large site, because one file changes instead of every page. See sitemaps for a site in two languages for what those entries look like.

hreflang and canonical

They work together and are frequently confused. Each page is canonical to itself and declares the others as alternates. A canonical tag pointing from the Arabic page to the English one collapses the set: you have told Google those are the same page and only one should be indexed, which is the opposite of what hreflang says.

Checking it before you publish

The hreflang generator builds the block and checks the cluster for all of the above, including the self-reference, which it can only do if you tell it the URL the tags are going on. For a page that already exists, paste its source into the meta tag analyser — it runs the same checks on whatever alternates it finds.

Questions

What is a self-reference in hreflang?

Every page in a set must list every page in the set, including itself. The English page names both the English and the Arabic URL; so does the Arabic page. A page that names only the others is not part of a cluster.

What happens if one page is missing its self-reference?

Google discards the whole cluster rather than honouring the part that is correct, and nothing in Search Console names the page that broke it. That is why this fails quietly and stays broken for months.

Do hreflang URLs have to be absolute?

Yes. A relative href parses, validates against the schema, and is discarded without a word. This site published 936 of them; the only symptom was a count in Search Console with no explanation of which part was wrong.

Is x-default required?

No, but it is nearly always right to have one. It says what to serve a reader whose language matches none of your sets. Without it, Google guesses. It usually points at the same URL as your primary language.

Head tags, HTTP headers or the sitemap?

Any one of the three. Not two — declaring the same cluster in two places creates two chances to disagree, and a disagreement invalidates both declarations rather than one of them.

Tools from this guide

More seo tools — all of them running in your browser, none of them uploading a file.