Guide : How to Audit Hreflang at Scale

A repeatable, tool-driven traiter pour auditing hreflang à travers a grand site — pulling every annotation from tout three implementation méthodes, reading cluster graphs and reciprocal matrices, and prioritizing fixes by damage, pas frequency.

Première publication : 2 juil. 2026 · Dernière mise à jour : 3 août 2026 · Advanced
Langues
1 indice probant sur cette page

Auditing hreflang at scale is a graph-validation problem, pas a tag-validation problem: vous vérifier si every page in a cluster points back to every autre page, pas si un page has a tag. Pull every annotation from tout three implementation locations (HTML head, HTTP headers, XML sitemap) with a robot d’exploration — Google donne vous aucun validator and GSC's International Targeting report was supprimé Sept 22, 2022 — alors construire the reciprocal-tag matrix. Spot-check a cluster visually with my free returntag graph and matrix, or utiliser Ahrefs Site Audit and Screaming Frog pour full-site coverage. Triage by damage: manquant retourner tags premier (ils break the whole pair), alors incorrect language/region codes and non-canonical targets, alors manquant x-default dernier (la plupart courant at 56,3%, least harmful). In my Brighton SEO 2023 study of 374 756 domains, over 67% en utilisant hreflang had au moins un error.

TL;DR — A scaled hreflang audit is graph validation, pas tag validation. Step 1: pull every annotation from tout three legal locations (HTML head, HTTP Link headers, XML sitemap) with a robot d’exploration configuré pour votre ccTLD/subdomain setup — GSC can’t do ce (International Targeting supprimé Sept 22, 2022, and même avant que it seulement reported the canonical member of a cluster). Step 2: construire the reciprocal-tag matrix — every URL in a cluster × every autre, fait A→B exist, fait B→A. Lire it in my returntag cluster graph/matrix pour a focused vérifier, or utiliser Ahrefs and Screaming Frog pour site-wide exploration. Step 3: classify into four patterns — manquant retourner tags, incorrect codes, non-canonical targets, mixed absolute/relative URLs. Step 4: prioritize by damage, pas frequency — retourner tags premier (ils break the whole pair), alors codes, alors x-default dernier (la plupart courant at 56,3%, least harmful). Step 5: re-verify contre the indexé URL, pas the declared canonical.

Ce article is the hreflang-specific companion to my broader International SEO Audit, qui treats hreflang as un of six audit areas. Ici I’m going un level deeper on the hreflang-only methodology at scale. Pour fundamentals — ce que hreflang is, the three façons to implement it, the reciprocal rule — voir the Hreflang hub and, pour the fallback tag, x-default.

Evidence for this claim A complete audit needs to inspect HTML, HTTP Link headers, and XML sitemaps because Google supports hreflang in all three locations. Scope: Google Search-supported hreflang delivery methods. Confidence: high · Verified: Google: Localized versions

The core reframe: ce is a graph problem

Here’s the mental shift que rend scaled auditing tractable. Vous are pas checking “does this page have a hreflang tag.” You’re checking “fait every page in ce page’s cluster point back to it, and fait every URL in the cluster resolve to a 200, canonical, indexable page.”

Google’s propre documentation is the raison:

“Si page X liens to page Y, page Y doit lien back to page X. Si ce n’est pas the cas pour tout pages que utiliser hreflang annotations, ceux annotations may be ignored or pas interpreted correctement.”

Evidence for this claim A hreflang audit must verify return links because Google says non-reciprocal annotations may be ignored or interpreted incorrectly. Scope: Google Search hreflang reciprocity guidance; impact is stated as possible, not guaranteed cluster-wide invalidation. Confidence: high · Verified: Google: Hreflang guidelines

Lire que carefully. Un manquant retourner lien peut causer the affected annotations to be ignored or interpreted incorrectly. That’s pourquoi a single-page view is structurally incapable of auditing hreflang: the échec lives in the relationship entre pages, pas on quelconque un page. Vous besoin a explorer que records every cluster member and cross-references les.

Scope matters ici aussi: the ignored annotations are the ones in the broken pair, pas automatically every relationship in a plus grand cluster. A five-page cluster with un manquant retourner typically garde processing its autre complet pairs normally — that’s exactly ce que my returntag screenshot ci-dessous montre: nine reciprocal pairs intact, un manquant retourner flagged. Don’t assume un broken edge nukes the whole cluster; go vérifier every pair, parce que the outil has to vérifier every pair to tell vous que.

And it obtient harder as le site grows — qui is exactly Google’s propre explanation pour pourquoi big sites are the ones with errors. On Search Off the Record, Gary Illyes décrit the errors as emerging quand a site has nombreux properties, chaque with its propre Structure d’URL — as soon as vous have to vary the pattern à travers properties, that’s où the errors come in, with Lizzi Sassman ajout que it’s harder to sync les up quand you’re localizing URLs and alors making typos. That’s the signature of an enterprise setup: multiple ccTLDs, chaque on a slightly différent publishing convention. So a bon audit segments findings by property/domain groupe, parce que that’s où the errors en réalité cluster operationally.

Step 1 — Pull every hreflang annotation site-wide

The three places hreflang lives

Google accepts hreflang in three equivalent locations, and vous doit vérifier tout three:

Evidence for this claim A complete audit needs to inspect HTML, HTTP Link headers, and XML sitemaps because Google supports hreflang in all three locations. Scope: Google Search-supported hreflang delivery methods. Confidence: high · Verified: Google: Localized versions
  1. HTML <link> tags in the <head> — the courant cas.
  2. HTTP Link: réponse headers — utilisé pour non-HTML fichiers comme PDFs.
  3. xhtml:link entries in an XML sitemap — courant at scale parce que it centralizes the annotations in un fichier au lieu de templating les onto every page.

A robot d’exploration que seulement reads the HTML head va silently miss header- or sitemap-declared alternates. It won’t flag les as broken — it simplement won’t voir les, qui is worse, parce que you’ll think une page has aucun hreflang quand it en réalité has a complet définir delivered via sitemap. Configurer the explorer to lire tout three avant vous trust a unique number.

Configuring the robot d’exploration pour votre structure

  • Screaming Frog: enable Configuration > Spider > Explorer Hreflang (ce aussi picks up sitemap and header hreflang quand vous point it at les). Pour ccTLDs/subdomains que référence chaque autre, ajouter the sibling domains sous Config > CDNs — sinon cross-domain hreflang liens are simply pas validated, pas flagged as broken. Ce is the unique la plupart courant blind spot at scale, parce que enterprise sites are the ones la plupart probable to utiliser ccTLDs, and ccTLDs are exactly ce que nécessite ce supplémentaire step.
  • Ahrefs Site Audit: assurez-vous the sibling domains are à l’intérieur the project scope pour the même raison. Alors utiliser Page Explorer to filter pages by hreflang problème type at scale avant vous drill into individual cluster graphs.

Pourquoi GSC can’t do ce pour vous

Two raisons, and the second is the un la plupart personnes miss:

  1. The report is gone. The GSC International Targeting report — qui utilisé to flag some hreflang problèmes — was deprecated and supprimé (announced August 2022; supprimé après September 22, 2022). Nothing replaced it directement.
  2. Même quand it existed, it seulement ever showed the canonical. On Search Off the Record, Illyes explained que Search Console seulement reports on canonicals — pour la plupart similar-language hreflang clusters, the alternates aren’t canonical, so vous were effectively blind to ce que was happening on the non-canonical members of a cluster, parce que Google stores les in the duplicate cluster sans keeping the alternate details. That’s a structural raison GSC was jamais a complet hreflang audit outil, pas simplement “the report got removed.” It’s the direct justification pour going crawler-first.

Google aussi simplement doesn’t ship a validator. On the même podcast, Illyes said Google has jamais provided an hreflang validator — ils had some underused reporting and alors supprimé it — and now points personnes to external outils comme Aleyda Solis’ outil, Bill Hunt’s hreflang checker, and Merkle’s outil. Prendre que as permission to lean on third-party robots d’exploration pour the job GSC can’t do — but pas as an endorsement. Google’s propre documentation is explicit que it doesn’t maintain or vérifier third-party hreflang debugging outils, so treat quelconque tool’s output, mine inclus, as diagnostic evidence vous encore have to raison à propos de, pas an official verdict. Quand a finding en réalité matters, confirmer it contre the raw artifact — the HTTP réponse, le sitemap XML, or the rendered HTML — plutôt que stopping at the tool’s parsed summary.

Step 2 — Construire the reciprocal-tag matrix

Normalize ce que vous pulled

Avant vous construire the matrix, obtenir everything into un consistent shape. Pour every declared hreflang relationship, record l’URL source, l’URL cible, the locale valeur, the source méthode (HTML head, HTTP header, or sitemap), and — critically — the target’s code d’état, chaîne de redirections, indexability, canonical target, and si the explorer saw it in raw HTML or the rendered DOM. Différent robots d’exploration export ce differently; normalizing it into directed URL-to-URL edges with que context attached is ce que rend the matrix, and every classification in Step 3, reliable au lieu de a pile of disconnected rows.

Ce que the matrix represents

Conceptually, pour chaque cluster vous construire a table où the rows and columns are every URL in que cluster, and chaque cell réponses a yes/aucun question: fait a hreflang lien exist from the row URL to the column URL? A correct cluster is symmetric — si A→B is présent, B→A is présent. Every asymmetric cell (a lien que exists in un direction seulement) is a manquant retourner tag.

Vous don’t literally hand-build ce spreadsheet at scale — the outils construire it pour vous. But holding the matrix in votre head is ce que lets vous lire the outil output correctement. My returntag outil draws the matrix as a graph and aussi exposes the underlying cells; Screaming Frog’s “Missing Return Links” filter pulls the asymmetric cells into a liste, and Ahrefs Site Audit provides un autre at-scale cluster view. Même relationship vérifier, différent presentations and explorer scopes.

Reading it as a graph: my returntag cluster validator

Pour a focused cluster vérifier, my free returntag outil renders the declared locale relationships as a graph and a reciprocal matrix. Every locale is a node, every declared hreflang annotation is an edge, and the problème liste identifies the exact URL que fails to lien back. The screenshot ci-dessous is a sitemap-only run: it reads ce que the sitemap declares and deliberately ne fait pas récupérer page head tags or HTTP Link headers. Utiliser Page URL mode quand vous besoin the complet three-source picture pour une page’s cluster.

How to lire it:

  • A clean cluster is a fully-connected mesh — every node lié to every autre node, les deux directions.
  • A one-way edge is votre asymmetric cell: page X points to Y but Y doesn’t point back. That’s the return-tag error, seen au lieu de lire.
  • An orphaned node — une URL que apparaît in the cluster but doesn’t lien back into it — is an unlinked hreflang URL.

The practical win is triage speed and stakeholder communication: au lieu de handing a developer an abstract spreadsheet row, vous montrer the one-way relationship and the exact manquant return-tag error ensemble. Pour hundreds or thousands of clusters, garder Ahrefs Site Audit or Screaming Frog in the workflow pour complet explorer coverage; returntag is the fast façon to inspect and expliquer a spécifique cluster.

Reading it as a spreadsheet: the Screaming Frog filters

Si you’re in Screaming Frog, the matrix surfaces as a définir of filters (après vous run Explorer Analysis post-crawl to populate the return-link données). Fonctionner les in roughly ce order, parce que it maps to the priority order in Step 4:

  • Manquant Retourner Liens — the asymmetric cells; votre highest-priority findings.
  • Inconsistent Language & Region Retourner Liens — a retourner lien exists but with a différent code que the outbound un (A dit B is fr-FR, B dit A is en-GB quand A is really en-US) — a subtler pair-breaker.
  • Non-Canonical Retourner Liens — the retourner lien points at une URL that’s canonicalized elsewhere, so the signal chain breaks même though a tag exists.
  • Noindex Retourner Liens — the retourner target is noindexed, so it can’t carry the annotation.
  • Non-200 Hreflang URLs — the target is a redirection or an error page.
  • Unlinked Hreflang URLs and Incorrect Language & Region Codes — orphaned nodes and code-validation errors.

Export the whole définir via Reports > Hreflang. (Pour the complet filter-by-filter walkthrough at the summary level, the Screaming Frog hreflang tutorial is excellent — I’m pas going to re-type leur config steps ici.)

Step 3 — Classify ce que vous trouver into four error patterns

Votre explorer output va be noisy. Sort every finding into un of four buckets — ces are the patterns que repeat à travers the 374 756-domain study. (I’m pulling seulement the two figures que anchor the priority argument; the complet nine-type error table is déjà in the International SEO Audit article — aucun point re-pasting it.)

1. Manquant retourner tags — the pair-breaker

The asymmetric cells from votre matrix. 15,3% of hreflang-using domains have ces. As I put it in the study writeup: “As I mentioned, hreflang tags fonctionner in pairs. Si les deux pages don’t référence chaque autre, ils can’t establish the connection and swap correctement in the résultats de recherche.” Ce is the category que invalidates the whole pair’s signal per Google’s docs, qui is pourquoi it’s premier in the priority order — même though it’s pas the la plupart courant error.

2. Incorrect language/region codes — the quietly-forgiving un

Utiliser ISO 639-1 pour language and ISO 3166-1 alpha-2 pour region. The classic breakers: jp au lieu de ja pour Japanese, the typo js pour ja, three-letter codes comme gbr au lieu de gb, la (Laos) misused pour “Latin America.”

Un plus distinction worth building into votre audit: BCP 47 (the underlying language-tag spec) permits a beaucoup broader définir of valeurs que Google’s hreflang implementation en réalité acts on — script subtags and autre BCP 47-legal constructs que Google’s propre hreflang documentation doesn’t confirmer as recognized valeurs. A code peut be perfectly well-formed BCP 47 and encore pas be something Google’s hreflang guidance documents as pris en charge. Validate contre Google’s documented language/region/x-default rules specifically, pas generic BCP 47 well-formedness — a syntactically valid tag peut encore be functionally invisible to Google.

But here’s the nuance que cuts contre naive prioritization: Google silently corrects some of ces and pas others. Its documentation states que si vous utiliser codes reserved pour something sinon, “Recherche Google ignores que partie of the annotation (Par exemple, en utilisant EU, UN, or UK in hreflang annotations doesn’t have an effect on Google Search).” So UK is effectively dropped (vous vouloir GB), but it doesn’t nuke the rest of the annotation — whereas a code that’s simply incorrect (jp pour ja) fait break que pair. An audit nécessite to distinguish “technically wrong but Google handles it” from “wrong and actually breaks the pair,” parce que ils don’t obtenir the même urgency.

3. Non-URL canoniques in hreflang — the invisible un

Ce is the pattern que semble fine in a tag export and breaks anyway. A clé distinction I drew at Pubcon 2019: hreflang is à propos de the indexé version, pas the canonical. Si votre hreflang points to une URL that’s canonicalized away from what’s en réalité indexé, the signal chain breaks même though the tag itself is “valid.” Ce seulement surfaces quand vous cross-reference the explorer export contre indexation status — la plupart hreflang tutorials skip it parce que ils treat hreflang as an isolated tag vérifier au lieu de partie of the indexation pipeline. (Plus on verifying ce in Step 5.)

There’s a same-language alignment vérifier worth ajout ici aussi. Quand several near-duplicate URLs pourrait plausibly serve as the canonical pour a locale, Google’s propre canonicalization guidance favors a same-language (or best-substitute) URL, and donne some preference to une page that’s partie of a complet reciprocal hreflang cluster over un que isn’t. That’s a raison to garder hreflang targets pointed at same-language canonical candidates plutôt que letting les drift onto a different-language duplicate. None of ce is something a robot d’exploration or checker peut prove outright, though — it peut montrer vous the configuré signals (balise canonicals, hreflang edges, cluster membership), pas Google’s réel final selection. Treat explorer output as diagnostic evidence, pas confirmation.

Evidence for this claim Audit canonical targets for same-language or best-substitute alignment and compare reciprocal hreflang-cluster membership, because Google documents a cluster preference among otherwise similar URLs. Scope: localized HTML pages, HTTP headers, XML sitemaps and search systems as applicable Confidence: high · Verified: How to specify a canonical URL with rel=canonical and other methods

4. Mixed absolute/relative URLs — the templating bug

Google is explicit: “Alternate URLs doit be fully-qualified, notamment the transport méthode (http/https), so: https://example.com/foo, pas //example.com/foo or /foo.” At scale ce is almost jamais a one-off typo — it’s a templating bug que hits thousands of URLs at une fois parce que the hreflang block is generated from a partial URL pattern. That’s pourquoi robots d’exploration flag it as a systemic problème: trouver un, and you’ve usually trouvé a whole template’s worth.

Step 4 — Prioritize: retourner tags premier, codes suivant, x-default dernier

The unique la plupart important idea in ce whole article: error severity n’est pas proportional to error frequency. Sort votre findings by damage, pas by how nombreux rows the outil renvoyé.

TierError patternPourquoi ici
1 — fix premierManquant retourner tags; inconsistent return-link codesBreaks the entier pair’s signal per Google’s docs. Highest damage.
2 — fix suivantIncorrect codes que Google doesn’t silently fix (jpja); non-canonical / broken targetsBreaks individual relationships; some are silently handled, some aren’t — triage accordingly.
3 — batchMixed absolute/relative URLs, manquant self-referenceRéel hygiene problèmes, usually template-wide, but pas toujours cluster-breaking.
4 — dernierManquant x-defaultLa plupart courant, least damaging.

Pourquoi x-default goes dernier despite being everywhere: it’s the unique la plupart courant finding in every study — 56,3% in my 374 756-domain study, and 47,95% in Dan Taylor’s independent 18 786-domain SALT.agency study (two studies, very différent scales, même headline: la plupart sites are manquant it). But as I wrote in the study: “Setting an x-default n’est pas requis. But it is recommended si vous besoin a fallback page pour utilisateurs whose language settings don’t match quelconque of votre localized versions.” Google’s propre team treats it as a UX fallback, pas an indexing-critical signal — on Search Off the Record, Illyes décrit x-default as annotating a fallback page pour quand there’s aucun matching language pour a utilisateur, and noted it peut même be un autre language page plutôt que a dedicated selector. Fix it, but fix it après the choses que en réalité break clusters.

Self-reference sits in tier 3 pour the même raison: même Illyes, who worked on Google’s hreflang implementation, said on record he doesn’t entièrement remember pourquoi self-reference is requis and is fairly certain clusters voudrait fonctionner sans it — he framed it mainly as making clusters easier to définir up parce que vous pouvez copy/paste the même block everywhere. It’s implementation hygiene, pas a functional requirement.

Pour the broader impact × effort matrix que spans tout six international audit areas (pas simplement hreflang), utiliser the Frameworks lens in International SEO Audit plutôt que rebuilding it ici.

Step 5 — Re-verify contre the indexé URL, pas the explorer

Votre explorer validates the tags. It doesn’t validate que l’URL the tag points to is the un Google en réalité indexé. Parce que hreflang follows the indexé version (Step 3, pattern 3), a tag que points at une URL that’s been canonicalized away — or que redirections, or is noindexed downstream — encore breaks the signal même après votre bulk fix réussir reports “clean.”

So après the fixes ship, spot-check the highest-value clusters with Inspection d’URL in Search Console: confirmer l’URL Google reports as indexé is the même URL votre hreflang références. Ce is the step que catches canonical-chain drift, qui is invisible in a plain hreflang-tag export. Vous don’t do it pour every URL — vous do it pour votre money pages in chaque market, après the explorer dit you’re fait.

A one-line remarque on Bing

Don’t expect Bing Webmaster Outils to validate quelconque of ce. Bing treats hreflang as a beaucoup weaker signal que Google fait and supprimé its Geo Targeting fonctionnalité back in 2020 — it leans on the Content-Language header à la place. A hreflang-at-scale audit is fundamentally a Google-facing exercise; vérifier Content-Language pour Bing separately (covered in International SEO Audit).

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.