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 versionx-default- Default/fallback version
Impact on Your Business
- 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
- Log into Google Search Console
- Navigate to "Settings" → "International Targeting"
- Check for hreflang errors:
- "No return tags"
- "Incorrect hreflang values"
- "Multiple pages for same language"
- Review "Coverage" report for indexing issues
- 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:
Ahrefs Hreflang Tags Testing Tool:
- Visit Ahrefs Hreflang Checker
- Enter your URL
- Check for errors and warnings
Merkle Hreflang Tag Testing Tool:
- Visit Merkle Tool
- Enter URL
- Review hreflang implementation
Screaming Frog Hreflang Validation:
- Crawl site with Screaming Frog
- Navigate to "Hreflang" tab
- Review errors and warnings
What to Look For:
Method 3: Manual Page Source Check
- Visit a page with hreflang tags
- Right-click → "View Page Source"
- 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
- Use VPN or Google Search with country parameter
- Search for your brand/keywords
- 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:
- Review your sitemap XML
- Check for xhtml:link elements
- 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>:
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>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 ^^^ -->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:
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/">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/">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 = RussianCommon 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:
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/">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 -->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/">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/">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:
Hreflang validation tools:
- Test with Ahrefs Hreflang Checker
- Use Merkle Technical SEO Tool
- Validate with Screaming Frog
- Check for errors and warnings
-
- Wait 2-4 weeks for crawling
- Check "International Targeting"
- Verify errors resolved
- Monitor coverage reports
Manual testing:
- View page source
- Confirm tags present
- Verify all versions listed
- Check bidirectional links
International search testing:
- Use VPN to test different countries
- Search for your pages
- Verify correct version appears
- Check SERP snippets
Analytics monitoring:
- Track international traffic
- Monitor bounce rates by country
- Check language engagement
- Review conversion by region
Common Mistakes
- Missing return tags - Not bidirectional
- No self-referential tag - Page doesn't reference itself
- Using relative URLs - Must be absolute
- Wrong country code - Using 'uk' instead of 'gb'
- Mixing with canonical incorrectly - Conflicting signals
- Only on homepage - Need on all equivalent pages
- Using for different content - Only for translations/regional equivalents
- Missing x-default - No fallback specified
- Using wrong language codes - Not following ISO standards
- 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