Skip to main content

Hreflang vs Canonical: How They Work Together in International SEO

Understand the relationship between hreflang and canonical tags. Learn when they conflict, how to use self-referencing canonicals, and avoid cross-locale canonical mistakes.

Hreflang Generator Team

What Is a Canonical Tag?

Before examining how hreflang and canonical interact, it is worth establishing what each one does independently.

A canonical tag (<link rel="canonical">) tells search engines which URL is the preferred version of a page for indexing purposes. When multiple URLs serve identical or very similar content, the canonical tag consolidates ranking signals onto a single URL, preventing duplicate content dilution.

<link rel="canonical" href="https://example.com/en/products/widget/" />

For example, if your product page is accessible at both https://example.com/en/products/widget/ and https://example.com/en/products/widget/?ref=newsletter, the canonical tag on both URLs should point to the clean version without the query parameter. This tells Google: "Treat these as the same page and consolidate their ranking power."

Canonical tags are a strong signal that Google generally respects (though not a directive -- Google may override your canonical if it detects inconsistencies).

What Is Hreflang?

Hreflang (<link rel="alternate" hreflang="...">) tells search engines that a page has equivalent versions in other languages or regions. It does not control indexing -- it controls which version appears in search results based on the user's language and location.

<link rel="alternate" hreflang="en" href="https://example.com/en/products/widget/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/produkte/widget/" />
<link rel="alternate" hreflang="es" href="https://example.com/es/productos/widget/" />

Hreflang says: "These three pages are the same content for different audiences." It does not say anything about which URL should be indexed.

How Hreflang and Canonical Work Together

This is where most confusion arises. Hreflang and canonical serve complementary but different purposes:

| Signal | Purpose | Scope | |--------|---------|-------| | Canonical | "This is the preferred URL for indexing" | Within a single locale | | Hreflang | "These are the language/region variants" | Across locales |

The critical rule is: each locale version must have a self-referencing canonical that points to itself. The English page's canonical points to the English URL. The German page's canonical points to the German URL. The Spanish page's canonical points to the Spanish URL.

Here is the correct implementation for a page available in three languages:

English page at https://example.com/en/products/widget/:

<link rel="canonical" href="https://example.com/en/products/widget/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/products/widget/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/produkte/widget/" />
<link rel="alternate" hreflang="es" href="https://example.com/es/productos/widget/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/products/widget/" />

German page at https://example.com/de/produkte/widget/:

<link rel="canonical" href="https://example.com/de/produkte/widget/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/products/widget/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/produkte/widget/" />
<link rel="alternate" hreflang="es" href="https://example.com/es/productos/widget/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/products/widget/" />

Spanish page at https://example.com/es/productos/widget/:

<link rel="canonical" href="https://example.com/es/productos/widget/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/products/widget/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/produkte/widget/" />
<link rel="alternate" hreflang="es" href="https://example.com/es/productos/widget/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/products/widget/" />

Notice the pattern: the canonical is always self-referencing, while the hreflang set is identical across all three pages (ensuring full reciprocity).

When Hreflang and Canonical Conflict

Conflicts occur when the canonical tag on a page points to a URL in a different locale. This is the single most damaging mistake in international SEO tag implementation.

The Cross-Locale Canonical Mistake

Consider this broken implementation:

German page at https://example.com/de/produkte/widget/:

<!-- WRONG: canonical points to the English version -->
<link rel="canonical" href="https://example.com/en/products/widget/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/produkte/widget/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/products/widget/" />

This tells Google: "The German page is a duplicate of the English page. Please index the English URL instead." Google will then de-index the German page and show the English URL to German users. The hreflang is ignored because the canonical has effectively declared the German page non-existent from an indexing perspective.

This mistake is surprisingly common and often comes from:

How Google Handles the Conflict

When Google encounters a cross-locale canonical with hreflang:

  1. The canonical signal wins because it is a stronger signal than hreflang
  2. Google consolidates indexing to the canonical URL (the English page)
  3. The German page effectively disappears from Google's index
  4. German users searching in German see the English page in results (or no result at all if the English page does not rank for German queries)
  5. All ranking equity from backlinks to the German page flows to the English page, which cannot rank in German search results anyway

The result: you lose your German search presence entirely.

Correct Usage Patterns

Pattern 1: Self-Referencing Canonical Per Locale

Every locale page has a canonical that points to itself. This is the correct pattern for the vast majority of international sites.

/en/page/ -> canonical: /en/page/
/de/page/ -> canonical: /de/page/
/es/page/ -> canonical: /es/page/

All three pages share the same full hreflang set. Each page is independently indexed and ranks in its respective market.

Pattern 2: Parameterized URLs with Different Canonical

If your site uses query parameters for language selection (e.g., ?lang=de), each language version should still canonical to a clean URL -- but a clean URL in its own language.

/page/?lang=en -> canonical: /page/?lang=en (or /en/page/ if you have clean URLs)
/page/?lang=de -> canonical: /page/?lang=de (or /de/page/ if you have clean URLs)

Never canonical all language parameters to the base URL without the parameter. That collapses all languages into one indexed URL.

Pattern 3: Pages That Genuinely Are Duplicates Within a Locale

Sometimes you have true duplicates within the same locale -- for example, a product page accessible from two different category paths. In this case, canonical correctly points to one URL, and hreflang on that canonical URL points to its counterparts in other languages.

/en/category-a/widget/ -> canonical: /en/products/widget/
/en/category-b/widget/ -> canonical: /en/products/widget/
/en/products/widget/   -> canonical: /en/products/widget/ (self-referencing)
                          hreflang: /en/products/widget/, /de/produkte/widget/, /es/productos/widget/

The hreflang only needs to exist on the canonical URL. The duplicate pages within the same locale do not need hreflang because Google will consolidate them to the canonical URL anyway.

Diagnosing Conflicts

If you suspect hreflang-canonical conflicts on your site, check for these symptoms:

To audit your site:

  1. Crawl your site with a tool that extracts both canonical and hreflang tags
  2. For each page, verify that rel="canonical" points to the same domain and locale path as the page itself
  3. Verify that every URL in every hreflang set also has a self-referencing canonical
  4. Check that no canonical tag points to a URL in a different language directory

The Bottom Line

Hreflang and canonical are not in competition. They solve different problems and should always agree with each other. The rule is simple:

When these two signals align, search engines can confidently index each locale version independently and show the right version to the right audience. When they conflict, the canonical wins and hreflang is ignored, which typically destroys your international search visibility.

Use our Hreflang Tag Generator to build tag sets that follow these correct patterns automatically. The generator ensures self-referencing canonicals and full reciprocity across all locales in the set.

Related tools