← hreflang Reciprocity Check

Why hreflang links must be reciprocal

Google's Search Central documentation on localized pages is direct about this: hreflang annotations describe a set of pages that are equivalent alternates of each other, and it asks site owners to confirm the links are reciprocal — every page in the set should link to every other page in the set, including itself. When a page names an alternate that does not link back, Google's own documentation says the annotation may be disregarded.

That is a quiet failure. The page still renders. The HTML is still valid. Nothing in a browser, a linter, or a normal QA pass will show a broken hreflang set — the only symptom is a search result that doesn't show up where it was supposed to, in a market nobody in the room is testing from.

The shape of a correct set

Three pages, each in a different language, each listing all three (including itself):

<!-- on https://example.com/en/ -->
<link rel="alternate" hreflang="en" href="https://example.com/en/" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/" />

<!-- on https://example.com/fr/ -->
<link rel="alternate" hreflang="en" href="https://example.com/en/" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/" />

<!-- on https://example.com/de/ -->
<link rel="alternate" hreflang="en" href="https://example.com/en/" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/" />

Every page names all three, including itself (the self-reference Google's documentation also asks for). If the German page above were missing its own entry pointing back at /fr/, the French page's link to German would be one-way, and Google's documentation says it may be ignored for exactly that pair.

How a one-way link actually happens

Almost never on purpose. The common real cause is a rollout: a site adds a new locale and updates its language switcher and hreflang block for the new page, but the existing pages' hreflang blocks are generated from a template or a migration script that only ran once, before the new locale existed. Every existing page keeps pointing at the same set it always had; the new page points at all of them; nothing points back at the new page except the new page itself. The same thing happens in reverse when a locale is retired — its alternates keep naming a page that no longer exists or was never repointed.

The other four ways this tool checks for

Common questions

Where does Google say hreflang links must be reciprocal?

Google's Search Central documentation on localized versions of a page instructs site owners to confirm that hreflang links are reciprocal — each page in a set of alternates should link to every other page, and every other page should link back to it. Google's own guidance says that when a return link is missing, the search engine may disregard the annotation.

What actually happens if the return link is missing?

Google's documentation says a hreflang annotation without a matching return link may be ignored. In practice this means the language- or region-targeted result you intended for a search in a particular market may not appear, and instead a visitor might land on the wrong-language version of the page with no signal ever reaching you that the annotation failed, because nothing about it produces an error — the page still loads fine and the tag is still valid HTML.

How does a one-way hreflang link happen in practice?

Usually a new locale is added to a site's language switcher and its hreflang set before every existing locale's own page has been updated to add a matching entry pointing at the new one — a rollout that touches N pages needs to touch N pages' hreflang blocks, and a template or migration script that only updates the new page's own tag leaves every existing page pointing at nothing that points back. It also happens when a page is retired or moved and its alternates are not updated to drop or repoint the now-dead entry.

What is x-default and is it required?

hreflang="x-default" names the page to show a visitor whose language or region does not match any of the other declared alternates. Google's documentation describes it as optional but recommended whenever a page set has more than one real language or region variant, specifically for sites that do automatic language/country selection with a landing page a generic visitor should see.

Check your own pages: hreflang Reciprocity Check. See also: how this differs from Merkle's hreflang Tags Testing Tool.