// 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.

By Muhammad Younus Updated

A frosted glass globe with amber route lines arcing to glass page tiles orbiting around it
the short answer
$ hreflang canonical ✓ Every language version should have a canonical tag pointing at itself, and hreflang tags listing every version, itself included.✓ A canonical from a translation to the English page tells Google the translation is a duplicate, so it isn't indexed and its hreflang can't work.✓ Keep the two tags separate, and point hreflang only at canonical URLs that return 200 and are indexable.
// 01 - the difference

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.

// 02 - side by side

Canonical vs hreflang: how do they compare?

Canonical vs hreflang: how do they compare?
WhatCanonical tagHreflang tag
PurposePick one URL to index among duplicatesShow the right language or region version
Points toThe preferred URL, usually the page itselfEvery language version, the page itself included
ScopePages with the same contentEquivalent pages in different languages or regions
Where it goesHead or HTTP header; a sitemap listing is a weaker signalHead, HTTP header or XML sitemap
How Google treats itA strong hint it can overruleA signal about which URL to show, not a ranking factor
Pointed the wrong wayThe page drops out of the indexThe wrong version shows in the wrong country
// 03 - the markup

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/" />
// 04 - the rules

How do you use hreflang and canonical tags together?

  1. 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.

  2. 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.

  3. iii.

    Only canonical URLs in the hreflang set

    No redirects, no noindexed pages, no parameter or paginated duplicates of the real page.

  4. iv.

    Add x-default for everyone else

    Usually the language selector or the main version, for searchers no other tag matches.

  5. 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.

  6. vi.

    Check Google's choice

    URL Inspection shows the user-declared canonical next to the Google-selected one for each version.

// 05 - the classic mistake

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.

// 06 - common mistakes

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."

What are the most common hreflang canonical mistakes?
MistakeWhat happensFix
One merged canonical tag carrying a hreflang attributeGoogle ignores it for canonicalization, so the page has no usable canonicalTwo separate tags: one rel="canonical", one rel="alternate" per version
Every translation canonicalised to the main versionThe translations are treated as duplicates and drop out of the indexA self-referencing canonical on each version
Hreflang pointing at a URL that canonicalises elsewhereGoogle gets two signals naming different URLs for the same versionPoint hreflang at the exact canonical URL
Hreflang pointing at redirects or noindexed pagesThose alternates can't be shown, so the pair breaksOnly final, indexable URLs that return 200
Canonical to the global page on a regional copyThe regional page is folded into the global oneSelf-canonical, plus real regional differences
// 07 - regional pages

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.

i.

Google may fold them together

Near-duplicate regional pages can end up with one Google-selected canonical, even with self-referencing tags.

ii.

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.

iii.

Real differences help most

Local prices, currency, spelling, delivery details and contact numbers give each regional page a reason to exist.

// 08 - search console

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.

Which Search Console statuses point to a hreflang canonical conflict?
Status on a translated URLWhat it usually meansFix
Alternate page with proper canonical tagIts canonical points at another languageA self-referencing canonical
Duplicate, Google chose different canonical than userRegional versions are too similarLocalise the content, keep hreflang complete
Duplicate without user-selected canonicalNo canonical tag on the translationAdd one pointing at itself
Page with redirectHreflang points at an old URLUpdate the hreflang set to the final URL
// 09 - checking

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

// 10 - wordpress

How do WPML, Polylang and TranslatePress handle canonicals?

i.

WPML

Each translation is its own post, and copied SEO meta can carry a custom canonical pointing at the original.

ii.

Polylang

Prints hreflang for linked translations and leaves canonicals to the SEO plugin, so the two need checking together.

iii.

TranslatePress

Serves translations from language folders; canonical and hreflang output depends on its SEO settings and your SEO plugin.

// 11 - diy or help

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 multilingual
// questions

What 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.

// sources

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.

// from the blog

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.

Muhammad Younus with a friendly open smile, head tilted slightly
// next step

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