Skip to content
Back to the guides
Guide Last checked: October 2026 8 min read

hreflang mistakes and how to fix them

hreflang links only work as a complete set. This guide shows the errors that most often break such a set, how to find them and how to fix them.

Why small mistakes break hreflang

hreflang links tell search engines which pages are versions of the same content in other languages or for other regions. Each version has to confirm the others. One wrong code, one missing return link or one version that redirects can be enough for part of the set to be ignored. How to set up language versions and their addresses in the first place is covered in our guide Translating your website. This guide is about the errors that remain afterwards.

Three versions of the same page in a triangle. Each pair is joined by an arrow in both directions, and each page has a small arrow that points back to itself: every version names all others and itself.
A complete set: return links between all versions and a self-reference on each page.

How to check a set

Start at one page, collect its hreflang links and then open every version it lists. Only then can you see whether the versions agree with each other.

How to check an hreflang set
Collect the links
All hreflang entries of the start page
Check the codes
Language in ISO 639-1, region in ISO 3166-1
Open each version
Status 200, no redirect, no noindex
Check return links
Each version lists all others and itself
Check the canonical
Each version names itself
Check x-default
At most one, the same on every page
Start at one page and follow every version it lists.

Mistake 1: return links are missing

It is the first point in the list of common mistakes that Google publishes. If page A lists page B as its German version, page B has to list page A as well. Google writes that the tags are ignored if two pages do not both point to each other. This happens when a new language is added to only some pages, or when each language lives in a separate system. The fix is to build the block of hreflang links from one list of all versions and to put the same block on every page of the set.

Does every version link back?
Does the listed version name this page in its own hreflang links, with exactly the same address?
Yes
The pair confirms itself. Google can use the annotations between these two pages.
No
Google may ignore the annotations between these two pages. Add the missing link on the page that lacks it.
Ask this question for every pair of pages in the set.

Mistake 2: wrong language or region codes

  • en-UK instead of en-GB. The ISO code for the United Kingdom is GB. Google writes that reserved codes such as UK, EU or UN have no effect in hreflang.
  • A country code on its own, such as us or jp. Google does not accept a region without a language. The language code for Japanese is ja, so a page for Japan uses ja or ja-JP.
  • A country taken for a language. The example Google gives: be is the code for Belarusian, not for Belgium. A page in French for Belgium uses fr-BE.
  • An underscore, as in en_GB. According to the W3C, the parts of a language tag are separated with a hyphen.
  • Codes that are valid elsewhere but not for Google. es-419 means Spanish in Latin America and is a valid language tag according to the W3C, but Google writes that it does not support it.
Wrong and right codes
Wrong
  • en-UK
  • jp (a country, not a language)
  • be for Belgium (be is Belarusian)
  • en_GB (underscore)
  • es-419 (not supported by Google)
Right
  • en-GB
  • ja or ja-JP
  • fr-BE or nl-BE
  • en-GB (hyphen)
  • es, or one code per country such as es-MX
Upper and lower case do not matter to Google: en-gb and en-GB are the same.

Mistake 3: the page does not list itself

Google writes that each language version must list itself as well as all other versions. A page that names only the other languages is missing its own entry. One possible cause: the same loop also builds the language switcher, and the switcher often hides the active language. Keep the two apart: the switcher may hide the current language, the hreflang block must not.

Mistake 4: x-default is missing or inconsistent

x-default is a reserved value. Google uses it when no other language or region matches the browser settings of the visitor and recommends it as a fallback, for example for a page where visitors choose their language. You do not have to use it. If you do, use it once per set, put the same entry on every page and let it point to a page that works for visitors from anywhere, such as a language selection page or your main version. Typical errors: an x-default that differs from page to page, two x-default entries in one set, or one that points to a page which redirects visitors by location.

Mistake 5: the canonical points to another language

The canonical tag says which address is the main version among duplicates of a page. Google advises specifying a canonical page in the same language, or the best possible substitute language if there is no canonical page in that language. If the German page names the English page as canonical, the signals contradict each other: hreflang says the German page is a version of its own, the canonical says it is a copy of the English page. The fix: every language version names itself as canonical, and the versions are connected with hreflang.

Canonical and hreflang do different jobs
rel=canonical chooses among duplicates of the same page, hreflang connects translations. According to Google, a canonical link that carries an hreflang attribute is not used for canonicalization. Google also writes that language versions count as duplicates only if the main content stays untranslated.

Mistake 6: links to redirects, noindex pages or errors

  • Redirects. An hreflang link to an address that redirects names an address that is not the page itself. Google treats a redirect as a strong signal that its target should be the canonical address. List the final address. It is worse if a version redirects to another language version, because then two codes lead to the same page.
  • noindex. A page with noindex is kept out of Google Search, so an hreflang link to it points to a version that cannot be shown. Either remove the noindex or remove the page from the set on every page.
  • Errors. A version that answers with 404 or a server error cannot confirm the set. Restore it, or remove it from the block on every page.

Smaller mistakes that are easy to miss

  • Addresses that are almost the same. http and https, with and without www, with and without a slash at the end are different addresses. The return link must name exactly the address of the page.
  • Relative addresses such as /de/preise/. Google requires fully qualified addresses including https://.
  • Several methods that disagree. For Google, link elements in the HTML, the HTTP header and the sitemap are equivalent, and using more than one brings no benefit in Search. Use one method.

Fix in the right order

  1. 1Make one list of all versions of a page: code and exact final address.
  2. 2Check each address: status 200, no redirect, no noindex, canonical pointing to itself.
  3. 3Build the hreflang block from this list, including the self-reference and, if you want one, a single x-default.
  4. 4Put the same block on every page of the set, using one method.
  5. 5Check the set again after every relaunch and every new language. Start with the pages with the most visitors (our advice, not a rule of Google).

Check your hreflang with Do4U

The hreflang check does these steps for one page and all its versions. You enter one address. Do4U reads the page, collects its hreflang links and then reads each listed version. The code checks return links and self-references, language and region codes, x-default and duplicates, and whether every version is reachable without a redirect, has no noindex, names the right canonical and has a matching html lang. You get a list of the pages with errors and warnings, a short explanation for each finding and a matrix of the return links. It runs without AI and is free, with a daily limit per account.

The check reads only the link elements in the HTML. It does not read hreflang in HTTP headers or sitemaps and does not run JavaScript. Do4U finds hints, you check and decide. Correct hreflang links are no promise of better rankings.

Sources