// guides / hreflang and multilingual
Hreflang canonical tags: how to use them together without one cancelling the other
Every hreflang canonical question comes down to two different jobs. Hreflang tells Google which language version to show. The canonical tag tells it which address to index. Used together correctly they're simple; pointed the wrong way, one quietly cancels the other.
What is the difference between hreflang and canonical tags?
A canonical tag, rel="canonical", says which URL is the main one when several URLs show the same content, so Google indexes that one and folds the rest into it. In HTML it's a link element in the page head, and Google's documentation calls the canonical URL the one it picks as the most representative from a set of duplicates. Getting that one address right on every template is what canonical URL clean-up on WordPress is about.
A hreflang tag, rel="alternate" with a hreflang value, says that another URL is the same page in a different language or for a different region, so Google Search can point each searcher to the most appropriate version. Canonical consolidates; hreflang swaps. They don't compete, as long as each translation is its own canonical page and the hreflang set connects them. Google says localized versions are only considered duplicates if the main content remains untranslated, so a real translation should never canonicalise to the original.
Canonical vs hreflang: how do they compare?
| What | Canonical tag | Hreflang tag |
|---|---|---|
| Purpose | Pick one URL to index among duplicates | Show the right language or region version |
| Points to | The preferred URL, usually the page itself | Every language version, the page itself included |
| Scope | Pages with the same content | Equivalent pages in different languages or regions |
| Where it goes | Head or HTTP header; a sitemap listing is a weaker signal | Head, HTTP header or XML sitemap |
| How Google treats it | A strong hint it can overrule | A signal about which URL to show, not a ranking factor |
| Pointed the wrong way | The page drops out of the index | The wrong version shows in the wrong country |
What do hreflang and canonical tags look like on one page?
The Spanish version of a page, done right, then two ways it goes wrong that the markup alone won't warn you about. The English page carries the same hreflang set with its own canonical. For PDFs and other files that have no HTML head, both can go in an HTTP Link header instead, and Google's documentation covers that case for each tag.
<!-- In the <head> of https://example.com/es/tours/ -->
<link rel="canonical" href="https://example.com/es/tours/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/tours/" />
<link rel="alternate" hreflang="es" href="https://example.com/es/tours/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/tours/" />
<!-- Wrong: this canonical tells Google the Spanish page is a duplicate -->
<link rel="canonical" href="https://example.com/en/tours/" />
<!-- Wrong: one merged tag; Google doesn't use it for canonicalization -->
<link rel="canonical" hreflang="es" href="https://example.com/es/tours/" /> How do you use hreflang and canonical tags together?
- i.
Self-referencing canonical on every version
The Spanish page's canonical points at the Spanish page, the English page's at the English page.
- ii.
List every version in hreflang, itself included
Google's rule is that each language version must list itself as well as all other versions, with fully qualified URLs.
- iii.
Only canonical URLs in the hreflang set
No redirects, no noindexed pages, no parameter or paginated duplicates of the real page.
- iv.
Add x-default for everyone else
Usually the language selector or the main version, for searchers no other tag matches.
- v.
Keep the sitemap in step
If hreflang also lives in the XML sitemap, it must list exactly the same URLs as the head tags; the hreflang sitemap example shows the entry format.
- vi.
Check Google's choice
URL Inspection shows the user-declared canonical next to the Google-selected one for each version.
Why does a hreflang canonical conflict hide a translation?
Because a canonical from the Spanish page to the English page tells Google the translation is a duplicate. Google then indexes only the English URL, and a page that isn't indexed can't be swapped in for Spanish searchers, whatever its hreflang says. In Search Console the translations show up as Alternate page with proper canonical tag, which reads like good news and isn't.
It usually comes from a plugin copying the original post's SEO fields, custom canonical included, into each translation. Clearing that field so each translation canonicalises to itself is often the whole fix. In Yoast it's the Canonical URL field under Advanced in the post's Yoast SEO sidebar; in Rank Math it's the Canonical URL setting in the Advanced tab. Yoast says it adds canonical URLs itself, so on a translation that field should normally be empty.
What are the most common hreflang canonical mistakes?
Google's canonical documentation is blunt about the first one: "rel="canonical" annotations with hreflang, lang, media, and type attributes are not used for canonicalization."
| Mistake | What happens | Fix |
|---|---|---|
| One merged canonical tag carrying a hreflang attribute | Google ignores it for canonicalization, so the page has no usable canonical | Two separate tags: one rel="canonical", one rel="alternate" per version |
| Every translation canonicalised to the main version | The translations are treated as duplicates and drop out of the index | A self-referencing canonical on each version |
| Hreflang pointing at a URL that canonicalises elsewhere | Google gets two signals naming different URLs for the same version | Point hreflang at the exact canonical URL |
| Hreflang pointing at redirects or noindexed pages | Those alternates can't be shown, so the pair breaks | Only final, indexable URLs that return 200 |
| Canonical to the global page on a regional copy | The regional page is folded into the global one | Self-canonical, plus real regional differences |
What goes wrong with same-language regional pages?
English for the US and English for the UK can be near-identical, and that's where hreflang and canonical signals meet.
Google may fold them together
Near-duplicate regional pages can end up with one Google-selected canonical, even with self-referencing tags.
Hreflang still helps
Google's canonical documentation says it prefers URLs that are part of hreflang clusters, so a complete set keeps the regional URL in play.
Real differences help most
Local prices, currency, spelling, delivery details and contact numbers give each regional page a reason to exist.
Which Search Console statuses point to a hreflang canonical conflict?
The Page indexing report has no hreflang section, and Google retired the International Targeting report in 2022, so these statuses on translated URLs are where the conflict shows. Two of them have their own guides: Duplicate, Google chose different canonical than user, where Google overruled your tag, and duplicates with no canonical declared, where there was no tag to overrule.
| Status on a translated URL | What it usually means | Fix |
|---|---|---|
| Alternate page with proper canonical tag | Its canonical points at another language | A self-referencing canonical |
| Duplicate, Google chose different canonical than user | Regional versions are too similar | Localise the content, keep hreflang complete |
| Duplicate without user-selected canonical | No canonical tag on the translation | Add one pointing at itself |
| Page with redirect | Hreflang points at an old URL | Update the hreflang set to the final URL |
How do you check hreflang and canonical tags, from one URL to the whole site?
Hreflang faults are almost always patterns: a template, a plugin setting or a copied field that's wrong everywhere at once. Check one URL to see the fault, then the whole site to see how far it goes.
- i.
Check if one URL is canonical
View the page source and find the rel="canonical" link in the head, then open URL Inspection: the Google-selected canonical in the indexed data shows whether Google agreed. The live test can't predict that choice.
- ii.
Compare two translations
View source on the English and Spanish versions side by side. Each canonical should name its own URL, and both hreflang sets should match.
- iii.
Crawl the whole set
A crawler that reads hreflang and canonicals together, such as the setup in crawling a WordPress site with Screaming Frog, flags hreflang pointing at non-canonical URLs, missing return links and canonicals that point at another language, and shows whether it's ten pages or ten thousand.
- iv.
Check what Google did with it
Filter the Performance report to one country and one language folder. If Spanish searchers still land on English URLs, the tags aren't working, whatever the crawl says. That's the number I'd watch after any fix.
How do WPML, Polylang and TranslatePress handle canonicals?
WPML
Each translation is its own post, and copied SEO meta can carry a custom canonical pointing at the original.
Polylang
Prints hreflang for linked translations and leaves canonicals to the SEO plugin, so the two need checking together.
TranslatePress
Serves translations from language folders; canonical and hreflang output depends on its SEO settings and your SEO plugin.
What can you check yourself, and when do you need help?
Site-wide hreflang audits and plugin-level fixes are what multilingual SEO services cover, and canonical faults outside translations are duplicate content work.
Quick self-checks
- View source on two translations and compare canonicals
- URL Inspection on a translated page
- Filter the Page indexing report to one language folder
Worth handing over
- Hundreds of translations canonicalised to one language
- Regional pages Google keeps folding together
- Head tags and sitemap listing different sets
Rather have it fixed for you? See the Hreflang and multilingual service.
Hreflang and multilingualWhat else do people ask about hreflang and canonical tags?
What is hreflang used for?
Hreflang tells Google that several URLs are the same page in different languages or for different regions, so Google Search can show each searcher the most appropriate version. It doesn't translate anything, and Google says it doesn't use hreflang to detect a page's language. It isn't a ranking factor either.
How can I check if a URL is canonical?
View the page source and find the rel="canonical" link in the head; that's the canonical you declared. Then inspect the URL in Search Console: the Google-selected canonical field, in the indexed data, shows the one Google chose. When the two differ, Google picked another URL as the main one.
Should hreflang pages have self-referencing canonical tags?
Yes. Each language version should name itself as canonical. Pointing a translation's canonical at another language removes it from the index.
Can the canonical tag and hreflang tags point to different URLs?
Yes, and they should. The canonical points at the page itself; the hreflang tags point at the page and each of its translations.
Do I need an x-default hreflang tag?
It isn't required, but Google recommends it. It tells Google which page to show searchers whose language settings match none of your versions, and it works best on a language selector page.
Where do these rules come from?
Google's own documentation, plus what I see on the WordPress sites I work on. Written by Muhammad Younus, a WordPress technical SEO consultant.
- Google: Tell Google about localized versions of your page
- Google: How to specify a canonical URL
- Google: What is canonicalization
- Google: URL Inspection tool
- Yoast: How to change the canonical URL
- Rank Math: Advanced tab, Canonical URL
- Google Search Central blog, December 2022: International Targeting report retired
Two canonical questions often sit next to an hreflang problem, and both have posts: reading Page with redirect in Search Console and choosing www or non-www and sticking to it.

Want this checked on your own site?
Book a call on Upwork, share the URL and read-only Search Console access, and you'll get back what's actually wrong, ranked by the clicks it's costing.
Book a call on Upwork