Customer Impact

SEO

Fixing hreflang errors: return tags, x-default and many-to-many

Copy for AI

Your hreflang tags are in place, but Search Console keeps complaining or the wrong language version keeps ranking. That is the frustrating thing about hreflang: a tag that looks fine can still be ignored completely. This page is the troubleshooting layer on top of the explanation. If you are not yet clear on what hreflang actually does, read our explanation of hreflang tags first, or zoom out to the basics with our guide on what SEO is. Already know all that and only want to understand why your implementation is broken? Then you are in the right place. We work through the three hreflang errors behind nine out of ten problems: missing return tags, a wrong x-default, and broken many-to-many sets.

Diagnose first, tinker later

The biggest waste of time with hreflang is changing tags blindly. Before you change anything, you want to know which error you have. Three sources give you that answer:

  • Google Search Console. Under international targeting and the page reports you see messages like “no return tags”. That is your most important signal, because it comes straight from Google.
  • A crawl with an SEO audit platform. A crawler walks through all your pages and shows, URL by URL, which hreflang set is on it and whether the counterparts point back. You find this neatly structured in a proper SEO audit.
  • Checking the page source manually. Open the <head> of two language versions side by side and compare. Time-consuming, but it makes the problem tangible.

Only once you know which of the three errors you are dealing with do you start repairing. Otherwise you keep fighting symptoms.

Error 1: the missing return tag

This is by far the most common complaint. The rule is simple: if page A points to page B, B has to point back to A. If that return reference is missing, Google treats the signal as unreliable and often ignores the entire hreflang block. Not just the one faulty line, but the whole set.

A typical scenario: your Dutch-language page is set up neatly and points to the French version. But the French page was built by a different team member or from a different template and lacks the reference back. The result: Google does not see the relationship as mutually confirmed and does nothing with it.

Here is what it looks like when it is wrong. On example.be/nl/diensten/ you have:

<link rel="alternate" hreflang="nl-be" href="https://example.be/nl/diensten/" />
<link rel="alternate" hreflang="fr-be" href="https://example.be/fr/services/" />

But on example.be/fr/services/ there is only:

<link rel="alternate" hreflang="fr-be" href="https://example.be/fr/services/" />

The French page does not point back to the Dutch one. The fix is for both pages to carry the full, identical set:

<link rel="alternate" hreflang="nl-be" href="https://example.be/nl/diensten/" />
<link rel="alternate" hreflang="fr-be" href="https://example.be/fr/services/" />
<link rel="alternate" hreflang="x-default" href="https://example.be/" />

Watch out for the detail many people overlook: the reference to the URL you are on belongs in there too. That is the self-reference. So the nl-be page has to contain an hreflang to nl-be itself. If it is missing, your set is incomplete and the return tag complaints come right back.

Two common causes of a broken return tag: a difference in URL notation (one tag writes https://, its counterpart http:// or drops a trailing slash) and a reference to a redirected URL. Hreflang always has to point to the final, indexable URL, never to a version that still passes through a redirect or a canonical.

Error 2: the wrong or duplicated x-default

The x-default designates the version Google shows when no language or region version matches. For the messy Belgian market, with Dutch speakers, French speakers and plenty of international visitors, that is a useful safety net. But it is also a source of two specific errors.

The first error: multiple pages claim the x-default at the same time. Your nl-be page carries an x-default pointing to itself, and your fr-be page carries an x-default pointing to itself. Now Google has two conflicting default versions and does not know which one to show. There should be exactly one x-default destination within one hreflang cluster, and all variants point to that same URL.

The second error: the x-default points to a page that does not exist as a neutral safety net. Sometimes the x-default sits on an old homepage that is now redirected, or on a language-picker page that carries no hreflang set of its own. Choose deliberately what your safety net is: a neutral landing page that lets the visitor choose, or one of your main languages. Whatever you pick, that destination has to be a live, indexable URL.

A properly working setup looks like this, identical on every variant:

<link rel="alternate" hreflang="nl-be" href="https://example.be/nl/diensten/" />
<link rel="alternate" hreflang="fr-be" href="https://example.be/fr/services/" />
<link rel="alternate" hreflang="x-default" href="https://example.be/" />

One x-default, one destination, the same on every page. No page claiming itself as the default while another one does the same.

Error 3: the broken many-to-many set

With two language versions, hreflang is still manageable. It gets treacherous the moment you have three or more versions, for example nl-be, fr-be and an international English version. The rule stays the same, but the number of connections explodes. Every page has to point to all versions, including itself. With three versions that means three hreflang lines on every page, and those three sets have to match each other perfectly.

This is where it goes wrong: someone adds a third language and sets up the new page neatly, but forgets to update the two existing pages. The new English page points to nl-be and fr-be, but nl-be and fr-be still only point to each other and not to the English version. The cluster is asymmetrical and falls apart.

The correct many-to-many set for three versions, which should sit identically on each of the three pages:

<link rel="alternate" hreflang="nl-be" href="https://example.be/nl/diensten/" />
<link rel="alternate" hreflang="fr-be" href="https://example.be/fr/services/" />
<link rel="alternate" hreflang="en" href="https://example.be/en/services/" />
<link rel="alternate" hreflang="x-default" href="https://example.be/" />

The guiding principle: treat an hreflang cluster as one whole that you change in one go, not as separate pages. Add a language or remove one, and you update every page in the cluster. If you do not, you create exactly the asymmetry that triggers return tag errors. For larger sites this is an argument for managing hreflang in your XML sitemap rather than per page, so that you maintain all relationships in one central place. How to set that up within a scalable URL structure is covered in our guide on international SEO.

The hidden fourth error: hreflang and canonical fighting each other

Sometimes your hreflang tags are perfect and it still goes wrong. Then the problem sits with the canonical. A canonical says “index this version”, hreflang says “this is the variant for this audience”. If they contradict each other, confusion wins. If your nl-be page has a canonical pointing to the fr-be version, you are telling Google both “this is a separate language version” and “this page does not count, take the French one”. Google may then ignore both.

The rule of thumb: every language version gets a self-referencing canonical pointing to itself, plus the full hreflang set. One canonical per page, to itself, never to another language version. This consistency between tags is a fixed checkpoint in our technical SEO approach, because it is exactly the kind of error that stays invisible until your rankings collapse.

The repair process in four steps

Tackle your hreflang problems systematically, not ad hoc:

  1. Confirm the error. Read the message in Search Console or run a crawl. Know which of the four errors you have before you touch anything.
  2. Repair the whole cluster at once. Update every variant in the cluster with the same, complete set. Half fixes on one page solve nothing.
  3. Check URL notation and redirects. Make sure every hreflang points to a final, indexable URL, with consistent protocol and slash notation.
  4. Recheck after the next crawl. Hreflang changes do not take effect immediately; Google has to recrawl all versions before the relationship is confirmed. Patience is part of the process.

If you want to build this in as a recurring checkpoint after every content change, add it to your technical SEO checklist, so a new page never breaks a cluster unnoticed.

Frequently asked questions about hreflang errors

Why does Search Console say “no return tags” when my tags are right there? Because the counterpart does not point back, or points back to a slightly different URL (a difference in protocol, www or trailing slash). Google compares the exact URL. One character off and the return tag does not count.

How many x-default tags am I allowed to have? One destination per hreflang cluster. All variants point to that same x-default URL. Two pages each claiming themselves as the default is an error.

Should hreflang point to the canonical URL or to the actual page? To the final, indexable URL, which is ideally also your self-referencing canonical. Never let hreflang point to a redirected or non-canonical version.

How long does it take for an hreflang fix to take effect? Until Google has recrawled all the pages involved. That can take days to weeks, depending on your crawl frequency. A fix that goes live today will not be validated tonight.

Does hreflang work outside Google too? Google and Yandex use it; Bing and Baidu do not. If you are targeting those markets, you need other signals.

Can’t get your hreflang right?

Hreflang is one of the places where Belgian B2B sites most often quietly go wrong: the tags look fine, but the right language version stays impossible to find and your own pages compete with each other. We are a small team that takes an honest look with you and tells you whether this is a quick fix or a symptom of a deeper structural problem. For us, SEO is not an isolated tag exercise but the acquisition layer of your growth engine, steered on pipeline and not on technical completeness. Take a look at our approach for SEO specialist and let us review your hreflang setup.

Book your free intake

Free website scan

Enter your website and get an automatic scan within minutes, with concrete technical and SEO improvements. No sales pitch.

Where should we send your report?

We only use your details for your scan. No spam, unsubscribe anytime.