PHP2Shell: is your site at risk? Free check →
We Do Dev Work
We Do Dev Work
SEOWebsites
• 10 Nov 2026

Multilingual SEO: 5 Hreflang and Canonical Mistakes We Fixed

Multilingual SEO: 5 Hreflang and Canonical Mistakes We Fixed

Most multilingual SEO problems come from five mistakes: hreflang tags that don't point at each other, canonical URLs that include query strings, the same text published under several language URLs, untranslated pages that pretend to be translated, and sitemaps that list pages that don't exist in that language. None of them show up when you look at the site in a browser. Between 31 October and 4 November 2026 we found all five on our own site, wedodevwork.com, which runs in English, Dutch, French, German and Thai.

How we found them

We crawled every URL in our sitemap, 776 at the time, and compared titles, descriptions, canonical tags and hreflang tags per language. We also read the page indexing report in Google Search Console, which showed URLs we had never meant to publish. Each mistake below is one we fixed, with what it did and how we fixed it.

1. Language versions that didn't point at each other

Hreflang tags tell Google which URL is the Dutch, French or Thai version of a page, so it can show the right one in each country. They only work when every version lists every other version, including itself.

Our blog posts listed only their own language plus x-default. The English post did not mention the Dutch one, and the Dutch one did not mention the English one. The cause was one line of code: the blog page passed its list of translated languages under the name languages, which overwrote the site-wide list that the SEO component reads. Every alternate ended up without a language code and was dropped. The page looked perfect; only the HTML source showed it.

The fix was renaming that one key. Since 4 November every post lists all its real translations. A post without a Thai version lists four languages, not five.

Check yours: open the page source of one translated page and search for hreflang. You should see one line per language, the same set on every version, plus x-default.

2. Canonical URLs with query strings

Search Console showed Google indexing pages like /th/chat?topic=project_senior and /th/chat?topic=dedicated_developer_medior as separate pages. Our offer buttons link to the chat with a ?topic= parameter that preselects the subject. The canonical tag repeated the full URL, query string included, so every topic link and every link with tracking parameters claimed to be its own page.

The fix: canonical and hreflang tags now use the path only. The parameter still preselects the topic; it just no longer creates a new page for Google. This matters even more on a multilingual site, because every duplicate is multiplied by the number of languages.

3. The same English text under five language URLs

Our free fix guides exist only in English, but the site served them under all five language prefixes, from /en/fixes/… to /th/fixes/…, with the same English title and text. Six guides times five languages: 30 near-duplicate pages competing with each other.

The fix: every language version now has a canonical pointing to the English URL, hreflang lists only English, and the sitemap lists each guide once. That removed 24 URLs from the sitemap. Visitors on the Dutch site still get the Dutch menu around the guide.

4. Untranslated pages dressed up as translated

Our German job pages had the title "Offene Stelle" and the description "Bewerben Sie sich als bei…", with the job name missing: no job had a German translation, so the template filled in nothing. Five German case studies showed the generic English site description for the same reason.

A missing translation is fine. A page that pretends to be German while it has no German content is not: it looks thin to Google and odd to visitors. The fix: pages without a translation get noindex, follow and a canonical to the English version. Our blog posts without a Thai translation already worked this way.

5. Sitemaps that list every language for every page

Our blog and service pages listed only the languages they were written in, but case studies and jobs were listed in all five. The sitemap told Google to crawl German pages that had no German text. Now the sitemap is built from the translations that exist, which removed 10 more URLs.

What changed

MistakePages affectedFixed on
Hreflang missing between blog versionsEvery translated blog post4 Nov 2026
Query strings in canonical URLsEvery chat link with a topic31 Oct 2026
English guides under 5 language URLs30 pages1 Nov 2026
Untranslated job and case study pages indexed10 German pages1 Nov 2026
Sitemap listing untranslated pages34 URLs removed in total1 Nov 2026

Google drops duplicates when it recrawls them, which takes weeks, not days. We submit changed URLs to Bing and other engines with IndexNow; see what Bing Webmaster Tools told us.

Check your own multilingual site

  1. Open one page in each language and view the source. Search for hreflang: every version should list the same set of languages plus x-default.
  2. Search for rel="canonical": it should be the clean URL of that language version, without ?utm_ or other parameters.
  3. In Google Search Console, open the page indexing report and look for URLs with question marks, or pages in a language you never wrote.
  4. Pick a page you never translated and open it in another language. If it shows untranslated text, it should be noindex or point its canonical to the original.
  5. Open your sitemap and check that it only lists pages that exist in that language.

Translating into Thai has its own pitfalls, from fonts to word breaks: read translating your website into Thai. For what to build into a site from the start, see our SEO guide for developers.

Want us to check yours?

Start with our website check, or send us your domain through contact. A multilingual SEO check and fixes like these usually take a few hours, which you can pay by the hour or from a strip card of 14 hours ($1,050).

Frequently asked questions

What is hreflang?

An HTML tag (or sitemap entry) that tells search engines which URL is the version of a page for a given language or country, so each visitor gets the right one in the results. Every version must list all versions, including itself.

Do I need x-default?

It is recommended. x-default tells Google which version to show when none of your languages matches the searcher, usually your English or language-selector page.

Should a canonical URL include query strings?

Usually not. Parameters such as ?utm_source or ?topic do not change the content, so the canonical should be the clean path. Otherwise every parameter variant can be indexed as a separate page.

What should happen to pages I haven't translated?

Either don't publish them in that language, or mark the language version noindex with a canonical to the original. Don't let a template fill an untranslated page with empty or generic text.

How long until Google drops the duplicates?

It depends on how often Google crawls your site. Duplicates disappear as Google recrawls them, which typically takes weeks. Submitting your sitemap in Search Console helps; IndexNow speeds this up for Bing and other engines, not for Google.

How do I check hreflang on my site?

Open the page source of each language version and search for hreflang. Each version should list the same set of languages plus x-default, and each URL in that list should return a 200 page with the same tags.

Got a dev problem?

You don't need to know exactly what's wrong. That's kind of the point.

Send the signal