Hreflang is a powerful tool for multilingual SEO, but markup errors are common. Google may ignore incorrect hreflang or interpret it incorrectly. This article covers common errors and how to fix them.
Error 1: Missing self-reference
Each page in a hreflang set must link to itself. Many people forget to add a link with the hreflang value for the current language.
Incorrect
<!-- На странице /ru/page — нет ссылки на саму себя -->
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
<link rel="alternate" hreflang="de" href="https://example.com/de/page" />Correct
<link rel="alternate" hreflang="ru" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
<link rel="alternate" hreflang="de" href="https://example.com/de/page" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page" />Why this matters
Google uses the self-reference to verify the set. Without it, the markup may be ignored.
Error 2: Incomplete reciprocal linking
All versions must link to one another. If /ru/page links to /en/page, then /en/page must also link to /ru/page.
Typical scenario
A site has ru, en, and de versions. The Russian page lists all three. The English page lists only en and x-default. The German page lists only de. The set is incomplete.
Solution
Create a single markup template and apply it to all pages in the set. Check each version with the hreflang tool on reChecker.
<!-- Шаблон для КАЖДОЙ страницы в наборе -->
<link rel="alternate" hreflang="ru" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
<link rel="alternate" hreflang="de" href="https://example.com/de/page" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page" />Error 3: Incorrect language and region codes
Using non-standard codes is a common reason for markup to be ignored.
Incorrect codes
| Error | Correct |
|---|---|
| ru-RU | ru (the region is optional for Russian) |
| en-EU | Does not exist (EU is not a region code) |
| zh-CH | zh-CN (China) or zh-TW (Taiwan) |
| pt-BR, pt-PT | Correct for Brazilian and European Portuguese |
Reference
- Language: ISO 639-1 (two letters)
- Region: ISO 3166-1 Alpha 2 (two letters)
- Format:
языкorязык-регион
<!-- Правильно -->
<link rel="alternate" hreflang="en-GB" href="https://example.com/uk/page" />
<link rel="alternate" hreflang="en-US" href="https://example.com/us/page" />Error 4: Missing x-default
x-default specifies the default version when the user's language does not match any available option. Without x-default, Google selects a version itself, often not the most suitable one.
Incorrect
<link rel="alternate" hreflang="ru" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
<!-- Нет x-default -->Correct
<link rel="alternate" hreflang="ru" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page" />Typically, x-default points to the English or international version.
Error 5: Relative URLs
Google recommends absolute URLs. Relative URLs may work, but can cause problems in some cases.
Incorrect
<link rel="alternate" hreflang="en" href="/en/page" />Correct
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />This is especially important for sites with multiple domains (example.ru, example.de), where a relative path is ambiguous.
Error 6: Conflict between canonical and hreflang
Canonical should not point to a version in another language. Each language version is a separate page, and canonical should point to itself.
Incorrect
<!-- На русской странице -->
<link rel="canonical" href="https://example.com/en/page" />
<link rel="alternate" hreflang="ru" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />The Russian page is canonicalized to the English page, so Google may index only the English version for all regions.
Correct
<!-- На русской странице -->
<link rel="canonical" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="ru" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page" />Error 7: Different sets on pages in the same language
All pages in a set must link to the same set of versions. If /ru/page1 links to en and de, while /ru/page2 links only to en, this is a configuration error.
Cause
This often happens when hreflang is added manually or when different templates are used for different page types. Check that the generation logic is consistent.
Error 8: Hreflang pointing to nonexistent pages
The link points to a URL that returns 404 or redirects. Google will not be able to use the set.
Check
Check all URLs in the hreflang markup:
curl -I https://example.com/en/page
curl -I https://example.com/de/pageMake sure they all return 200 and that the content is accessible.
Error 9: Duplicate hreflang in one document
Multiple link blocks with hreflang for one page create ambiguity. Keep one complete set.
Incorrect
<link rel="alternate" hreflang="ru" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
<!-- ... где-то ниже в документе ... -->
<link rel="alternate" hreflang="ru" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="de" href="https://example.com/de/page" />Correct
One block with all versions in the head.
Error 10: Hreflang in both markup and sitemap with discrepancies
If you use both HTML and a sitemap, the data must match. Discrepancies can confuse the crawler.
Recommendation: choose one method (HTML is preferred) and stick to it.
Error-fixing checklist
| Error | Action |
|---|---|
| No self-reference | Add a link with the hreflang value for the current language |
| Incomplete reciprocity | Check all pages in the set and add any missing links |
| Incorrect codes | Use ISO 639-1 and ISO 3166-1 |
| No x-default | Add a link with hreflang="x-default" |
| Relative URLs | Replace with absolute URLs |
| Canonical points to another version | Set canonical to the page itself |
| 404 on target URLs | Fix or remove the links |
| Duplicate blocks | Keep one set |
Validation tools
The hreflang tool on reChecker checks markup for common errors and provides a report with recommendations. For a comprehensive check of a multilingual site, use the technical audit.
Google Search Console shows hreflang issues in the “International Targeting” report if they affect indexing.
Error-fixing plan
Step 1: Audit
Check all language versions of key pages. Make a list of URLs with errors. Identify patterns (the same error on every page indicates a template problem).
Step 2: Fix templates
If the error is systemic (for example, a missing self-reference on every page), fix the template or generation logic. One fix will resolve all instances.
Step 3: Manual fixes
For isolated errors (an incorrect URL on a specific page), fix them manually or through the CMS.
Step 4: Validation
Check again using the tools. Make sure the errors have been resolved.
Step 5: Monitoring
After the fixes, Google will recrawl the pages. Check Search Console after 1–2 weeks; the status of international targeting should improve.
Preventing errors
Templates and generation
Use a single template to generate hreflang. Include variables for the current language, the list of languages, and the base URL. Test on staging before deployment.
Documentation
Document the rules: which codes are used, which URL is x-default, and the structure. New teams and developers will be able to follow the standards.
Regular checks
Include hreflang checks in a monthly or quarterly audit. New pages and new languages are sources of new errors.
Related materials
For the basic setup guide, see Hreflang: a complete guide. The multilingual promotion strategy is covered in the international SEO guide.