When canonical and hreflang fight, hreflang loses
One of the most damaging — and most invisible — failure modes: a rel=canonical that contradicts the hreflang cluster.
The setup we keep finding. Each locale page correctly lists its alternates. But every page also carries a canonical pointing to the English version. The site has simultaneously said "these are equal language alternates" and "actually, the English one is the real version of all of them."
These signals are contradictory, and canonical is the stronger consolidation instruction. The observed result: locale pages get dropped from the index in favor of the canonical target, and the hreflang annotations are effectively discarded because their members no longer canonicalize to themselves.
The rule that resolves it:
— Every page in an hreflang cluster must be self-canonical. /fr/page canonicalizes to /fr/page, not to /en/page
— Cross-language pages are alternates, never canonical duplicates of one another
— Canonical should only point elsewhere for true same-language duplicates (e.g. a tracking-parameter URL)
The fix: make each localized URL its own canonical, then layer hreflang on top.
Nuance worth stating: translated pages are not "duplicate content" in Google's sense and never need cross-language canonicalization. The instinct to canonicalize translations to a master page is the root cause here, and it's surprisingly common in CMS defaults. Audit canonical-vs-hreflang agreement on every multilingual template.
Hreflang Lab
@HreflangLab
When canonical and hreflang fight, hreflang loses
Этот пост опубликован в Telegram-канале Hreflang Lab. Подписаться можно по ссылке: @HreflangLab.