Hreflang and International SEO — Multilingual Visibility in Google and AI Models
The most damage in international SEO comes from one misconception: that hreflang lifts rankings. It doesn't. Hreflang is a routing directive — it tells Google which language version to show which user, not which page should rank higher. Yet its errors are the most common mistake on multilingual sites: audits regularly find incomplete or non-reciprocal annotations on most large properties, and the result is always the same — Google shows a Polish user the English version, conversion drops, and you go looking for the cause in the content, not the header.
Hreflang is not a ranking factor — it's language routing, and its errors are the most common multilingual SEO mistake, which audits find on most large sites. In the AI era there's a second stake: ChatGPT and Perplexity cite different sources for the same question asked in different languages. The complete workshop: three URL architectures, five rules of error-free hreflang, slug translation and multilingual GEO.
In the AI era there's a second stake the classic guides stay silent about: language models treat the query language as a source signal. The same question asked of ChatGPT in Polish and in English returns different citations — because the model reaches for content in the language of the question. Multilingual architecture is therefore no longer just a Google matter; it also decides whether you're visible at all in the Polish and English AI answer.
This post is the complete workshop: what hreflang really is, how to choose a URL architecture, five rules for error-free implementation, slug translation (on our own PL/EN pattern) and multilingual GEO.
What hreflang is — and what it is not
Let's start by separating two things that blur together in people's heads.
Hreflang is not a ranking factor. It doesn't make a page rank higher, doesn't pass "authority", doesn't replace links or content. Google's documentation describes it as a signal, not a binding directive — it can be ignored if the rest of the signals say otherwise.
Hreflang is a map of language versions. For a page available in several languages or regions it tells the search engine: "these are variants of the same content, show the user the right one." The effect isn't in ranking, but in getting the right version to the right user — which saves CTR and conversion, not position.
The two most common symptoms of missing or broken hreflang:
- Wrong version in results. A Polish user sees an English URL, clicks less often, and if they do — they bounce. Google notices and gradually lowers the visibility of the whole section.
- Cross-language cannibalization. Without mapping, Google treats the versions as competing pages on the same topic and picks a "winner" itself — often not the one you want.
Three URL architectures — ccTLD, subdomain, subfolder
Before you touch hreflang, you have to decide where the language versions live at all. It's a decision for years — changing the architecture means a full migration with the risk of losing rankings.
/// THREE MULTILINGUAL URL ARCHITECTURES
A decision for years — changing it means a full migration
| Architecture | Example | When to choose |
|---|---|---|
| ccTLD (country domain) | yourcompany.pl / .de | Strong geo targeting, budget for multiple domains, real in-country presence |
| Subdomain | pl.yourcompany.com | Separate infrastructure per language under one brand, weaker authority consolidation |
| Subfolder (directory) | yourcompany.com/pl/ | The default choice — all domain authority in one place |
For the vast majority of companies — especially those aiming for AI visibility — the subfolder wins. The reason is the same as with crawl budget: one domain accumulates all the authority and all the entity signal, instead of scattering it across separate hosts. A ccTLD makes sense when you genuinely operate locally in a given country (warehouse, support, currency) and can afford to maintain several domains as separate sites. That's exactly our choice on this site: one domain, versions under /pl/ and /en/.
Five rules of error-free hreflang
Hreflang breaks on details. These five rules eliminate most of the problems audits catch on large sites.
/// FIVE RULES OF ERROR-FREE HREFLANG
They eliminate most of the issues audits catch
- 1.Reciprocity. If the PL page points to EN, EN must point back to PL. A one-way annotation is ignored by Google — the most common error in audits.
- 2.Self-referencing. Every version must also point to itself. The PL page lists PL among its own hreflang annotations.
- 3.x-default. Add an hreflang="x-default" entry pointing to the default version (usually English or a language-selection page) for users outside the defined languages.
- 4.Absolute URLs, post-301. URLs in hreflang must be full (with https://) and lead to the final address, not to a redirect. Pointing at a URL that 301s breaks the mapping.
- 5.Canonical alignment. hreflang and canonical must not contradict each other: the PL page's canonical points to itself, not to EN. A conflict is the classic reason Google ignores the whole group.
A correct set for two languages looks like this — the same three links in the head of each version:
<link rel="alternate" hreflang="pl" href="https://yourdomain.com/pl/oferta" /><link rel="alternate" hreflang="en" href="https://yourdomain.com/en/offer" /><link rel="alternate" hreflang="x-default" href="https://yourdomain.com/en/offer" />
Keep the language codes compliant with BCP 47 (ISO 639-1 for the language, optionally ISO 3166-1 for the region): "pl", "en", and if you distinguish regions — "en-GB", "en-US", "pt-BR". Don't invent your own codes; "en-UK" is invalid (correct: "en-GB").
Slug translation — our PL/EN pattern
A frequent question: translate the slug (the part of the URL after the domain), or keep one for all languages? Translate. A slug in the user's language is a relevance signal for the search engine and a higher CTR — an English speaker is more likely to click /en/hreflang-international-seo-geo than /en/miedzynarodowe-seo.
The catch is that translated slugs have to be linked together so hreflang and the language switcher know what maps to what. Our pattern on this site: every post has one numeric identifier, and slugs are translated per language and paired by it. The English counterpart of this post is hreflang-international-seo-geo — a different slug, the same identifier. The language switcher resolves the pair by identifier, not by matching the URL text, so translating slugs breaks nothing.
The same applies to the brand entity: a consistent language architecture strengthens the knowledge graph and entity, because Google and AI models see one brand in many languages, not several unconnected entities.
Multilingual GEO — why AI cites different sources per language
Here begins the part missing from classic hreflang guides. Language models treat the query language as a source filter. Ask ChatGPT for "the best tools for something" in Polish, then in English — you'll get two different citation lists, because the model prefers content in the language of the question.
/// QUERY LANGUAGE = SOURCE FILTER IN AI
Same question, two languages — two different citation lists
- →Cites Polish expert content
- →Polish forums, blogs, trade media
- →Your /pl/ version — if it exists and is strong
- →Cites English-language content
- →Reddit, global media and blogs
- →Your /en/ version — a separate citation pool
Consequences for strategy:
- An EN-only version won't give you visibility in Polish AI answers. If all the expert content is in English, you're invisible in Polish ChatGPT — the model cites competitors' Polish sources.
- Translation is not a machine carbon copy. Models and Google reward content that reads natively and is grounded in local context — examples, currency, market reality. Automatic translation without editing is a low-quality signal.
- The citation-friendly structure works in every language. The rules from the post on optimizing for AI Overviews — answer first, question headings, attributed data — apply to each language version separately.
In other words: hreflang handles the technical side (the right version to the right user), but AI citations are decided by whether you have strong, native content in that language at all.
How to verify the implementation
Before you call it done, check four things:
- Search Console → international targeting and hreflang errors report — shows missing return annotations and invalid language codes.
- Manual test in the page source — open the HTML preview without JS rendering and check whether the hreflang links are in the head. If you inject them with JavaScript, some crawlers won't see them — the same problem as in JavaScript SEO.
- Crawler (Screaming Frog / Sitebulb) — the hreflang report catches non-reciprocal and non-canonical references at the scale of the whole site.
- Per-language AI test — ask the models the same question in Polish and in English and check whether they cite your correct versions. This measures a layer invisible in GA4 — how to set it up I describe in AI traffic analytics.
Step-by-step rollout plan
- 1.Choose an architecture (subfolder for most) and stick to it across the whole site.
- 2.Fix the list of languages and regions and the correct BCP 47 codes — no home-made inventions.
- 3.Generate hreflang programmatically from a single source of truth (an identifier → slug per language map), not by hand per page.
- 4.Add x-default and self-referencing to every group.
- 5.Align canonicals — every version canonical to itself.
- 6.Translate the slugs and pair them by a stable identifier (our pattern).
- 7.Edit the content natively per language — not a machine copy; optimize each version separately for AI citations.
- 8.Verify in GSC, in the source without JS, with a crawler and with a per-language AI test.
- 9.On every migration update hreflang in the same deployment — stale references to old URLs break the mapping.
---
I design multilingual architecture from domain choice to hreflang generated from a single source of truth — as part of technical SEO and AI optimization (GEO). I teach this in the SEO & GEO course. Get in touch — I'll start with an hreflang audit and a language map for AI visibility.
Worth reading next:

SEO & GEO specialist and AI engineer from Białystok. 10 years building search visibility for recognized brands and 3 years delivering AI — agents, automation and LLM integrations (Next.js, React, Node.js).
/// RELATED_SERVICES
Need these concepts implemented? Explore the services related to this topic.
/// SOURCES
- 01Google Search Central – Localized versions of your pages (hreflang, official docs)
- 02Google Search Central – Managing multi-regional and multilingual sites
- 03RFC 5646 (BCP 47) – Tags for Identifying Languages
- 04W3C Internationalization – Language tags in HTML and XML
- 05Google – AI features and your website (official docs)
/// RELATED_RECORDS
How to Measure Traffic from ChatGPT, Perplexity and AI Mode — Analytics for the AI Era (GA4 + Server Logs)
AI traffic converts up to ~4.4× better than classic organic and grew to stores by four digits — yet default GA4 hides it well: some lands in referrals, some in direct, and AI Overviews clicks are indistinguishable from regular Google. The complete measurement workshop: an AI channel group in GA4 with a ready regex, dark AI traffic, the AI Overviews signature in GSC, and server logs as the other half of the picture.
JavaScript SEO — What Googlebot and AI Crawlers Really See Without Rendering
Googlebot renders JavaScript — late and at its own cost. Most AI crawlers never render it at all: Vercel's study showed GPTBot, ClaudeBot and PerplexityBot fetch JS files but don't execute them. How to check in 5 minutes what bots really see, how CSR differs from SSR/SSG/ISR, and how to fix an SPA without rewriting the whole app.
AI Crawlers — Who Scans Your Site and How to Manage It (robots.txt, Pay-Per-Crawl)
GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, Google-Extended — each does something different, and blocking the wrong one means vanishing from AI answers. The complete AI bot map, a robots.txt decision matrix, verifying impersonating scrapers, and the new crawl economy: Cloudflare's pay-per-crawl (HTTP 402) and the RSL licensing standard.
Signal received?
Terminate
Silence
Initiate protocol. Establish connection. Let's build something loud.
