SEO and AI visibility 6 min
Hreflang and multilingual SEO: the costly mistakes
A hreflang tag must only announce pages that exist, and each version must point to all the others, itself included. The most common mistake: a template that outputs every language on every page, even where no translation exists. Google may then ignore the annotations, hence a page-by-page check.
What Google asks for, in three rules
Hreflang is the annotation that tells Google “this page also exists in English, here, and in German, there”. On paper it is simple. Google’s documentation on localized versions comes down to three rules worth knowing by heart:
- Links go both ways. If page X announces page Y, Y must announce X. Otherwise, Google writes, the annotations may be ignored or not interpreted correctly.
- Each version lists itself as well as all the others.
- x-default names the fallback page, served when the visitor’s language matches none of your versions.
Google also states that a localized page is only treated as a duplicate if its main content was left untranslated. Keep that in mind: translating the menu and leaving the rest in English does not make a localized version.
What the documentation does not say, because it goes without saying, is that a hreflang must point to a page that exists. That is exactly where the costliest mistakes hide, because they are invisible to the eye: the page looks fine, only the source code lies.
What we found on Palmora, in six languages
Palmora Property, our real estate agency in Phuket, publishes its site in English, French, Thai, Russian, Chinese and German. Six languages means six chances to get each page wrong. Here are the mistakes we found and what fixed them.
1. Announced languages that do not exist (fixed on 22 July 2026)
The blog article template always output all six hreflang tags plus an x-default, whether or not the translation existed. Yet many articles are written for a single nationality: a tax guide for French buyers has no reason to exist in Thai. The audit of 22 July 2026 checked a French-only article in production: five of the six hreflang tags and the x-default led to 404s.
Twenty-four article groups were affected: nineteen single-language articles and five translated into five of the six languages. The most annoying part: the blog sitemap got it right. It only listed existing languages. So the site was sending two contradictory signals.
The fix: only output a hreflang for languages where the article really exists, using the same logic as the sitemap. For x-default, English when it exists, otherwise the original language. Today, the French-only article announces only itself, as French and as x-default.
2. The 404 page that answered everyone in English (fixed on 18 September 2026)
When an address does not exist, the site displays the 404 page through an internal rewrite. Side effect: after the rewrite, the site believed it was on /404 and lost the language of the requested address. A German visitor who mistyped an address got an English error page, menu and footer included, in all six languages.
The fix reads the language from the original address, not the rewritten one. The 404 is served as noindex, with no canonical and no hreflang: an error page has no translation to announce.
3. “Translated” titles that were not (fixed on 18 September 2026)
Listing pages built their title by gluing a property type to a contract type. In German, that produced “Villas Zu verkaufen”, with a wrong capital letter and wrong word order. In Thai, Russian, Chinese and German, the title and description tags stayed in English. For Google, a page announced as Russian whose title and description are in English sends a confusing signal; for the visitor, it is a site that does not really speak their language.
The fix: complete templates per language, with singular and plural forms and agreement with numbers (Russian has three forms). No more gluing words together in a component. We come back to these templates in the article on programmatic SEO: on a generated catalogue, a template error repeats itself on every page the template produces.
4. A language routed but forgotten elsewhere (fixed on 18 September 2026)
German had all its addresses, but was missing from several language lists in the code, so some pages returned 200 with an empty body. No hreflang here, but the same root cause: a language is more than its addresses. It has to exist wherever the code lists languages.
What we did on our own site
Brain Plus AI shows the opposite mistake. The site was long produced in four languages: English, French, Spanish and Chinese. On 24 July 2026 we decided to keep only English and French. Sixteen months of Search Console showed 15 clicks on the Spanish section and none on the Chinese one, almost all on brand queries that English captured just as well.
Except the decision had not been carried out. The audit of 9 September 2026 found 18 Spanish and Chinese pages still being built, listed in the sitemap and announced in hreflang from every page, with the old positioning translated.
We archived them the same day: pages removed, 301 redirects from /es/ and /zh/ to the English equivalent, hreflang limited to English and French. Two rules have since been written into the template code: a hreflang never points to a 404, and a noindex page outputs none.
The lesson: a language you drop is retired like a page you delete, with its redirects and its annotations. Leaving it in place “for now” costs more than deciding.
The checklist
Before launching a multilingual site, or while auditing an existing one:
- Follow every served hreflang and check that it returns 200. Not on a sample: on every page, by script. A template that only translates the language prefix of a translated address (
/fr/produits/announced as/en/produits/instead of/en/products/) goes unnoticed on a sample, because pages built differently are correct. - Check reciprocity. Each version announces all the others, itself included, and all of them announce it back.
- Compare page hreflang with sitemap hreflang. Two sources saying different things is, at best, an ignored signal.
- Choose x-default deliberately: the general version, or the original language when there is only one version.
- Read the tags, not just the page: title, description and H1 translated, not glued together word by word.
- Type a wrong address in each language and check that the 404 answers in the right language, as
noindex. - Retire an abandoned language cleanly: 301s, no hreflang left, nothing left in the sitemap.
These checks are part of our SEO audit, and every static site migration runs them again: changing platforms is when the template gets rebuilt, so it is when hreflang gets fixed or broken. They are also part of the groundwork of our SEO and GEO engine, which fixes the site before writing a single article.
Multilingual is only one part of an audit: we describe the rest in what an SEO agency should deliver in the age of AI.
Frequently asked questions
Should every page be translated into every language? No. An article written for a specific audience can exist in one language only: a tax guide for French buyers has no place in Thai. Its hreflang just has to say so, announcing only the versions that exist, and the sitemap has to say the same thing. Announcing a missing translation sends the engine to a 404.
Is hreflang enough to make a translated page rank? No. It helps Google serve the right version to the right visitor, but it does not lift a page in the results. It replaces neither genuinely translated content, title and description included, nor internal links in the right language. A translated page with no links pointing to it is a page the engine struggles to find.
Hreflang in the pages or in the sitemap? Google accepts three methods, tags in the page, HTTP headers (useful for a PDF) and the sitemap, and treats them as equivalent. Combining them brings no benefit, and Google notes that three implementations are harder to manage than one. If you keep two, they must announce exactly the same versions: on a generated site, produce them from the same list of translations.
Jim · founder of Brain Plus AI
Also in seo and ai visibility
- 8min
Understand
Programmatic SEO: when it works, when it hurts
Generating thousands of pages from a database can serve your visitors or earn you a scaled content abuse penalty. What makes the difference, seen from a real estate catalogue published in six languages.
- 6min
Understand
llms.txt: what it is really for
The llms.txt file promises to help AI read your site. What the proposal says, what can be verified about real usage, what Google, OpenAI and Anthropic say about it, and why we publish one anyway.
- 7min
Practical guide
How to get cited by ChatGPT and AI search engines
What actually gets a site cited by ChatGPT, Claude or Perplexity: let the bots read it, answer straight away, source every fact, mark up only what is shown. And how to measure it without fooling yourself.