International SEO breaks in the same handful of ways on almost every multi-market site I’ve touched, and it’s rarely the translation that’s the problem. This post covers the two decisions that actually determine whether a multi-country or multi-language site ranks the way it should: how you structure your URLs, and whether your hreflang setup is actually confirmed rather than just present. I’ve spent most of the last six years untangling exactly this on iGaming, fintech, and SaaS sites running in a dozen-plus markets at once, and the same three mistakes show up almost every time.
What International SEO Actually Means (Beyond Translating the Page)
International SEO gets treated as a checkbox: translate the page, ship it, done. That’s not what search engines need from you, and it’s not what actually determines whether the page ranks. The real problem international SEO solves is confirming which page is meant for which market and language – to Google, and to the visitor who lands on it from a country-specific search.
Translation is a content problem. International SEO is a technical and structural problem that happens to also require translated content. You can ship a perfectly translated German page that never ranks in Germany because nothing on the site tells Google it exists, or because it’s quietly competing against your own English page for the exact same query.
This distinction matters most in regulated or price-sensitive verticals. A licensing disclaimer that’s legally required in one market and irrelevant in another, a payment-method list that only makes sense locally, a regulatory term with no exact translation – these are the details that separate a page search engines trust for a market from one that just happens to be in the right language.
Geotargeting signals compound, too. A page’s URL structure, its hreflang cluster, its currency and payment methods, and even its internal links all point the same direction when international SEO is done properly – toward one specific market. Get one of those signals wrong and you don’t necessarily lose the page entirely, but you make Google’s job of matching it to the right searcher noticeably harder, and Google tends to default to whatever’s easiest for it when signals conflict.
Choosing a URL Structure: ccTLD vs. Subdomain vs. Subdirectory
Before hreflang, there’s a structural decision that’s much harder to undo later: how you split your markets across URLs. Google’s own documentation on managing multi-regional sites lays out several options, and the tradeoffs between them are concrete enough to compare directly.
| Structure | Example | Geotargeting Signal | Practical Cost |
|---|---|---|---|
| ccTLD | example.de | Strongest – explicit country signal, server location irrelevant | Highest – separate domain per market, link authority built from zero each time |
| Subdomain | de.example.com | Moderate – ambiguous whether it signals language or country | Low – flexible server locations, simple to spin up |
| Subdirectory | example.com/de/ | Moderate, relies on hreflang to clarify targeting | Lowest – single domain, shared authority, easiest to maintain |
For most multi-market sites without a dedicated local entity or a hosting requirement, a subdirectory paired with correct hreflang gets you the same practical targeting outcome as a ccTLD, without fragmenting domain authority across a dozen separate properties. I’ve moved iGaming clients off ccTLD-per-market setups into subdirectories more than once, specifically because the ccTLDs were bleeding link equity that nobody was actively building for each one.
URL parameters (a query string like ?loc=de) are the one option Google’s own documentation actively discourages, and I’ve never seen a real reason to choose them over a subdirectory. They’re harder to segment cleanly in analytics, and they send a weaker, more ambiguous geotargeting signal than any of the three URL-based options above.
The subdomain option deserves a specific warning: I’ve audited sites where de.example.com was meant to signal the German market, but the content was still in English for a while during a phased rollout, and Google had no reliable way to tell whether the abbreviation meant a language, a country, or nothing in particular. A subdomain without matching hreflang and matching content language is close to worthless as a targeting signal – it looks organized to a human visitor and communicates almost nothing to a crawler.
Hreflang: What It Actually Does (and the Three Ways to Implement It)
Hreflang is an annotation, not a redirect, and not a ranking factor on its own. It only tells Google which URL to surface to a searcher whose language or region matches – it doesn’t change how well any individual page ranks by itself. Get the annotation wrong and Google keeps ranking your pages exactly as it would without it; it just serves the wrong one to the wrong audience.
Each annotation needs a language code (ISO 639-1, so en, de, es) and, optionally, a region code (ISO 3166-1 Alpha-2, so en-GB, es-MX). Google’s own hreflang documentation is explicit that specifying a region code alone, with no language code, isn’t valid syntax at all. The optional x-default value is for a language-selector or gateway page – somewhere to send a visitor whose settings don’t match any of your localized versions. Skipping it isn’t wrong, but it’s a missed chance to control that fallback deliberately instead of leaving it to Google’s guess.
Google supports three equivalent implementation methods: <link> tags in the HTML <head>, HTTP response headers (the only practical option for non-HTML files like PDFs), and <xhtml:link> entries in an XML sitemap. All three carry the same weight with Google. In my experience the sitemap method is the easiest to maintain past a few dozen pages, because it centralizes every relationship in one file instead of bloating every page’s own <head> with a growing list of alternates.
The Region-Code Mistake Almost Every Multi-Market Site Has
This one is small, specific, and shows up constantly in audits: “UK” is not a valid hreflang region code, even though it’s the abbreviation everyone actually uses in conversation. The correct ISO 3166-1 Alpha-2 code for the United Kingdom is GB, so British English targeting has to be written as en-GB, not en-UK.
Google’s documentation calls this out directly, alongside two other invalid codes I still see in production: EU and UN aren’t real country codes either, because the European Union and the United Nations aren’t countries. Any hreflang annotation using one of these three gets ignored by Google outright – not flagged, not partially honored, just silently dropped from consideration.
The reason this mistake is so persistent is that it doesn’t break anything visibly. The page still loads, the site still functions, and nobody notices until they’re specifically auditing hreflang output against the ISO code list rather than trusting whatever a developer typed based on how people actually abbreviate the country.
The one that catches even experienced teams off guard is es-419, the UN’s own macro-region code for Latin American Spanish and a value plenty of platforms use elsewhere in their stack. Google’s hreflang documentation names it specifically as unsupported, since only real ISO 3166-1 Alpha-2 country codes are valid – which means a site targeting “Latin America” as a single hreflang value has to pick actual countries instead, or fall back to a language-only es tag without a region.
The Reciprocal Confirmation Mistake (Why Half of Hreflang Setups Get Ignored)
This is the single most common hreflang failure I run into, and it’s invisible unless you specifically check for it. Hreflang requires reciprocal confirmation: if your English page points to your German page, the German page has to point back, or Google ignores the entire pair. Not a partial credit, not a guaranteed warning – just silently dropped.
This happens constantly on sites where markets get added incrementally. Someone launches a new locale, adds hreflang tags pointing outward from the existing pages to the new one, and the new page’s own template doesn’t yet include the tags pointing back. The new market’s hreflang does nothing until both sides agree, which means the investment on the older pages was wasted for that specific relationship the whole time it stayed one-directional.
The fix isn’t complicated, it’s just tedious at scale: every hreflang set needs to be internally consistent, and every page in the set should also list itself. That self-reference rule catches its own class of bug – a page that lists every other locale correctly but forgets to include itself in its own cluster.
Auditing Hreflang at Scale (The Part Beginner Guides Skip)
Manually checking reciprocal hreflang pairs works fine for four or five locales. It falls apart completely on a sportsbook or casino platform running fifteen or twenty country-language combinations across thousands of URLs, which is a normal catalog size in iGaming. At that scale, hreflang needs to be generated and audited programmatically, not proofread page by page.
Google’s own hreflang documentation is unusually specific about this: it names exactly two third-party tools worth using for the job, while explicitly noting neither is maintained or checked by Google itself. One of the two is Aleyda Solis’s site, which offers a dedicated hreflang tags generator that accepts bulk CSV uploads rather than one URL at a time – a design choice that assumes, correctly, that anyone using it seriously is dealing with more URLs than they should reasonably hand-check.
I use the same bulk-validation logic on any site past a few dozen localized pages: export every hreflang cluster into a spreadsheet, then programmatically flag any pair that doesn’t confirm back before anything ships. The failure mode at real scale isn’t a wrong hreflang tag, it’s a missing one – a page that got added to twelve of thirteen reciprocal relationships during a migration or template change, with the thirteenth only surfacing weeks later when rankings for that one market quietly dropped.
This isn’t a one-time setup task either. Every time a market gets added, a template changes, or pages get pruned or merged, the hreflang clusters touching those pages need re-validating – not just the new pages themselves. I schedule this as a recurring check on any site above roughly fifty localized URLs, on the same cadence as a technical crawl, rather than treating hreflang as something you configure once during launch and never look at again.
Hreflang on JavaScript-Rendered Sites (Where SaaS and Fintech Usually Get This Wrong)
Most of the iGaming platforms I work on are server-rendered, which makes hreflang straightforward to inject. Most of the SaaS and fintech sites I work on are built on a JavaScript framework, and that’s where hreflang implementation quietly breaks in a completely different way than anything above.
If hreflang tags are injected client-side by JavaScript after the initial page load, Googlebot has to actually render the page before it can see them – and that rendering step isn’t instant or guaranteed to happen the same way every crawl. A hreflang cluster that’s technically correct in the rendered DOM can still be effectively invisible to Google for longer than a team expects, especially on a large site where render budget gets rationed across thousands of URLs.
The fix I push for on every JS-framework site is the same one that fixes most other JS-SEO problems: server-side render the hreflang tags directly into the initial HTML response, the same way the URL structure and canonical tag are handled, instead of leaving them to a client-side script. If a full server-render isn’t feasible, prerendering just the <head> block for crawlers closes most of the gap without touching the rest of the JavaScript application.
Canonical Tags and Hreflang: Where They Actually Overlap
This is a genuinely common point of confusion, and Google’s own guidance is narrower than most people assume. Canonical tags and hreflang aren’t solving the same problem, and they only need to work together in one specific scenario: when two regional URLs show near-identical content in the same language – Google’s example is a US and a German-hosted page that both show the same German-language content.
In that same-language, different-region case, Google’s documentation recommends picking a preferred version, canonicalizing the duplicate to it, and still using hreflang to route the right regional URL to the right searcher. What it does not recommend, and what I still see broken on client sites, is canonicalizing a translated page back to its source-language original – that tells Google to drop the localized version from the index entirely, which defeats the entire purpose of translating it in the first place.
The practical rule I follow: every genuinely different-language localized page gets a self-referencing canonical, full stop. Canonical consolidation across regions is reserved specifically for same-language duplicates, never for language pairs.
I’ve seen the cross-language mistake happen most often after a CMS migration, when a plugin or template default quietly applies a single canonical URL sitewide instead of a per-locale one. The symptom is specific enough to be diagnostic on its own: a market’s localized pages stop appearing in that market’s search results almost overnight, while the source-language page’s rankings look completely unaffected, because as far as Google’s concerned the localized URLs were never meant to be indexed at all.
Content Localization vs. Straight Translation
A straight machine translation and a genuinely localized page aren’t the same asset, and search systems increasingly treat them differently. A translated page that keeps a source market’s examples, currency, and cultural references reads as thin and slightly off to a local visitor, and over time that shows up in the engagement signals search engines are watching.
Localization means the currency, payment methods, contact details, and even the examples used change to match the target market, not just the words. A fintech page describing “typical monthly fees” needs different numbers entirely in a market with a different average income and different regulatory fee caps, not a translated sentence with the same figure and a different currency symbol attached.
This is also where duplicate-content risk actually lives in international SEO. Two pages that are word-for-word translations of each other, with only the language swapped, sit close enough to duplicate from a ranking-signals standpoint that hreflang alone won’t rescue them if the underlying content gives a local visitor no real reason to prefer it.
Structured data needs the same market-specific adaptation as the visible content, and it’s the part I see skipped most often. A Product or Offer schema block that lists a price in the wrong currency, or a LocalBusiness block with an address format that doesn’t match local conventions, sends a mismatched signal even when the visible page copy is perfectly localized. I’ve detailed how I approach structured data implementation more generally – the same principle applies here: schema should describe the page as accurately as the prose does, per market, not just once for the whole site.
Real Multi-Market Breakage Patterns From iGaming, Fintech, and SaaS Work
The mistakes above show up differently depending on the vertical, and the pattern is consistent enough across clients that I can usually guess which industry I’m auditing within a few minutes. Every vertical I’ve worked in eventually hits the same root cause: a page got localized once at launch and never revisited as the market’s regulations, pricing, or competitors changed.
iGaming operators duplicate almost everything except the licensing block per market, then wonder why two nearly-identical pages compete against each other in the same country’s results. I’ve written separately about the licensing-page duplication issue that shows up constantly in iGaming SEO – the short version is that a copy-pasted page with one swapped paragraph isn’t a localized page, it’s a duplicate with cosmetic differences.
Fintech sites hit a different wall: regulatory language that genuinely can’t be a straight translation, because the underlying regulation itself differs per market. I’ve covered the regulatory-content problem I’ve run into repeatedly on fintech SEO work on sites where the compliance team required different disclosure language per country, which meant the “translated” pages needed real rewriting, not localization, before they could rank safely at all.
SaaS is the vertical where I see the most avoidable damage: pricing pages localized by currency symbol alone, with no adjustment for local payment norms, tax display conventions, or even which competitors get named in the copy. The pricing-page localization mistakes I keep running into across SaaS SEO work usually cost a client credibility with buyers researching a purchase, not just rankings – a currency-symbol swap that doesn’t also fix VAT-inclusive pricing display reads as untrustworthy to a European buyer specifically.
A Practical International SEO Checklist
Everything above compresses into a short list I actually run through before calling an international setup done:
- URL structure decided before launch – ccTLD, subdomain, or subdirectory, chosen based on whether there’s a local entity or hosting requirement that justifies a ccTLD’s cost.
- Hreflang implemented through one method only – HTML head tags, HTTP headers, or an XML sitemap, not a mix that’s harder to audit consistently.
- Every hreflang cluster self-references – each page lists itself alongside every other locale in its own set.
- Reciprocal confirmation checked programmatically, not spot-checked by hand past a handful of locales.
- Region codes verified against the real ISO list – no
en-UK, noEU, noUN, noes-419. - x-default set on the language-selector or gateway page, so visitors with no matching locale land somewhere deliberate.
- Content adapted, not just translated – currency, payment methods, regulatory language, and examples all changed to match the market.
- Canonical tags reserved for same-language regional duplicates, never pointed cross-language back to a source version.
Conclusion
If I had to pick the one place most international SEO setups actually fail, it’s not the URL-structure debate everyone argues about first – it’s the reciprocal hreflang confirmation nobody checks again after launch. Get the URL structure reasonably sensible and get hreflang confirmed on both sides of every relationship, and international SEO stops being the mysterious underperformer it usually gets blamed for being. Everything else in this post is refinement on top of those two decisions, not a substitute for getting them right first. If you only fix one thing after reading this, make it the reciprocal check – it’s the cheapest audit on this list and the one most likely to be silently broken right now.

Dimitar Kondev is an SEO expert working on the International iGaming market with more than 6 years of experience.

