Hreflang Issues | Blue Frog Docs

Hreflang Issues

Diagnose and fix international SEO and hreflang tag implementation issues that cause wrong language or regional pages to appear in search results

Hreflang Issues

What This Means

Hreflang is an HTML attribute that tells search engines which language and regional version of a page to show users based on their location and language preferences. When implemented incorrectly or not at all, users see the wrong language version in search results, leading to poor user experience, high bounce rates, and lost international traffic.

What Hreflang Does

Language and Regional Targeting:

  • Tells Google which language a page is in
  • Specifies regional variations (en-US vs en-GB)
  • Prevents duplicate content issues between versions
  • Helps serve correct version to users

Common Use Cases:

  • Multiple language versions of same content
  • Regional variations (US vs UK English)
  • Country-specific content with same language
  • E-commerce sites with regional pricing
  • Multinational businesses with localized sites

Hreflang Format

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

Components:

  • hreflang="en-us" - Language code (ISO 639-1) + optional country code (ISO 3166-1)
  • href - Full URL of alternate version
  • x-default - Default/fallback version

Impact on Your Business

Search Visibility:

  • Users see wrong language in search results
  • High bounce rates when language doesn't match
  • Google may not index all language versions
  • Duplicate content issues between regions

User Experience:

  • Spanish speakers see English pages
  • UK users see US pricing in dollars
  • German users land on French pages
  • Frustration leads to site abandonment

International Traffic:

  • Lost opportunities in target markets
  • Reduced conversions from international users
  • Wasted translation and localization investment
  • Competitors capture your international audience

Technical Issues:

  • Conflicting signals confuse search engines
  • Pages compete against each other
  • Incorrect canonical tags
  • Regional pages not indexed

How to Diagnose

Method 1: Google Search Console

  1. Log into Google Search Console
  2. Navigate to "Settings" → "International Targeting"
  3. Check for hreflang errors:
    • "No return tags"
    • "Incorrect hreflang values"
    • "Multiple pages for same language"
  4. Review "Coverage" report for indexing issues
  5. Check each language version separately (if using separate properties)

What to Look For:

  • Hreflang errors in International Targeting
  • Return tag errors (page A links to B, but B doesn't link to A)
  • Incorrect language codes
  • Missing x-default

Method 2: Hreflang Checker Tools

Use specialized validation tools:

  1. Ahrefs Hreflang Tags Testing Tool:

  2. Merkle Hreflang Tag Testing Tool:

    • Visit Merkle Tool
    • Enter URL
    • Review hreflang implementation
  3. Screaming Frog Hreflang Validation:

    • Crawl site with Screaming Frog
    • Navigate to "Hreflang" tab
    • Review errors and warnings

What to Look For:

  • Missing return tags
  • Incorrect language codes
  • Self-referencing errors
  • URL mismatches (HTTP vs HTTPS)

Method 3: Manual Page Source Check

  1. Visit a page with hreflang tags
  2. Right-click → "View Page Source"
  3. Look in <head> section for:
    <link rel="alternate" hreflang="..." href="...">
    

What to Look For:

  • Hreflang tags present
  • All language versions listed
  • Self-referential tag included
  • Correct URLs (absolute, not relative)
  • Valid language codes
  • x-default specified

Method 4: International Search Testing

  1. Use VPN or Google Search with country parameter
  2. Search for your brand/keywords
  3. Check which version appears:
    google.com → Should show en-US version
    google.co.uk → Should show en-GB version
    google.fr → Should show fr version
    google.de → Should show de version
    

What to Look For:

  • Wrong language version appearing
  • Duplicate pages from different regions
  • Missing regional versions
  • Incorrect meta descriptions showing

Method 5: Sitemap Validation

If using XML sitemap method:

  1. Review your sitemap XML
  2. Check for xhtml:link elements
  3. Validate structure:
    <url>
      <loc>https://example.com/en-us/page/</loc>
      <xhtml:link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/page/"/>
      <xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/page/"/>
    </url>
    

What to Look For:

  • All versions cross-referenced
  • Correct xmlns declaration
  • Matching URLs
  • Complete reciprocal links

General Fixes

Fix 1: Implement Hreflang Tags Correctly

Add hreflang in HTML <head>:

  1. Basic implementation:

    <head>
      <!-- On https://example.com/en-us/page/ -->
      <link rel="alternate" hreflang="en-us" href="https://example.com/en-us/page/">
      <link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/page/">
      <link rel="alternate" hreflang="fr" href="https://example.com/fr/page/">
      <link rel="alternate" hreflang="de" href="https://example.com/de/page/">
      <link rel="alternate" hreflang="x-default" href="https://example.com/en-us/page/">
    </head>
    
  2. Self-referential requirement:

    <!-- IMPORTANT: Page must reference itself -->
    <!-- On en-US version: -->
    <link rel="alternate" hreflang="en-us" href="https://example.com/en-us/page/">
    <!-- Self-reference ^^^ -->
    
    <!-- On en-GB version: -->
    <link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/page/">
    <!-- Self-reference ^^^ -->
    
  3. Bidirectional linking:

    <!-- On Page A (en-US), must link to Page B (en-GB) -->
    <link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/page/">
    
    <!-- On Page B (en-GB), must link back to Page A (en-US) -->
    <link rel="alternate" hreflang="en-us" href="https://example.com/en-us/page/">
    

Fix 2: Use Correct Language and Country Codes

Follow ISO standards:

  1. Language-only codes (ISO 639-1):

    <!-- Just language, no country -->
    <link rel="alternate" hreflang="en" href="https://example.com/en/">
    <link rel="alternate" hreflang="es" href="https://example.com/es/">
    <link rel="alternate" hreflang="fr" href="https://example.com/fr/">
    <link rel="alternate" hreflang="de" href="https://example.com/de/">
    
  2. Language + country codes (ISO 639-1 + ISO 3166-1):

    <!-- Language-country combinations -->
    <link rel="alternate" hreflang="en-us" href="https://example.com/us/">
    <link rel="alternate" hreflang="en-gb" href="https://example.com/uk/">
    <link rel="alternate" hreflang="en-ca" href="https://example.com/ca/">
    <link rel="alternate" hreflang="en-au" href="https://example.com/au/">
    <link rel="alternate" hreflang="es-es" href="https://example.com/es/">
    <link rel="alternate" hreflang="es-mx" href="https://example.com/mx/">
    
  3. Common language codes:

    en = English
    es = Spanish
    fr = French
    de = German
    it = Italian
    pt = Portuguese
    nl = Dutch
    ja = Japanese
    zh = Chinese
    ko = Korean
    ar = Arabic
    ru = Russian
    
  4. Common country codes:

    us = United States
    gb = United Kingdom (not 'uk')
    ca = Canada
    au = Australia
    de = Germany
    fr = France
    es = Spain
    mx = Mexico
    br = Brazil
    jp = Japan
    cn = China
    

Fix 3: Implement x-default for Fallback

Add default version for unmatched languages:

<!-- x-default shows when no language/region match -->
<link rel="alternate" hreflang="en-us" href="https://example.com/en-us/">
<link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/">
<link rel="alternate" hreflang="es" href="https://example.com/es/">
<link rel="alternate" hreflang="x-default" href="https://example.com/">

<!-- x-default typically points to:
     - Homepage with language selector
     - Most common language version
     - International/global version
-->

When to use x-default:

  • User's language not available
  • No regional match
  • Showing language selection page
  • Fallback for crawler

Fix 4: Use Absolute URLs

Always use full URLs, not relative:

<!-- Bad - relative URLs -->
<link rel="alternate" hreflang="en-us" href="/en-us/page/">
<link rel="alternate" hreflang="en-gb" href="/en-gb/page/">

<!-- Good - absolute URLs -->
<link rel="alternate" hreflang="en-us" href="https://example.com/en-us/page/">
<link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/page/">

<!-- Good - different domains -->
<link rel="alternate" hreflang="en-us" href="https://example.com/">
<link rel="alternate" hreflang="en-gb" href="https://example.co.uk/">
<link rel="alternate" hreflang="de" href="https://example.de/">

Fix 5: Implement via HTTP Headers (Alternative Method)

For non-HTML content (PDFs, etc.):

HTTP/1.1 200 OK
Content-Type: application/pdf
Link: <https://example.com/en-us/document.pdf>; rel="alternate"; hreflang="en-us",
      <https://example.com/en-gb/document.pdf>; rel="alternate"; hreflang="en-gb",
      <https://example.com/de/document.pdf>; rel="alternate"; hreflang="de",
      <https://example.com/document.pdf>; rel="alternate"; hreflang="x-default"

Server configuration:

# Nginx
location /document.pdf {
    add_header Link '<https://example.com/en-us/document.pdf>; rel="alternate"; hreflang="en-us"';
    add_header Link '<https://example.com/en-gb/document.pdf>; rel="alternate"; hreflang="en-gb"';
}

Fix 6: Implement via XML Sitemap (Alternative Method)

For sites with many pages:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">

  <!-- English US version -->
  <url>
    <loc>https://example.com/en-us/page/</loc>
    <xhtml:link rel="alternate" hreflang="en-us" href="https://example.com/en-us/page/"/>
    <xhtml:link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/page/"/>
    <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/page/"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en-us/page/"/>
  </url>

  <!-- English GB version -->
  <url>
    <loc>https://example.com/en-gb/page/</loc>
    <xhtml:link rel="alternate" hreflang="en-us" href="https://example.com/en-us/page/"/>
    <xhtml:link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/page/"/>
    <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/page/"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en-us/page/"/>
  </url>

  <!-- German version -->
  <url>
    <loc>https://example.com/de/page/</loc>
    <xhtml:link rel="alternate" hreflang="en-us" href="https://example.com/en-us/page/"/>
    <xhtml:link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/page/"/>
    <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/page/"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en-us/page/"/>
  </url>

</urlset>

Important notes:

  • All versions must list all versions
  • Include xmlns:xhtml declaration
  • Must be bidirectional
  • Same rules as HTML implementation

Fix 7: Fix Common Hreflang Errors

Resolve typical implementation mistakes:

  1. Missing return tags:

    <!-- Page A links to Page B -->
    <!-- On example.com/en-us/ -->
    <link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/">
    
    <!-- Page B MUST link back to Page A -->
    <!-- On example.com/en-gb/ -->
    <link rel="alternate" hreflang="en-us" href="https://example.com/en-us/">
    
  2. Missing self-referential tag:

    <!-- Page must reference itself -->
    <!-- On example.com/en-us/ -->
    <link rel="alternate" hreflang="en-us" href="https://example.com/en-us/">
    <!-- This self-reference is REQUIRED -->
    
  3. URL mismatch (HTTP vs HTTPS):

    <!-- Bad - mixed protocols -->
    <link rel="alternate" hreflang="en-us" href="http://example.com/en-us/">
    <link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/">
    
    <!-- Good - consistent HTTPS -->
    <link rel="alternate" hreflang="en-us" href="https://example.com/en-us/">
    <link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/">
    
  4. Wrong canonical tag:

    <!-- Bad - canonical conflicts with hreflang -->
    <!-- On en-GB page -->
    <link rel="canonical" href="https://example.com/en-us/">
    <link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/">
    
    <!-- Good - canonical matches self-referencing hreflang -->
    <link rel="canonical" href="https://example.com/en-gb/">
    <link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/">
    
  5. Invalid language codes:

    <!-- Bad - invalid codes -->
    <link rel="alternate" hreflang="en" href="https://example.com/english/">
    <link rel="alternate" hreflang="uk" href="https://example.com/ukraine/">
    
    <!-- Good - valid ISO codes -->
    <link rel="alternate" hreflang="en" href="https://example.com/en/">
    <link rel="alternate" hreflang="en-gb" href="https://example.com/uk/">
    <!-- Note: 'gb' for Great Britain, 'uk' is for Ukraine -->
    

Fix 8: Coordinate with Canonical Tags

Ensure canonical and hreflang work together:

<!-- Each language version should be canonical to itself -->

<!-- On en-US page -->
<link rel="canonical" href="https://example.com/en-us/page/">
<link rel="alternate" hreflang="en-us" href="https://example.com/en-us/page/">
<link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/page/">

<!-- On en-GB page -->
<link rel="canonical" href="https://example.com/en-gb/page/">
<link rel="alternate" hreflang="en-us" href="https://example.com/en-us/page/">
<link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/page/">

Never:

  • Point all language versions to one canonical
  • Conflict hreflang with canonical
  • Use canonical to consolidate languages

Platform-Specific Guides

Detailed implementation instructions for your specific platform:

Platform Troubleshooting Guide
Shopify Shopify Hreflang Guide
WordPress WordPress Hreflang Guide
Wix Wix Hreflang Guide
Squarespace Squarespace Hreflang Guide
Webflow Webflow Hreflang Guide

Verification

After implementing hreflang:

  1. Hreflang validation tools:

    • Test with Ahrefs Hreflang Checker
    • Use Merkle Technical SEO Tool
    • Validate with Screaming Frog
    • Check for errors and warnings
  2. Google Search Console:

    • Wait 2-4 weeks for crawling
    • Check "International Targeting"
    • Verify errors resolved
    • Monitor coverage reports
  3. Manual testing:

    • View page source
    • Confirm tags present
    • Verify all versions listed
    • Check bidirectional links
  4. International search testing:

    • Use VPN to test different countries
    • Search for your pages
    • Verify correct version appears
    • Check SERP snippets
  5. Analytics monitoring:

    • Track international traffic
    • Monitor bounce rates by country
    • Check language engagement
    • Review conversion by region

Common Mistakes

  1. Missing return tags - Not bidirectional
  2. No self-referential tag - Page doesn't reference itself
  3. Using relative URLs - Must be absolute
  4. Wrong country code - Using 'uk' instead of 'gb'
  5. Mixing with canonical incorrectly - Conflicting signals
  6. Only on homepage - Need on all equivalent pages
  7. Using for different content - Only for translations/regional equivalents
  8. Missing x-default - No fallback specified
  9. Using wrong language codes - Not following ISO standards
  10. Forgetting to update - New languages not added

Hreflang Implementation Checklist

Setup:

  • Identified all language/region versions
  • Chosen implementation method (HTML, Sitemap, HTTP)
  • Verified all pages have equivalents
  • Decided on x-default version

Technical Implementation:

  • All versions reference all other versions
  • Self-referential tags included
  • Bidirectional linking implemented
  • Absolute URLs used
  • Valid language codes (ISO 639-1)
  • Valid country codes (ISO 3166-1)
  • x-default specified

Coordination:

  • Canonical tags not conflicting
  • Each version canonical to itself
  • No duplicate content issues
  • Consistent URL structure
  • HTTPS used consistently

Validation:

  • Tested with hreflang checkers
  • No errors in Search Console
  • Manual source code verification
  • International search tested
  • Analytics tracking setup

Additional Resources

// SYS.FOOTER