We create digital solutions that work for businesses
You built the site in three languages. Every version is translated, the URLs are tidy, everything looks right. Yet search shows the English page to Ukrainian visitors, and Search Console starts warning about duplicates.
The cause is almost always the hreflang tags — or rather how they were set up. Here is how they work and where they break.
They tell search engines: these pages are the same thing in different languages, show each visitor their own. Without them Google decides for itself, and not always the way you want.
There is a second, less obvious effect: without these tags similar pages can be read as duplicates. A translation is the same content in different words, and the algorithm may well conclude you are duplicating yourself.
The Ukrainian language code is uk, not ua. This trips people up because the country domain is .ua, so the hand writes it automatically.
The reason is that hreflang takes the language from one standard and the country from another. UA is the country code for Ukraine; the language is uk. Google simply ignores a tag using ua, and the language link never forms.
You can check your own site with the hreflang checker — it lists every code and says immediately what is wrong with it.
Self-reference. Every page must appear in its own set. The Ukrainian version lists English, Russian — and itself. Without that the set counts as incomplete and Google may discard it entirely.
Reciprocity. If the Ukrainian page points to the English one, the English page must point back. One-way links do not count.
The simplest way to satisfy both rules is to place the identical block of tags on every version. Not "each pointing at the others" but literally the same set. Reciprocity then follows automatically.
Absolute URLs. href="/en/page/" does not work: the specification requires full links with protocol and domain.
It is the fallback for visitors whose language matches none of yours. A German arriving at a trilingual Ukrainian site is exactly that case.
Technically optional. But without it Google picks the version, and not always the one you would choose. x-default usually points at the English version or a language-selection page.
The usual cause is a conflict with the canonical. The page says "my main version is English" through canonical while also carrying hreflang tags. Google follows the canonical and the language links are cancelled.
The rule is simple: every language version should name itself as canonical. You can verify that with the canonical checker.
The second frequent cause is tags placed only on the homepage. Each page needs its own set; the homepage does not pass these links deeper into the site.
The third is a target that redirects or 404s. Often a leftover from an https migration where the tags kept the old URLs.
On large sites it is easier to declare the set in the sitemap rather than the page markup, keeping the HTML lean. The rules are the same.
Google has to recrawl every page in the set, not just one. Changes usually show within one to two weeks. Submitting the pages in Search Console speeds it up.
Ukrainian is uk. The same block on every version, absolute URLs, self-reference required. Canonical pointing at itself, or none of the rest matters.
Let’s create something amazing together