scalpel@labs: ~/glossary/hreflang-tag.mdx5 sections

Hreflang Tags for International SEO

Hreflang is a `link rel="alternate" hreflang="x"` annotation, set in the HTML head, an HTTP header, or an XML sitemap, that maps a set of equivalent pages across languages or regions so Google can serve the right one to each searcher. It signals equivalence and locale targeting, not translation or duplicate content.

extension: Scalpel SEOupdated: 2026-08-14read_time: 2 min
less hreflang-tag.mdx

Why it matters

The detail that actually breaks implementations is reciprocity: every page in a hreflang cluster must link back to every other page in that cluster, including itself. If A points to B but B doesn't point back to A, Google ignores the annotation entirely rather than half-applying it. Missing x-default leaves no defined fallback for unmatched locales, and mismatched language or region codes can silently invalidate the whole cluster.

How it works

Hreflang tells Google that page A in English and page B in French are equivalent versions of the same content for different audiences. When a French searcher finds your site, Google can serve the French version. When an English searcher arrives, Google serves the English version. The reciprocal requirement means every page must link to every other page in its cluster using the correct ISO language codes (en, fr, de, etc.) and optional region codes (en-US, en-GB, etc.).

You set hreflang in three ways: as <link rel="alternate" hreflang="en"> tags in the head, as an Link: HTTP response header, or as <loc> and <xhtml:link> blocks in an XML sitemap. All three methods work; choose the one that fits your infrastructure. A page must include a self-referencing hreflang (en-US page includes hreflang="en-US" pointing to itself).

What does not matter

Hreflang does not prevent indexing of alternate versions. All pages in a cluster are normally indexable; hreflang just guides which one appears for which locale. Adding hreflang doesn't affect ranking signals or consolidate duplicate content the way a canonical does; it's a locale-targeting instruction, not a deduplication tool.

The order of hreflang tags does not matter. Google evaluates all tags in a cluster together; placing the self-reference first or last makes no difference.

Code example

Here is a correct three-locale reciprocal hreflang cluster as HTML link tags:

<!-- On https://example.com/guides (English) -->
<link rel="alternate" hreflang="en" href="https://example.com/guides" />
<link rel="alternate" hreflang="en-GB" href="https://example.co.uk/guides" />
<link rel="alternate" hreflang="x-default" href="https://example.com/guides" />

<!-- On https://example.co.uk/guides (British English) -->
<link rel="alternate" hreflang="en" href="https://example.com/guides" />
<link rel="alternate" hreflang="en-GB" href="https://example.co.uk/guides" />
<link rel="alternate" hreflang="x-default" href="https://example.com/guides" />

Each page declares itself and all its alternates. The cluster is complete and reciprocal.

Here is the broken example: A points to B, but B doesn't point back:

<!-- On https://example.com/guides (incorrectly declares en-GB but doesn't return it) -->
<link rel="alternate" hreflang="en" href="https://example.com/guides" />
<link rel="alternate" hreflang="en-GB" href="https://example.co.uk/guides" />

<!-- On https://example.co.uk/guides (fails to link back to en-US) -->
<link rel="alternate" hreflang="en-GB" href="https://example.co.uk/guides" />
<!-- Missing: hreflang="en" -->

Google ignores the entire cluster because reciprocity is broken. Both pages get treated as independent, undeclared duplicates.

How Scalpel shows it

The International tab detects and lists the hreflang cluster. Scalpel checks reciprocity by verifying that every page links to every other page in the cluster, and flags missing self-references or broken links.