You translated your website into three languages, and Google still shows the English version to visitors in Germany. Or worse, your Spanish pages compete against your English pages in the same results. Both problems have the same missing piece: hreflang, the annotation that tells search engines which language and regional version of a page belongs to which audience. It is also, by broad agreement among SEO professionals, one of the easiest technical signals to implement incorrectly.
What Hreflang Actually Does
Hreflang is a set of annotations declaring that a group of pages are alternate versions of each other for different languages or regions. When Google understands the group, it swaps the right version into results for each searcher: the German page for users searching in German, the Bulgarian page for users in Bulgaria, and so on. The ranking signals earned by any version help the whole group, while each searcher lands on the version they can actually read.
One clarification saves a lot of confusion: translated pages are not duplicate content. A proper German translation of an English page is unique content and needs no canonical consolidation. Hreflang connects the versions, it does not merge them. Our canonical URL guide covers the neighboring problem of true duplicates.
The Syntax
The most common implementation is a block of link elements in the head of every page in the group:
<link rel="alternate" hreflang="en" href="https://example.com/en/pricing/">
<link rel="alternate" hreflang="de" href="https://example.com/de/preise/">
<link rel="alternate" hreflang="bg" href="https://example.com/bg/ceni/">
<link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing/">
Language codes follow ISO 639-1, optionally extended with a region: en-GB for English aimed at the United Kingdom, de-AT for German aimed at Austria. The special value x-default names the fallback page for everyone who matches no listed language, typically your primary version or a language selector page.
The Three Rules That Decide Success
Rule 1: Every page lists the complete group, including itself. The English page declares the English, German and Bulgarian versions. So does the German page. So does the Bulgarian page. The self reference is required, and identical blocks across the group is the pattern that works.
Rule 2: Return tags are mandatory. If page A names page B as its German alternate, page B must name page A back. Without the return link, Google discards the annotation entirely. Missing return tags are the number one hreflang failure on the web, usually caused by adding the tags to new language sections while forgetting to update the original pages.
Rule 3: Point only at real, indexable, final URLs. Absolute URLs, status 200, no redirects, no noindex. An hreflang target that redirects or cannot be indexed breaks the annotation for that pair.
Three Places to Implement It
HTML head: the standard choice, easy to template. Its weakness is scale: a site with 20 languages carries 21 extra lines on every page.
HTTP headers: the only option for non HTML documents like PDFs. Rarely needed otherwise.
XML sitemap: the cleanest solution for large multilingual sites. Each URL entry lists its alternates using xhtml link elements, keeping pages lean and putting all language mapping in one maintainable file. Our sitemap guide covers the surrounding mechanics.
Pick exactly one method. Duplicating hreflang in both pages and sitemap multiplies the chances of contradictions.
How Hreflang and Canonical Work Together
The interaction trips up even experienced developers, so here is the working rule: every language version carries a self referencing canonical, and hreflang links the versions to each other. The German page is canonical to itself, not to the English page. Setting the canonical of all languages to one primary version tells Google to index only that version, which quietly removes the translations from search, defeating the entire project. Canonical answers which URL represents this content, hreflang answers which audience this version serves. They operate on different axes and must not point across languages.
Mistakes We See Constantly
Invented region codes. The United Kingdom is en-GB, not en-UK. Regions alone, like a bare gb, are invalid, a language code must come first. One wrong code silently disables that alternate.
Forced redirects by browser language. Sites that automatically bounce every visitor to a localized version based on browser settings also bounce crawlers, which then never see the other language versions. Show a polite suggestion banner instead and let both users and bots reach every version directly.
Annotating pages that do not exist in all languages. If the Bulgarian version of an article was never written, do not point hreflang at the Bulgarian homepage as a stand in. Google treats mismatched content as a broken pair. Annotate only real translations.
Machine translating thousands of pages overnight. Hreflang solves targeting, not quality. Auto translated content with no human review tends to underperform and can drag down how quality systems assess the whole site. Expand language by language, properly.
Testing Your Setup
Spot check by viewing source on one page per language and confirming the groups match exactly. Crawl based validators can verify return tags across the whole site. In Search Console, the page indexing and performance reports reveal the practical symptom of broken hreflang: impressions for the wrong language version rising in the wrong country. The CheckMy.site scanner checks hreflang presence and validity on multilingual pages as part of its international SEO signals, inside the same 158 point report that covers your meta tags, structured data and crawlability. Get the annotations right once, template them, and every language you add afterward inherits a working setup.
