The rule: self-canonical, then hreflang
Each localized version is a separate page. Give each one a rel="canonical" pointing to itself, and use those exact canonical URLs in the hreflang set:
<!-- on https://example.com/de/ --> <link rel="canonical" href="https://example.com/de/" /> <link rel="alternate" hreflang="en" href="https://example.com/" /> <link rel="alternate" hreflang="de" href="https://example.com/de/" />
Flip a canonical, watch hreflang fail
A common CMS mistake is to set every translation's canonical to the original language. Try it below.
- enexample.com/canonical → itselfthe English page
- en-GBexample.com/uk/canonical → itself
- deexample.com/de/canonical → itself
- frexample.com/fr/canonical → itself
A cross-language canonical is a contradiction: hreflang says "show /de/ to German speakers", while the canonical on /de/ says "/de/ is just a copy of /". Google generally follows the canonical, and the German page drops out of results together with the hreflang annotation that pointed at it.
Same language, different countries
An en-US and an en-GB page with nearly identical text are a real duplicate case. Two valid options:
- Keep both self-canonical and link them with hreflang. Google may still pick one as the canonical for indexing, but hreflang lets it show the British URL to UK searchers. Localize what differs (currency, spelling, shipping) to strengthen the signal.
- Pick a preferred version with rel=canonical, as Google's multi-regional guide describes for duplicate same-language content. Then drop the non-canonical page from the hreflang set, since hreflang should only list canonical URLs.
Checklist
- Hreflang URLs match each page's canonical exactly, including protocol, host, trailing slash and parameters.
- No hreflang URL redirects, returns 4xx/5xx or is
noindex. - Paginated and filtered URLs follow the same rule: only reference indexable, canonical ones.
The hreflang checker reads the canonical of your page and of every alternate, and flags any that point elsewhere. Other failure types are covered in common hreflang errors.
Canonical and hreflang questions
Should each language version have a self-referencing canonical?
Yes. Each localized page is its own page, so its canonical should point to itself. Pointing all versions’ canonicals at one language asks Google to drop the others.
Can hreflang and canonical conflict?
Yes. If the German page’s canonical points to the English page, Google is told that the German URL is a duplicate. Hreflang links pointing at a non-canonical URL are then likely to be ignored.
What about same-language pages for different countries?
For near-duplicate pages in one language (for example en-US and en-GB with the same text), you can keep both self-canonical and connect them with hreflang. Google may still fold them into one canonical, but hreflang lets it show the right URL to each audience. Google’s multi-regional guide adds that if you prefer one version, rel=canonical can express that.
Why does Search Console show a different canonical for my localized page?
Google may choose one canonical among very similar localized pages. Search Console’s performance report then attributes clicks to that canonical, even when the searcher was shown the localized URL via hreflang.
Should hreflang URLs include tracking parameters?
No. Use the clean canonical URL of each version in hreflang, the same URL that each page declares as its canonical.