International SEO
Hreflang earns its error-prone reputation honestly: the annotation fails silently (no rendering breaks, no user notices), fails partially (some clusters wired, some orphaned), and fails invisibly profitably — sites run for years on broken hreflang, paying in mis-served versions and sibling competition nobody attributes. This companion to the main guide is the error catalogue from real audits: each mistake, its symptom, and its fix — the debugging reference for when international targeting misbehaves.
The catalogue, by frequency
- Missing return links (the champion): A declares B; B never declares A back — the whole annotation ignored, per the reciprocity law. Cause: one template or market updated in isolation. Symptom: hreflang "working" in source but versions still mis-serving. Fix: cluster-wide generation (the sitemap method's whole argument) and a crawler's reciprocity report per release.
- Invalid codes: en-UK (GB is the ISO code), region-alone values, invented regionals (en-eu, es-latam) — silently dropped. Fix: codes from the ISO lists only, validated mechanically; the regional-folder patterns for the group-targeting hreflang can't express.
- Hreflang-canonical contradiction: versions canonicalised to one URL while hreflang declares them apart — instructions at war, resolved unpredictably (usually as the canonical winning and markets losing their versions). Fix: every version self-canonical, hreflang across; the two systems agreeing is the checklist line.
- Targets that aren't final URLs: hreflang pointing at redirects, 404s, or noindexed pages — chain breaks per the target-integrity law. Cause: migrations and slug changes updating pages but not sibling annotations. Fix: the live-and-canonical verification in the quarterly audit pass.
- Partial-cluster coverage: hreflang on templates A and B, forgotten on C (blog wired, products not — or vice versa) — per-page annotation meaning per-page gaps. Symptom: targeting working for half the site, the mystery halved-and-hidden in blended dashboards; the per-market segmentation surfaces it.
- x-default absent or aimed wrong: unmatched locales falling to an arbitrary version instead of the intended selector/primary — the fallback line every set needs once.
- Method-mixing: tags on some pages, sitemap entries for others, disagreeing — one method per site, per the main guide; migrations between methods completed, not layered.
The debugging workflow
Symptom-first: wrong version ranking in a market → check that page-pair's annotations both directions (view-source or the sitemap entries), then their canonicals, then whether the local version simply loses on merit (hreflang biases among equivalents; it doesn't rescue weak versions — the diagnosis fork that saves weeks). Systematic mis-serving → the crawler's hreflang audit (reciprocity, validity, target status — every serious crawler reports these) against the intended matrix. After every migration/slug event → the target-integrity pass, because URL changes are where working implementations go to break, per the checklist's standing line-item.
Frequently asked questions
Google Search Console removed the hreflang error reports — where do I check now?
The instrumentation moved to your side: crawler hreflang reports as the primary audit (reciprocity/validity/targets), per-market performance segmentation as the outcome check (right versions earning right-country impressions), and spot URL Inspection for how Google parsed specific pages. The deprecations made the quarterly self-audit non-optional.
How big does a site need to be before hand-managed hreflang breaks?
Experience says: the second market or the first migration, whichever comes first — hand-maintained tag sets survive exactly until the cluster edit someone forgets. Generation (plugin or sitemap pipeline) from day one is the cheap insurance.
We fixed everything — how fast do mis-served markets correct?
The recrawl rhythm over the cluster — weeks for the pattern to settle, the right-version-right-market check confirming per market. No correction after two months means an error surviving the fix (re-audit — usually a second instance of the same class) or the merit fork above: the local version needs the local authority hreflang was never going to supply (that's us).