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.
Langues
1 indice probant sur cette page
- Outil en ligne associéreturntag - hreflang checker
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 — Auditing hreflang “at scale” signifie checking votre whole site’s hreflang as un connected network au lieu de looking at pages un at a temps. The trick is que hreflang fonctionne in matched pairs — si page A points to page B, B has to point back to A, or Google throws the whole pair out. A single-page vérifier peut jamais catch a manquant retourner lien, so vous besoin a robot d’exploration que reads every page and maps who points to whom. Fix the manquant retourner liens premier; the manquant x-default que every outil complains à propos de peut wait.
Pourquoi “one page at a time” doesn’t fonctionner
Si vous view-source on votre German page and voir a tidy block of hreflang tags, it semble fine. But hreflang seulement fonctionne si lune pages it références point back. Votre German page peut be perfect and encore be broken, parce que the English page it noms forgot to nom it in retourner. Vous pouvez’t voir que from the German page alone — you’d have to ouvrir the English page aussi, and the French page, and every autre version, and cross-check les tout by hand. On a ten-page site, fine. On a ten-thousand-page site, impossible.
That’s the whole raison “auditing hreflang at scale” is its propre skill: vous arrêter checking tags and commencer checking relationships. A outil crawls every page, records every hreflang annotation, and alors demande the seulement question que matters — fait every page in ce groupe point to every autre page, les deux directions?
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 guidelinesCe que vous en réalité besoin
Three choses:
- A robot d’exploration. Google donne vous aucun hreflang validator, and the old Search Console report que utilisé to flag some of ce was supprimé back in 2022. So vous lean on third-party robots d’exploration — Ahrefs Site Audit or Screaming Frog — to pull everything into un placer. 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 reciprocal vérifier. Les deux outils do the même core chose: ils construire a map of who-points-to-whom and flag the one-way liens. Ceux one-way liens are votre “missing return tags,” and they’re the errors que en réalité matter.
- A priority order. Vous va trouver hundreds of problèmes. Fix the manquant retourner liens premier (ils break pairs), alors incorrect country/language codes, and leave the manquant x-default pour dernier — it’s the la plupart courant complaint but the least harmful.
The un chose to remember
La plupart sites que utiliser hreflang have errors. Quand I studied 374 756 domains pour Brighton SEO in 2023, over 67% of the ones en utilisant hreflang had au moins un error. So don’t panic quand votre premier explorer lights up red — that’s normal. The skill isn’t getting to zero errors; it’s knowing qui of les en réalité cost vous trafic and fixing ceux premier.
Pour the broader international audit — Structure d’URL, geo-redirects, content quality, country performances — voir International SEO Audit. Pour ce que hreflang même is and how to implement it, commencer with Hreflang. Vouloir the complet at-scale methodology — the reciprocal-tag matrix, the cluster-graph walkthrough, the Screaming Frog filters? Switch to the Avancé tab.
Validate hreflang fixes
Reciprocal cluster retest
Tester to run: Re-crawl every modifié cluster and comparer réel self and alternate edges with the attendu locale matrix. Attendu result: Every member références itself and tout intended alternates, and every edge has a retourner edge. Échec interpretation: The fix modifié un template or page sans updating the whole cluster. Monitoring window: Immédiatement après deployment and après the suivant generation cycle. Rollback trigger: A modifié cluster encore contient asymmetric priority-locale pairs.
Target integrity
Tester to run: Requête every modifié hreflang destination sans suivant redirections and collect status, robots directives, and canonical. Attendu result: Targets retourner direct 200 réponses, remain indexable, and canonicalize as intended. Échec interpretation: The locale map points to obsolete, redirigé, blocked, or consolidated URLs. Monitoring window: Release verification and the suivant complet explorer. Rollback trigger: Quelconque high-value cluster targets errors or unexpected non-URL canoniques.
Delivery-method consistency
Tester to run: Comparer annotations trouvé in HTML, HTTP headers, and XML sitemaps pour modifié URLs. Attendu result: Seulement the intended méthode is présent, or tout generated méthodes declare the même cluster. Échec interpretation: Multiple systems propre hreflang and have drifted. Monitoring window: Après deployment and après the suivant sitemap refresh. Rollback trigger: Contradictory méthodes remain on production URLs.
Code and scope validation
Tester to run: Validate every modifié valeur contre pris en charge language and region codes and the approved locale inventory. Attendu result: Chaque valeur begins with a valid language and adds seulement an intentional valid region. Échec interpretation: A country was utilisé as a language, an unsupported market leaked in, or casing/format generation is incorrect. Monitoring window: In CI or predeployment QA and à nouveau in the production explorer. Rollback trigger: Invalid codes affecter a generated template or multiple clusters.
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
Linkheaders, 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 versionsThe 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:
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“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
hreflangannotations, ceux annotations may be ignored or pas interpreted correctement.”
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- HTML
<link>tags in the<head>— the courant cas. - HTTP
Link:réponse headers — utilisé pour non-HTML fichiers comme PDFs. xhtml:linkentries 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:
- 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.
- 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 isen-GBquand A is reallyen-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 methods4. 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é.
| Tier | Error pattern | Pourquoi ici |
|---|---|---|
| 1 — fix premier | Manquant retourner tags; inconsistent return-link codes | Breaks the entier pair’s signal per Google’s docs. Highest damage. |
| 2 — fix suivant | Incorrect codes que Google doesn’t silently fix (jp→ja); non-canonical / broken targets | Breaks individual relationships; some are silently handled, some aren’t — triage accordingly. |
| 3 — batch | Mixed absolute/relative URLs, manquant self-reference | Réel hygiene problèmes, usually template-wide, but pas toujours cluster-breaking. |
| 4 — dernier | Manquant x-default | La 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).
AI summary
A condensed prendre on the Avancé version:
- It’s a graph problem, pas a tag problem. Vous vérifier si every page in a cluster points back to every autre page — pas si un page has a tag. Per Google: “If page X links to page Y, page Y must link back to page X,” or the annotations “may be ignored.” Un manquant retourner lien peut invalidate a whole cluster.
- Step 1 — pull everything. Hreflang lives in three places (HTML head, HTTP
Linkheaders, XML sitemap); a robot d’exploration doit lire tout three. Configurer ccTLD/subdomain siblings (Screaming Frog: Config > CDNs; Ahrefs: project scope) or cross-domain liens go unvalidated. GSC can’t do ce — the International Targeting report was supprimé Sept 22, 2022, and même avant que it seulement reported the canonical member of a cluster. - Step 2 — the reciprocal-tag matrix. Every URL × every URL in a cluster; asymmetric cells = manquant retourner tags. Lire a focused cluster visually in returntag’s graph and matrix, or fonctionner site-wide via Ahrefs Site Audit and Screaming Frog.
- Step 3 — four error patterns: manquant retourner tags; incorrect codes (Google silently fixes
reserved ones comme
UK→ignored, pas others commejppourja); non-canonical targets (hreflang follows the indexé URL); mixed absolute/relative URLs (a template bug at scale). - Step 4 — prioritize by damage, pas frequency. Retourner tags premier (break the whole pair), alors codes/broken targets, alors x-default dernier — la plupart courant (56,3% in my 374 756-domain study; 47,95% in SALT.agency’s) but least harmful and “not required.”
- Step 5 — re-verify contre the indexé URL with Inspection d’URL après the fix réussir; the explorer validates tags, pas indexing-status drift.
- Scale context: over 67% of hreflang-using domains have au moins un error (my Brighton SEO 2023 study of 374 756 domains). Bing is a one-line caveat — vérifier Content-Language, pas hreflang.
Documentation officielle
Primary-source références pour a hreflang audit.
- Tell Google à propos de localized versions of votre page — the hreflang référence: the reciprocal return-tag requirement, the fully-qualified-URL rule, reserved-code handling, and the three equivalent implementation méthodes (HTML lien tags, HTTP
Linkheaders, XML sitemap). - The International Targeting report is deprecated — Search Console Aider — the supprimé report que utilisé to flag some hreflang problèmes (supprimé après September 22, 2022).
- Managing Multi-Regional and Multilingual Sites — URL-structure context pour pourquoi multi-property setups generate the la plupart hreflang errors.
- How to specify une URL canonique with rel=canonical and autre méthodes — the same-language canonical-preference guidance behind Step 3’s non-canonical hreflang vérifier.
Bing / Microsoft
- Bing Webmaster Outils aider — Bing has aucun hreflang validation workflow; it weights the Content-Language header à la place and supprimé Geo Targeting in 2020.
Quotes from the source
On-the-record statements que anchor the audit methodology.
Google — the reciprocal requirement (the backbone of the whole audit)
- “If page X links to page Y, page Y must link back to page X. If this is not the case for all pages that use
hreflangannotations, those annotations may be ignored or not interpreted correctly.” — Recherche Google Central docs. Jump to quote
Google — fully-qualified URLs (root causer of the mixed absolute/relative pattern)
- “Alternate URLs must be fully-qualified, including the transport method (http/https), so:
https://example.com/foo, not//example.com/fooor/foo.” — Recherche Google Central docs. Jump to quote
Google — reserved codes are silently dropped, pas page-breaking
- “If you use codes that are listed as reserved for something else, Google Search ignores that part of the annotation (for example, using
EU,UN, orUKinhreflangannotations doesn’t have an effect on Google Search).” — Recherche Google Central docs. Jump to quote
Patrick Stox — pourquoi pairs are load-bearing (from the 374 756-domain study)
-
“As I mentioned, hreflang tags work in pairs. If both pages don’t reference each other, they can’t establish the connection and swap properly in the search results.” — Over 67% of Domains En utilisant Hreflang Have Problèmes, Ahrefs
-
“Setting an x-default is not required. But it is recommended if you need a fallback page for users whose language settings don’t match any of your localized versions.” — Over 67% of Domains En utilisant Hreflang Have Problèmes, Ahrefs
Gary Illyes, Google — pourquoi GSC can’t audit hreflang, and pourquoi there’s aucun validator
- On Search Off the Record, Illyes explained que Search Console seulement reports canonicals, so pour the nombreux hreflang clusters où the alternates aren’t canonical you’re effectively blind to the non-canonical members — Google puts les in the duplicate cluster sans storing the alternate details. He aussi said Google has jamais provided an hreflang validator (ils had underused reporting and supprimé it) and now points personnes to external outils. Paraphrased from the transcript — vérifier wording contre the episode page avant quoting verbatim.
Qui finding do I fix premier?
You’ve run the explorer and you’re staring at a wall of red. Walk chaque finding via ce:
-
Is the retourner lien manquant or code-inconsistent (asymmetric cell)? → Yes → Tier 1. Fix now. Ce breaks the whole pair per Google’s docs. Everything sinon waits behind ce. → Aucun → continuer.
-
Fait the hreflang point to a non-200, redirigé, noindexed, or non-URL canonique? → Yes → Tier 2. Fix suivant. The target can’t carry the annotation. Pour non-canonical specifically, confirmer contre the indexé URL (Inspection d’URL), pas simplement the canonical tag. → Aucun → continuer.
-
Is the language/region code incorrect? → Is it a reserved code Google silently ignores (
UK,EU,UN)? → Yes → low urgency. Google drops simplement que partie; fix pour correctness, pas as an emergency. → Is it a genuinely incorrect code que breaks the match (jppourja,jstypo, three-lettergbr)? → Yes → Tier 2. Fix suivant. Ce breaks the relationship. -
Is it a mixed absolute/relative URL (
//example.com/…or/…)? → Yes → Tier 3, but vérifier the template. Almost toujours a site-wide templating bug — un instance signifie thousands. Fix at the template, batch the rest. -
Is it a manquant self-reference or manquant x-default? → Yes → Tier 4. Dernier. Réel hygiene, pas cluster-breaking. x-default is “recommended, pas requis”; self-reference is copy/paste convenience. Do ces in a final sweep.
The rule underneath the tree: sort by damage, pas by how nombreux rows the outil renvoyé. The la plupart courant error (x-default) is the least damaging.
SOP: the recurring hreflang audit
Hreflang breaks silently every temps developers ship a template modifier, so run ce on a schedule (monthly pour active international sites, or après quelconque release que touches localized templates).
Prep
- Confirmer robot d’exploration scope covers every property in the hreflang network — tout ccTLDs, subdomains, subfolders. In Screaming Frog, ajouter siblings sous Config > CDNs; in Ahrefs Site Audit, confirmer they’re in project scope.
- Confirmer the robot d’exploration reads tout three annotation locations (HTML head, HTTP
Linkheaders, XML sitemap). Vérifier by checking une page vous know uses sitemap-based hreflang.
Explorer 3. Enable hreflang extraction (Screaming Frog: Configuration > Spider > Explorer Hreflang). Run the explorer. 4. Run post-crawl analysis (Screaming Frog: Explorer Analysis) so return-link filters populate. In Ahrefs, let Site Audit finish and ouvrir the hreflang problème définir.
Triage (in ce order) 5. Tier 1 — Manquant Retourner Liens + Inconsistent Return-Link Codes. Export ces premier. Ouvrir the worst-hit clusters in returntag’s graph/matrix to expliquer the broken edges; retain the robot d’exploration export as le site-wide source of coverage. 6. Tier 2 — Non-canonical / broken / noindexed targets, and genuinely incorrect codes. 7. Tier 3 — Mixed absolute/relative URLs (fix at the template), manquant self-reference. 8. Tier 4 — Manquant x-default. Dernier.
Segment 9. Groupe every finding by property/domain, pas simplement by error type — errors cluster où URL patterns vary à travers properties. Ce indique vous qui team’s template to fix.
Vérifier 10. Après fixes ship, re-crawl. Alors spot-check money pages per market with Inspection d’URL to confirmer hreflang points to the indexé URL, pas a canonicalized-away un. 11. Record the error counts by tier chaque cycle so vous pouvez voir drift over temps.
Hreflang audit myths and mistakes
Concrete misconceptions que lead personnes to audit the incorrect choses — chaque with pourquoi it’s incorrect and Que faire à la place.
1. “Broken hreflang gets my site penalized, so any error is urgent.”
- Pourquoi incorrect: Google ignores broken or asymmetric hreflang; it doesn’t penalize pour it. Gary Illyes has said directement que an incorrect hreflang implementation won’t hurt a site — Google simply ignores it (reported by Moteur de recherche Roundtable and corroborated by Moteur de recherche Journal). The cost is lost opportunity (wrong-language pages surfacing, market cannibalization), pas a ranking penalty.
- Do à la place: Triage by lost opportunity per cluster (trafic, revenue), pas by fear of a penalty que doesn’t exist.
2. “Missing x-default is the most common error, so fix it first.”
- Pourquoi incorrect: Frequency and severity are différent axes. x-default is the unique la plupart courant finding (56,3% in my study; 47,95% in SALT.agency’s) but it’s “recommended, pas requis” and functions as a UX fallback, pas a cluster-critical signal.
- Do à la place: Put x-default dernier. Fix manquant retourner tags premier — ils break entier pairs.
3. “Self-referencing tags are mandatory, flag every missing one as critical.”
- Pourquoi incorrect: Même Illyes, who worked on Google’s hreflang implementation, said on record he isn’t certain pourquoi self-reference is requis and believes clusters voudrait fonctionner sans it — it’s mainly copy/paste convenience.
- Do à la place: Fix self-reference in the final hygiene sweep (tier 3–4), pas ahead of return-tag and code errors.
4. “The html lang attribute is a language signal Google checks, so audit it alongside
hreflang.”
- Pourquoi incorrect: Asked directement on Search Off the Record si Google cares à propos de the HTML
langattribute, Illyes said aucun — it’s souvent baked into CMS templates by par défaut and therefore untrustworthy, so Google detects language from the visible content à la place. - Do à la place: Garder
html langcorrect pour accessibility and autre engines, but don’t let a hreflang-vs-langmismatch outrank an réel return-tag error in votre triage.
5. “GSC’s report is gone, so without a paid crawler I can’t audit hreflang at all.”
- Pourquoi incorrect: A manual view-source spot-check plus free/freemium validators (Aleyda Solis’ outil, Bill Hunt’s checker, Merkle’s outil — tout named by Illyes as outils he’s trouvé reliable, though Google’s propre documentation is clair it doesn’t maintain or vérifier third-party hreflang outils) fonctionner fine pour petit sites. It’s scale que exige a robot d’exploration, pas the absence of GSC.
- Do à la place: Match the outil to the size. Spot-check petit sites manually; reserve the robot d’exploration pour le sites où hand-checking clusters is genuinely impossible.
6. “My hreflang export is clean, so hreflang is fine.”
- Pourquoi incorrect: A clean tag export doesn’t mean the targets are indexé. Hreflang follows the indexé URL, pas the canonical — a tag pointing at a canonicalized-away or noindexed URL encore breaks même though the tag “looks” valid.
- Do à la place: Cross-reference contre indexation status (Inspection d’URL) pour votre top clusters après the tag-level réussir.
Avant / après: reading the four patterns
Concrete, minimal exemples of chaque error pattern and its fix. (Illustrative markup.)
1. Manquant retourner tag (the pair-breaker)
Avant — the US page points to the UK page, but the UK page jamais points back:
<!-- https://example.com/us/ (present) -->
<link rel="alternate" hreflang="en-US" href="https://example.com/us/" />
<link rel="alternate" hreflang="en-GB" href="https://example.com/uk/" />
<!-- https://example.com/uk/ (BROKEN — no link back to /us/) -->
<link rel="alternate" hreflang="en-GB" href="https://example.com/uk/" />Après — the UK page noms the US page in retourner, so the pair is symmetric:
<!-- https://example.com/uk/ (fixed) -->
<link rel="alternate" hreflang="en-US" href="https://example.com/us/" />
<link rel="alternate" hreflang="en-GB" href="https://example.com/uk/" />2. Incorrect language/region code
Avant — jp is a country code, pas the language code pour Japanese; en-UK isn’t valid:
<link rel="alternate" hreflang="jp" href="https://example.com/jp/" />
<link rel="alternate" hreflang="en-UK" href="https://example.com/uk/" />Après — ISO 639-1 language (ja) and ISO 3166-1 alpha-2 region (GB, pas UK):
<link rel="alternate" hreflang="ja" href="https://example.com/jp/" />
<link rel="alternate" hreflang="en-GB" href="https://example.com/uk/" />3. Mixed absolute/relative URLs (a template bug at scale)
Avant — protocol-relative and root-relative URLs; Google exige fully-qualified:
<link rel="alternate" hreflang="fr-FR" href="//example.com/fr/" />
<link rel="alternate" hreflang="de-DE" href="/de/" />Après — fully-qualified, notamment the transport méthode:
<link rel="alternate" hreflang="fr-FR" href="https://example.com/fr/" />
<link rel="alternate" hreflang="de-DE" href="https://example.com/de/" />4. Non-canonical target (semble valid, encore breaks)
Avant — the hreflang points at une URL that’s canonicalized away from the indexé version:
<!-- hreflang points here… -->
<link rel="alternate" hreflang="es-ES" href="https://example.com/es/producto?ref=nav" />
<!-- …but /es/producto?ref=nav has: <link rel="canonical" href="https://example.com/es/producto"> -->Après — hreflang points at the canonical/indexé URL, so the signal chain holds:
<link rel="alternate" hreflang="es-ES" href="https://example.com/es/producto" />The catch with #4: vous pouvez’t voir it from the tag alone. Confirmer the indexé URL with URL Inspection avant vous trust que ce one’s fixed.
Pulling and checking hreflang yourself
Pour spot-checks, ad-hoc extraction, and validating a fix avant the suivant complet explorer. The robot d’exploration is encore votre source of truth at scale — ces are pour the in-between.
Chrome DevTools Console — dump every hreflang on the current page
Paste into the Console on quelconque page to liste its annotations and flag protocol-relative or root-relative URLs:
[...document.querySelectorAll('link[rel="alternate"][hreflang]')]
.map(l => {
const href = l.getAttribute('href');
const bad = /^\/\//.test(href) || /^\/(?!\/)/.test(href);
return `${l.hreflang}\t${href}${bad ? '\t⚠ not fully-qualified' : ''}`;
})
.join('\n') || 'No HTML hreflang tags on this page (check headers / sitemap).';Si it prints “No HTML hreflang tags,” lune page may deliver hreflang via HTTP header or sitemap — the Console seulement sees the DOM, so vérifier ceux separately.
Bookmarklet — one-click reciprocity spot-check à travers a cluster
Récupère every alternate the current page noms and reports qui ones échouer to lien back (same-origin seulement, due to navigateur CORS — cross-ccTLD pairs besoin the robot d’exploration):
javascript:(async()=>{const base=location.href.split('#')[0];const alts=[...document.querySelectorAll('link[rel="alternate"][hreflang]')].map(l=>({lang:l.hreflang,href:l.href})).filter(a=>a.lang!=='x-default');const out=[];for(const a of alts){try{const html=await(await fetch(a.href)).text();const back=/hreflang=["'][^"']*["']\s+href=["']([^"']+)["']/gi;let m,found=false;while((m=back.exec(html))){if(m[1].split('#')[0].replace(/\/$/,'')===base.replace(/\/$/,'')){found=true;break;}}out.push(`${found?'✓':'✗ MISSING RETURN'} ${a.lang} ${a.href}`);}catch(e){out.push(`? ${a.lang} ${a.href} (fetch blocked — cross-origin)`);}}alert(out.join('\n'));})();grep / regex — extract hreflang from a enregistré sitemap or HTML dump
Pull every annotation out of a downloaded XML sitemap or explorer HTML export:
# From an XML sitemap using xhtml:link hreflang
grep -oE 'hreflang="[^"]+"[^>]*href="[^"]+"' sitemap.xml
# From a directory of saved HTML pages — list hreflang value + href per file
grep -rhoE '<link[^>]*hreflang="[^"]+"[^>]*>' ./pages/ \
| grep -oE 'hreflang="[^"]+"|href="[^"]+"'Python — construire the reciprocity matrix from a Screaming Frog export
Turn a Screaming Frog hreflang_all.csv-style export (columns: URL source, hreflang valeur,
URL cible) into a définir of one-way (missing-return) pairs:
import csv
from collections import defaultdict
links = defaultdict(set) # source -> set of targets it points to
with open("hreflang_export.csv", newline="", encoding="utf-8") as f:
for row in csv.DictReader(f):
src, tgt = row["Address"].strip(), row["Occurrence URL"].strip()
if src and tgt and src != tgt:
links[src].add(tgt)
missing = [(a, b) for a, targets in links.items()
for b in targets
if a not in links.get(b, set())]
print(f"{len(missing)} one-way (missing-return) pairs:")
for a, b in missing[:50]:
print(f" {a} -> {b} (no return link)")Adjust the column noms to match votre export. The output is exactly the asymmetric cells of the reciprocal-tag matrix — the tier-1 fixes.
Outils pour a scaled hreflang audit
- returntag (principal pour graph/matrix spot-checks). My free outil turns une page or sitemap cluster into a graph and reciprocal matrix, alors noms manquant retourner relationships and leur fixes. Page URL mode checks une page cluster; Sitemap mode validates seulement ce que le sitemap declares. Utiliser it to investigate and communicate a spécifique cluster, pas as a substitute pour a whole-site explorer.
- Ahrefs Site Audit (at scale). Extracts hreflang from HTML, headers, and sitemaps, runs the reciprocal checks, and renders chaque cluster as a network graph — URL Details > Hreflangs tab, broken edges in red. The fastest façon to voir qui relationship in a cluster is broken, and the easiest to montrer a stakeholder. Utiliser Page Explorer to filter pages by hreflang problème type avant drilling into individual graphs.
- Screaming Frog SEO Spider. Enable Configuration > Spider > Explorer Hreflang; ajouter sibling ccTLDs sous Config > CDNs pour cross-domain validation; run Explorer Analysis to populate the return-link filters (Manquant Retourner Liens, Inconsistent Language & Region Retourner Liens, Non-Canonical Retourner Liens, Noindex Retourner Liens, Non-200 Hreflang URLs, Unlinked Hreflang URLs). Export via Reports > Hreflang. Leur hreflang tutorial is the definitive config référence.
- Recherche Google Console — Inspection d’URL. Pas pour bulk auditing (the International Targeting report is gone, and GSC seulement ever reported the canonical member of a cluster), but essential pour Step 5: confirming votre hreflang points at the indexé URL après the fix réussir.
- Free/freemium validators pour petit sites and spot-checks — Aleyda Solis’ hreflang tag generator/tester, Bill Hunt’s hreflang checker, and Merkle’s hreflang outil (named by Google’s Gary Illyes as outils he knows fonctionner bien — though Google’s propre documentation is explicit que it doesn’t maintain or vérifier third-party hreflang outils). Utiliser ces quand hand-checking is encore feasible; reserve the robot d’exploration pour vrai scale, and treat quelconque tool’s verdict as diagnostic, pas official.
- Bing Webmaster Outils — aucun hreflang validation; audit Content-Language separately pour Bing markets.
Ressources utiles
My connexe writing
- Over 67% of Domains En utilisant Hreflang Have Problèmes (Study of 374 756 Domains) — my Brighton SEO 2023 study, the largest hreflang study to date and the spine of ce whole methodology; the error distribution and the return-tag/x-default figures come from ici.
- Hreflang: The Facile Guide pour Beginners — the Ahrefs implementation guide, pour the fundamentals ce article assumes vous déjà know.
- The Beginner’s Guide to SEO technique — où international signals sit in the wider technical picture.
My speaking
- Hreflang Study and Interesting Problèmes — Brighton SEO 2023 (Speaker Deck) — the slides behind the study.
- The la plupart courant hreflang problèmes à travers 374 756 domains — Brighton SEO, Sept 2023 (YouTube) — the talk itself.
- International SEO: The Weird Technical Parts — Pubcon Vegas 2019 (SlideShare) — où I faire the “hreflang follows the indexed version, not the canonical” point que drives Step 3 and Step 5.
From autour the industry
- Tell Google à propos de localized versions of votre page — Google’s canonical hreflang référence (reciprocity, fully-qualified URLs, reserved codes).
- Search Off the Record — “How serving works, hreflang, and more!” — Google’s Search Relations team (Illyes, Splitt, Sassman) on pourquoi GSC seulement reports canonicals, pourquoi there’s aucun validator, and pourquoi big multi-property sites generate the la plupart errors.
- How To Audit & Tester Hreflang (Screaming Frog) — the definitive filter-by-filter config walkthrough.
- Study: 31% of international websites contain hreflang errors (Moteur de recherche Land) — Dan Taylor / SALT.agency’s independent 18 786-domain study, a utile cross-check on my plus grand un.
- Google Dit Ils Va Ignore Incorrect hreflang Implementation (Moteur de recherche Roundtable) — the “ignored, not penalized” point que reorders votre triage away from panic.
- Google Insights: Peut Incorrect Hreflang Tags Hurt SEO? (Moteur de recherche Journal) — corroborates the même finding.
Testez vos connaissances: Auditing hreflang at scale
Five rapide questions on the at-scale methodology. Pick an réponse pour chaque, alors vérifier.
Journal des modifications
Mis à jour le 25 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.
Mis à jour le 18 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.