The short version
- Two separate decisions: URL structure (ccTLD, subdomain or subdirectory) and hreflang annotation. They are often conflated.
hreflangdoes not affect rankings. It tells search engines which version to show to which audience.- Subdirectories (
example.com/de/) are the usual default — cheapest, and they consolidate domain signals. - The commonest failure is non-reciprocal hreflang. Every version must reference every other, including itself.
International SEO is one of the few areas where the implementation is genuinely difficult rather than merely tedious, and where getting it wrong produces confusing symptoms — the German page ranking in the UK, the US page shown to Australians, duplicate content warnings across versions that are supposed to be duplicates.
Separating the two decisions makes it tractable. First, where do the different versions live? Second, how do you tell search engines which is for whom?
Decision one: URL structure
For most businesses, subdirectories. They keep everything on one domain, so authority earned in any market supports all of them, and they are the cheapest to run. ccTLDs earn their cost when local presence is genuinely commercially important — a brand where German customers would hesitate to buy from a .com.
Decision two: hreflang
Hreflang tells search engines that several URLs are equivalent versions for different languages or regions, so the right one is shown to the right audience. It does not improve rankings; it prevents the wrong version being served and helps avoid versions competing with each other.
<link rel="alternate" hreflang="en" href="https://example.com/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />- Reciprocity is mandatory. If the English page lists the German one, the German page must list the English one. Non-reciprocal annotations are ignored.
- Self-reference. Each page must include an hreflang entry pointing at itself.
- Use absolute URLs, always.
- Language code first, region optional —
defor German,de-ATfor German in Austria. Region alone is invalid. - Add `x-default` for the fallback shown when nothing matches.
- Keep canonicals self-referential. A canonical pointing at a different language version cancels the hreflang entirely.
The last point causes more silent failures than any other. A German page canonicalised to the English version tells search engines the German page should not be indexed at all — which defeats the entire exercise while looking correct in a template.
The content question underneath the technical one
Hreflang and URL structure are solvable engineering problems. The harder question is whether you have genuinely different content for each market or the same content in different languages — and the two need different treatment.
Machine-translated pages with no local adaptation tend to underperform regardless of how correct the annotation is, because they read as translations and answer the wrong version of the question. Prices, regulations, examples and terminology often differ by market in ways a translation does not capture. Google’s guidance on people-first content applies in every language, and a technically immaculate hreflang setup pointing at content nobody in that market wants is an expensive way to be correct.
Two operational details cause disproportionate trouble. Automatic redirection based on a visitor’s IP address will send crawlers to a single version and can prevent the others being indexed at all — offer a suggestion banner instead of a forced redirect. And Search Console treats each structure differently: a ccTLD is a separate property, subdirectories share one, which affects how you monitor performance per market and is worth deciding deliberately rather than discovering later.
Validate it — you will not see the errors otherwise
Crawl with Screaming Frog, which reports hreflang errors including missing reciprocity and missing self-references. Check the international targeting reporting in Search Console too. Hreflang mistakes produce no visible symptom on the page — the only way to find them is to look.