Skip to main content

Top 10 Common Hreflang Mistakes and How to Fix Them

Avoid the most common hreflang implementation errors. From missing reciprocity to wrong locale codes, learn what breaks hreflang and how to fix each issue.

Hreflang Generator Team

Why Hreflang Mistakes Are So Costly

Hreflang tag errors are particularly damaging because they often fail silently. Unlike a broken link that returns a visible 404, a misconfigured hreflang tag simply gets ignored by search engines without any warning on the page itself. The result: your international SEO strategy looks fine on paper but delivers no benefit in practice. Search engines show the wrong language versions to users, duplicate content dilutes your rankings, and you lose organic traffic in markets you specifically invested in.

The following ten mistakes represent the most common hreflang implementation errors we see across thousands of multilingual websites. Each one includes a clear explanation of what goes wrong, why it matters, and how to fix it.

Mistake 1: Missing Reciprocal Tags

The problem: Page A includes a hreflang tag pointing to Page B, but Page B does not include a hreflang tag pointing back to Page A.

Hreflang requires bidirectional confirmation. If your English page says "my Spanish equivalent is at /es/page/", the Spanish page at /es/page/ must also say "my English equivalent is at /en/page/". This mutual confirmation is how search engines verify that the relationship is intentional and not a mistake or exploitation attempt.

What happens: Google ignores the hreflang entirely for the pair that lacks reciprocity. Even if you have 20 correctly linked locale pages, a single missing return link breaks the chain for that specific pair.

How to fix it: Ensure every page in the hreflang set includes the complete set of alternate links -- including a self-referencing tag. If your English page lists 6 hreflang links, every page in that set must list the same 6 links. Our Hreflang Tag Generator automatically produces reciprocal tags for all pages in a set.

Mistake 2: Missing Self-Referencing Hreflang

The problem: A page includes hreflang tags pointing to all its language variants except itself.

Google's documentation explicitly states that each page must include a hreflang tag pointing to itself. This self-reference is not redundant -- it is part of the validation mechanism search engines use to confirm the hreflang set is complete.

Example of the error:

<!-- On the English page -- missing self-reference -->
<link rel="alternate" hreflang="es" href="https://example.com/es/page/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/page/" />
<!-- Where is hreflang="en" pointing to this page? -->

How to fix it: Always include the current page in its own hreflang set:

<!-- Correct: includes self-reference -->
<link rel="alternate" hreflang="en" href="https://example.com/en/page/" />
<link rel="alternate" hreflang="es" href="https://example.com/es/page/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/page/" />

Mistake 3: Wrong Language or Region Codes

The problem: Using invalid or incorrect ISO language and region codes in hreflang values.

The most common code errors include:

How to fix it: Validate every hreflang value against the ISO 639-1 language code list and ISO 3166-1 Alpha-2 country code list. The format is always {language} or {language}-{REGION}, with the language in lowercase and the region in uppercase, separated by a hyphen.

Mistake 4: HTTP vs HTTPS URL Mismatch

The problem: Your site serves pages over HTTPS, but your hreflang tags reference HTTP URLs (or vice versa).

<!-- Site is on HTTPS, but hreflang uses HTTP -->
<link rel="alternate" hreflang="en" href="http://example.com/en/page/" />

Search engines treat http://example.com/en/page/ and https://example.com/en/page/ as two different URLs. If your page is served at the HTTPS address but the hreflang points to the HTTP address, Google sees a mismatch -- the hreflang points to a URL that either does not exist (if HTTP redirects to HTTPS) or to a different page entirely.

How to fix it: Audit all hreflang URLs to ensure the protocol matches the actual serving protocol. If your site runs on HTTPS (and it should), every URL in every hreflang tag must start with https://. This also applies to canonical tags, sitemap URLs, and any other reference to your pages.

Mistake 5: Using Relative URLs

The problem: Hreflang tags use relative URLs instead of absolute URLs.

<!-- WRONG: relative URL -->
<link rel="alternate" hreflang="es" href="/es/page/" />

<!-- CORRECT: absolute URL -->
<link rel="alternate" hreflang="es" href="https://example.com/es/page/" />

The hreflang specification requires absolute URLs. Relative URLs are silently ignored by search engines. Your hreflang will simply have no effect, and you may not realize it for months because there is no error message.

How to fix it: Always use fully qualified URLs starting with https:// (or http:// if your site genuinely does not support HTTPS). This includes the protocol, domain, and full path. Never use protocol-relative URLs (//example.com/page/) either -- always specify the protocol explicitly.

Mistake 6: Missing x-default

The problem: Your hreflang set does not include an x-default entry.

While technically optional, omitting x-default means search engines have no guidance on what to show users whose language or region is not covered by your hreflang set. If you have English, Spanish, and German versions, what should a Japanese user see?

Without x-default, Google guesses. Sometimes it shows the English version (which might be acceptable), but sometimes it shows nothing from your site because it cannot confidently determine the right match.

How to fix it: Add an x-default hreflang entry to every page set. Point it to the page that provides the best fallback experience -- typically your English version or a page with a language selector.

<link rel="alternate" hreflang="en" href="https://example.com/en/page/" />
<link rel="alternate" hreflang="es" href="https://example.com/es/page/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/page/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page/" />

Mistake 7: Duplicate Locale Codes in the Same Set

The problem: Including multiple hreflang entries with the same language-region code in a single page's tag set.

<!-- WRONG: two entries for "en" -->
<link rel="alternate" hreflang="en" href="https://example.com/en/page-v1/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page-v2/" />

When Google encounters duplicate locale codes, it cannot determine which URL is the correct one for that language. The result is unpredictable -- Google may pick one, alternate between them, or ignore both.

How to fix it: Each language-region code must appear exactly once per hreflang set. If you have two English pages that serve different purposes, they should not be in the same hreflang set. Hreflang connects equivalent content across languages, not different pages within the same language.

Mistake 8: Canonical Tag Pointing to a Different Locale

The problem: The canonical tag on a localized page points to the equivalent page in a different language rather than to itself.

<!-- On the German page -- WRONG -->
<link rel="canonical" href="https://example.com/en/page/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/page/" />

This tells Google: "The German page is a copy of the English page; please index only the English version." Google obeys the canonical, de-indexes the German page, and your hreflang is ignored. You lose your German search presence entirely.

This is such a critical and widespread mistake that we have written a dedicated guide: Hreflang vs Canonical: How They Work Together.

How to fix it: Every locale page must have a self-referencing canonical. The German page's canonical must point to the German URL. The Spanish page's canonical must point to the Spanish URL. Never cross-reference canonicals between locales.

Mistake 9: Wrong XML Sitemap Format for Hreflang

The problem: Implementing hreflang in the XML sitemap but using the wrong markup format.

Common sitemap format errors include:

Correct format:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>https://example.com/en/page/</loc>
    <xhtml:link rel="alternate" hreflang="en"
                href="https://example.com/en/page/" />
    <xhtml:link rel="alternate" hreflang="es"
                href="https://example.com/es/page/" />
    <xhtml:link rel="alternate" hreflang="x-default"
                href="https://example.com/en/page/" />
  </url>
</urlset>

How to fix it: Validate your sitemap XML against the schema before submitting it. Ensure the xhtml namespace is declared, use <xhtml:link> (not <link>), and include the full reciprocal hreflang set inside every <url> block.

Mistake 10: Not Validating After Implementation

The problem: Implementing hreflang tags once and never checking whether they are working correctly.

Hreflang implementations break over time. Pages get moved, URLs change, new languages are added, CMS templates get updated, and developers make changes without realizing the impact on hreflang tags. A hreflang setup that was correct at launch can be completely broken six months later.

Common causes of post-launch breakage include:

How to fix it: Establish a regular validation routine:

  1. Use Google Search Console's International Targeting report to check for hreflang errors flagged by Google
  2. Run periodic crawls with a tool that extracts and cross-references hreflang tags across your entire site
  3. Validate reciprocity -- for every page, confirm that every URL it references also references it back
  4. Check after every deployment -- integrate hreflang validation into your CI/CD pipeline so broken tags are caught before they reach production
  5. Monitor search performance per locale -- a sudden drop in traffic from a specific market often indicates broken hreflang for that locale

Summary

These ten mistakes account for the vast majority of hreflang implementation failures. The good news is that all of them are preventable with careful implementation and regular validation:

  1. Missing reciprocal tags -- every page must link to every other page in the set, and vice versa
  2. Missing self-referencing hreflang -- every page must include itself in its own hreflang set
  3. Wrong locale codes -- use ISO 639-1 language codes and ISO 3166-1 Alpha-2 region codes
  4. HTTP/HTTPS mismatch -- match the protocol to your actual serving protocol
  5. Relative URLs -- always use absolute URLs starting with https://
  6. Missing x-default -- include a fallback for users in unsupported regions
  7. Duplicate locale codes -- each code appears exactly once per set
  8. Cross-locale canonicals -- every locale page canonicals to itself, never to another language
  9. Wrong sitemap format -- use <xhtml:link> with the correct namespace
  10. Not validating -- check regularly, automate where possible

Use our Hreflang Tag Generator to produce tag sets that avoid mistakes 1 through 7 automatically. For ongoing validation, establish a routine that catches issues before they impact your search visibility.

Related tools