Hreflang and canonical tags solve different problems. A canonical tag tells search engines which URL is the preferred version among duplicate or near-duplicate pages in the same language; hreflang tells them which URLs are language or regional versions of the same content, so each user gets the right one. On an international site you use both together: every language version is its own canonical, and the hreflang annotations connect those canonicals to each other.
Hreflang vs canonical at a glance
Canonical (rel="canonical") | Hreflang (rel="alternate" hreflang) | |
|---|---|---|
| Question it answers | Which of these duplicate URLs should be indexed? | Which version should a user with this language or region see? |
| Typical case | Parameters, tracking codes, HTTP/HTTPS, print versions, the same article under two paths | /en/, /de/, /fr/ or en-us vs. en-gb versions of one page |
| Relationship between pages | Many URLs point to one | All versions point to each other, including themselves |
| Where you set it | HTML head, HTTP header, sitemap (weak), redirects (strong) | HTML head, HTTP header or XML sitemap |
| What goes wrong most often | Translated page canonicalized to the original language | Missing return links, wrong codes, links to non-canonical URLs |
What is a canonical tag?
A canonical tag names the preferred URL when the same content is reachable under several addresses: <link rel="canonical" href="https://example.com/en/pricing">. Google describes rel="canonical" as a strong signal, redirects as a strong signal and inclusion in a sitemap as a weak one. None of them is an absolute command: Google can still select a different canonical if other signals disagree (Google Search Central: How to specify a canonical URL).
Google's documented don'ts are worth knowing because they come up in real audits:
- Don't use robots.txt for canonicalization.
- Don't use
noindexto choose a canonical within a site. - Don't declare different canonicals for the same page through different methods (for example one in the HTML, another in the sitemap).
A self-referencing canonical on every indexable page is common practice: it keeps parameter and tracking variants from competing with the clean URL. One frequent mistake: on paginated lists, Google says not to use page 1 as the canonical for page 2, 3 and so on, but to give each page its own canonical URL (Google: Pagination best practices).
What is hreflang used for?
Hreflang tells Google which pages are localized versions of each other, so it can show the version that fits the searcher's language or region. The documented rules (Google Search Central: Tell Google about localized versions of your page):
- Three methods: HTML link elements, HTTP headers (useful for PDFs) or the XML sitemap. Pick one per URL set and keep it consistent.
- Self-reference: each language version must list itself as well as all other versions.
- Return links: if two pages don't both point to each other, the annotations are ignored.
- Codes: language in ISO 639-1 (
en,de), optionally followed by a region in ISO 3166-1 Alpha 2 (en-gb,de-ch). A region code alone is not valid. - x-default: the reserved value
x-defaultmarks the fallback for users whose language or region matches none of your versions. - Language detection: Google does not use hreflang or the HTML
langattribute to detect a page's language; it determines the language algorithmically. Hreflang tells Google which versions belong together, but it cannot turn a page into another language.
A complete set for a page in English and German plus a fallback looks like this. The hreflang lines are identical on both pages; only the canonical differs:
<link rel="canonical" href="https://example.com/en/pricing"> <!-- on the German page: /de/preise -->
<link rel="alternate" hreflang="en" href="https://example.com/en/pricing">
<link rel="alternate" hreflang="de" href="https://example.com/de/preise">
<link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing">
How to use hreflang and canonical tags together
Google's canonical documentation contains the one rule that connects both tags: if you use hreflang, specify a canonical page in the same language, or the best possible substitute language if no same-language canonical exists. It also says that, for canonicalization, Google prefers URLs that are part of hreflang clusters (Google: consolidate duplicate URLs).
In practice that gives three rules:
- Each language version canonicalizes to itself. /de/preise has the canonical /de/preise, not /en/pricing.
- Hreflang points only to canonical URLs. If an alternate URL redirects, is set to
noindexor canonicalizes elsewhere, you are presenting a version you have also told search engines not to index. Those signals contradict each other. - Canonical and hreflang describe the same set of URLs. Parameter variants canonicalize to the clean URL of their own language, and only the clean URLs appear in the hreflang cluster.
The most expensive mistake: canonical to the original language
Teams sometimes set the canonical of every translation to the English "master" page, thinking it concentrates authority. It tells Google that the German page is a duplicate of the English one, which contradicts the same-language rule above. Google's localization documentation adds that localized pages are only considered duplicates if the main content remains untranslated. If only navigation and footer are translated, you have a duplicate problem that hreflang does not solve. If the main content is translated, the page deserves its own canonical.
What about AI search and language versions?
Here the honest answer is: very little is documented. Google's AI Overviews and AI Mode are built on Google Search, so its indexing and canonicalization rules apply there. OpenAI, Anthropic and Perplexity have published nothing about whether their systems read hreflang or canonical tags, or how they choose between language versions of a page. Anyone who claims hreflang "fixes AI citations" is going beyond the evidence.
What you can observe is the practical symptom: an assistant answers an English question and cites your German URL, or links a parameter variant instead of the clean page. That can have many causes (which version is indexed, which one has more links, which one the assistant's search backend returned), and clean tags remove at least the causes you control. If your site also relies on JavaScript for content or tags, check that crawlers can reach it at all; the AI crawler check shows which bots your robots.txt lets in.
Audit checklist: hreflang and canonical in 20 minutes
- Read the tags a crawler receives. Use the raw HTML, not the rendered DOM:
Tags injected by JavaScript do not appear here, and not every crawler renders JavaScript.curl -s https://example.com/de/preise | grep -iE 'rel="(canonical|alternate)"' - Check the return links. Every URL named in a cluster must list the same set of versions, including itself.
- Check status and indexability of every alternate. Each hreflang target should return 200, be indexable and carry a self-referencing canonical.
curl -s -o /dev/null -w "%{http_code} %{url_effective}\n" -L https://example.com/de/preise - Compare declared and selected canonical. The URL Inspection tool in Search Console shows the user-declared canonical next to the Google-selected one. If they differ for a translated page, look for the conflicts described above.
- Validate codes. Language first, region second, no region-only codes, and one
x-defaultif you have a fallback. - Test in AI assistants. Ask the same question in each of your languages in ChatGPT search, Perplexity and Google AI Mode, and record which of your URLs is cited. Treat the result as an observation, not a verdict: repeat it over several days, because answers vary between runs.
For planning language versions beyond the tags, see Build a multilingual SEO strategy for AI search. If you want the tags, crawler access and AI citations of your site checked together, a GEO audit covers all three and prioritizes the fixes.
Frequently asked questions
What is the difference between hreflang and canonical?
A canonical tag names the preferred URL among duplicate pages in the same language. Hreflang connects the language or regional versions of a page so each user gets the right one. On international sites you use both.
What is hreflang used for?
Hreflang tells Google which pages are localized versions of each other, so it can show the version that matches a searcher's language or region. Each version must list itself and all other versions, and the links must be reciprocal.
Is a canonical tag important for SEO?
Yes, whenever the same content is reachable under several URLs. Google treats rel=canonical as a strong signal for which URL to index, although it can still choose a different canonical if other signals disagree.
Should a translated page have a canonical pointing to the original language?
No. Google advises specifying a canonical in the same language when you use hreflang. Each translated page should carry a self-referencing canonical and be linked to the other versions via hreflang.
Can hreflang and canonical conflict?
Yes. If an hreflang annotation points to a URL that redirects, is noindexed or canonicalizes elsewhere, the signals contradict each other. Hreflang should only point to indexable, self-canonical URLs.
Do ChatGPT or Perplexity read hreflang tags?
Neither OpenAI nor Perplexity has documented whether their systems use hreflang or canonical tags. Google AI Overviews and AI Mode build on Google Search, where both tags are documented signals.
How do you say hreflang?
It is usually pronounced as "h-ref-lang", short for hypertext reference language, the name of the HTML attribute.
Ready for better AI visibility?
Test now for free how well your website is optimized for AI search engines.
Start Free AnalysisRelated GEO Topics
Share Article
About the Author
- Structured data for AI crawlers
- Include clear facts & statistics
- Formulate quotable snippets
- Integrate FAQ sections
- Demonstrate expertise & authority


