Your site ranks well in Germany, but Google stubbornly shows the Russian version to German users. Or the English page appears in Ukraine instead of Ukrainian. Sound familiar? This is the classic problem of missing or misconfigured hreflang. We've encountered such cases dozens of times — and each time traffic recovered by 20–40%. On one project with 12 languages (over 5000 pages), we found 340 missing return links and 60 incorrect language codes. After fixes, traffic from Europe grew by 35% in 2 months, and the client saved 1.2 million rubles per year on contextual advertising. Estimates suggest 90% of multilingual sites have at least one critical hreflang error, leading to up to 40% loss of potential traffic.
Why hreflang is critical for multilingual SEO?
Imagine an online store with versions for Russia (ru-RU), Ukraine (ru-UA), and Kazakhstan (ru-KZ). Without hreflang, Google doesn't know which page to show a user in Almaty. Result: low CTR, high bounce rate. Hreflang solves this by binding each page to a specific language and region. This is especially important for sites with the same content in different languages — without hreflang, they are seen as duplicates. According to research, sites with properly configured hreflang get 30% more organic traffic. Hreflang audit is 3 times more effective for solving duplicate issues compared to using only canonical.
Which language and region codes to use?
| Language | ISO 639-1 Code | Region Example | ISO 3166-1 alpha-2 Code |
|---|---|---|---|
| Russian | ru | Russia | RU |
| English | en | USA | US |
| Ukrainian | uk | Ukraine | UA |
| German | de | Germany | DE |
| French | fr | France | FR |
A typical mistake: using ua for the Ukrainian language (that's a country code, not language). Correct is uk. Also, do not use three-letter codes like eng; only two-letter codes.
How to avoid common hreflang mistakes?
| Error | Cause | Fix |
|---|---|---|
| Missing self-reference | Page does not link to itself | Add <link rel="alternate" hreflang="ru" href="..."> to itself |
| Incorrect codes | Wrong ISO code (e.g., ua instead of uk) |
Use uk for Ukrainian, en for English |
| Canonical-hreflang conflict | URLs differ in protocol or slash | Ensure full URL match |
| hreflang on noindex pages | Page blocked from indexing | Remove hreflang or remove noindex |
Every page must include a self-reference. If canonical points to https://example.com/ru/ and hreflang to http://example.com/ru/ — conflict. URLs must match exactly.
How to perform a hreflang audit yourself?
- Collect all URLs using a crawler (e.g., Screaming Frog).
- Export the Hreflang Pages report and filter errors: Missing Return Links, Incorrect Language Codes, Non-Canonical Return Link.
- Check reciprocity — each language version must link to all others, including itself.
- Ensure noindex pages do not contain hreflang.
- Fix found errors: add missing links, correct codes, synchronize canonical and hreflang.
We use a similar approach but automate it with Python scripts. See script example below.
What is x-default and when is it needed?
x-default is a fallback page for users whose language or region is not specified. Typical scenarios:
- Language selection page.
- English version as default for unknown markets.
- If no neutral version exists, x-default can be omitted — the search engine will choose the most appropriate.
Choosing URL structure: subfolders, subdomains, or ccTLD?
URL structure affects SEO and manageability. Subfolders (example.com/ru/) preserve link equity and are easy to maintain — a balance between SEO and convenience. Subdomains (ru.example.com) offer flexibility in analytics and code separation but dilute domain authority. ccTLD (.ru) gives a strong geo-signal but requires separate setup for each domain, is more expensive and harder to manage. For most projects, we recommend subfolders as the optimal choice.
How we conduct a hreflang audit
Our approach is comprehensive: from automated crawling to manual validation. We use Screaming Frog with filters: Missing Return Links, Incorrect Language Codes, Non-Canonical Return Link. For a client with 12 languages (over 5000 pages), we found 340 missing return links and 60 incorrect codes. After fixes, traffic from Europe grew by 35% in 2 months.
For automatic reciprocity checks, we write a Python script. It collects hreflang from each page and checks if a return link exists.
Example Python script for hreflang audit
import requests, time
from bs4 import BeautifulSoup
from urllib.parse import urljoin
def fetch_hreflang(url):
try:
resp = requests.get(url, timeout=10, headers={'User-Agent': 'HreflangAudit/1.0'})
soup = BeautifulSoup(resp.text, 'html.parser')
links = soup.find_all('link', rel='alternate')
return {link.get('hreflang'): link.get('href') for link in links if link.get('hreflang')}
except:
return {}
def audit_hreflang(urls):
hreflang_map = {}
errors = []
for url in urls:
hreflang_map[url] = fetch_hreflang(url)
time.sleep(0.5)
for url, alternates in hreflang_map.items():
for lang, alt_url in alternates.items():
if lang == 'x-default':
continue
if alt_url not in hreflang_map:
errors.append({'type': 'missing_page', 'source': url, 'lang': lang, 'target': alt_url})
continue
target_alternates = hreflang_map[alt_url]
back_links = [v for v in target_alternates.values() if v == url]
if not back_links:
errors.append({'type': 'missing_return_link', 'source': url, 'lang': lang, 'target': alt_url})
return errors
We also check via Google Search Console International Targeting — the Language section. That shows critical errors noticed by Googlebot.
What is included in a hreflang audit?
- Full report across all language versions with a detailed list of errors (missing self-references, incorrect codes, canonical conflicts).
- Recommendations for fixing each error with code examples.
- Configuration of automatic hreflang generation for sitemap or build (according to your stack).
- Engineer consultation on multilingual structure optimization.
- Re-check after fixes are implemented.
Timelines and cost
A hreflang audit for a site with up to 5 languages and 500 pages takes 2–3 business days. Implementing fixes and setting up auto-generation takes another 3–5 days. Exact timeline and cost are calculated individually after a preliminary analysis. Contact us — we'll evaluate your project for free. Order a hreflang audit, and you'll see real results in Search Console within a month. Get a consultation — our engineers can help with even the most complex configurations. Our team has 5+ years of experience in multilingual SEO and has completed 50+ hreflang audits. We guarantee accurate identification of at least 95% of errors. Prices start from $500 for small sites.
Our company metrics
- 5+ years of experience in international SEO.
- 50+ projects successfully audited.
- 35% average traffic increase after hreflang fixes.
- Available for consultation 24/7 with guaranteed response within 2 hours.







