Back in 2021, a mid-size e-commerce client came to Seahawk after their German store had been live for eight months. Eight months. Their UK site was ranking beautifully. The German version? Practically invisible in Google.de. We audited it and found the problem inside twenty minutes: their developer had implemented hreflang tags pointing to URLs that didn't exist anymore after a migration. Google had been reading conflicting signals for the better part of a year. Their organic traffic from Germany was about 4% of what it should have been.
That kind of quiet disaster is exactly what international SEO is full of. It doesn't blow up loudly. It just slowly bleeds.
So let me tell you what I've learned building and fixing international sites across 40-plus countries, including what actually works, what the docs don't tell you, and the specific mistakes I see constantly.
---
The Three Domain Structures (and When to Use Each)
This is the first decision and it's also the most permanent one. Getting it wrong costs you months, sometimes years.
Your options are country-code top-level domains (ccTLDs, like .de , .fr , .com.au ), subdomains ( de.example.com ), or subdirectories ( example.com/de/). That's it. There is no secret fourth option.
ccTLDs
A ccTLD gives you the strongest geographic signal. Google knows example.de is for Germany. No configuration required. But you're also starting from scratch with domain authority on every new ccTLD. If you're launching in five countries simultaneously, you're building five separate authority profiles. That takes serious link-building budget and time.
I'd recommend ccTLDs when the business genuinely operates as separate local entities in each country, the brand has budget to invest in each domain long-term, and local trust signals matter (financial services, healthcare, government-adjacent work). Otherwise, you're fighting an uphill battle you didn't need to climb.
Subdirectories
Honestly, for most clients I work with, example.com/de/ is the right answer. You keep all your domain authority consolidated. The signals you've built over years on the root domain flow through. Google has explicitly stated that subdirectories work perfectly well for international targeting.
The tradeoff is that you need to do more work to establish geographic relevance. That's where hreflang and GSC geo-targeting come in.
Subdomains
Subdomains are fine but I find them messy in practice. They behave closer to separate sites from a crawl perspective. I've seen crawl budgets take a hit when a client had eight language subdomains and a bot that wasn't treating them efficiently. Unless there's a specific technical or CMS reason to use them, I steer people away.
---
hreflang: The Part Everyone Gets Wrong
I am going to say something that sounds dramatic but is completely accurate: hreflang is one of the most error-prone things in all of technical SEO. The spec itself is clear enough, but implementation has about fifteen different ways to break.
The Self-Referential Tag Is Not Optional
Every page needs an hreflang tag pointing to itself. This trips up maybe 40% of the developers I work with who are implementing this for the first time. You can't just list the alternate language versions. The current page must reference itself.
`` <link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/product/" /> <link rel="alternate" hreflang="de" href="https://example.com/de/product/" /> <link rel="alternate" hreflang="fr" href="https://example.com/fr/product/" /> ``
The en-GB tag on that first line? That page is referencing itself. Miss it and Google may not process the cluster correctly.
Bidirectional or Bust
Every hreflang relationship has to be reciprocal. If your English page points to your German page, the German page must point back to the English page. Google treats unpaired tags as errors and largely ignores them.
I've seen developers implement hreflang only on the "main" language and wonder why rankings don't improve. The full relationship graph has to be declared on every node.
Language Codes vs. Region Codes
hreflang="de" means German, any region. hreflang="de-DE" means German as used in Germany. hreflang="de-AT" means German as used in Austria. If you serve the same German content to both Germany and Austria, you might use de as a catch-all. But if you have genuinely localised variants, be explicit.
Where this bites people: using en when they mean en-GB, then wondering why the US site is getting UK traffic. These are not the same tag.
The x-default Tag
Add hreflang="x-default" pointing to your fallback URL (usually the English homepage or a language selector page). This tells Google what to serve when no other hreflang variant matches a user's language/region. Lots of sites forget this. It's not catastrophic but it is a gap.
---
Common Mistakes I've Seen on Real Projects
Let me just run through the ones I encounter most. No padding.
- Hreflang tags pointing to redirects. Your hreflang URLs must be the canonical, final destination URLs. If
example.com/de/redirects toexample.com/de/home/, your hreflang tag should point to the latter. - Inconsistent trailing slashes.
example.com/de/andexample.com/deare technically different URLs. Pick one and be consistent across every hreflang tag and canonical. - Implementing hreflang in the XML sitemap but not in the HTML head. Both are valid delivery methods, but mixing them inconsistently across a site causes confusion. Pick one method and do it everywhere.
- Geo-targeting in GSC not set. For subdirectory or subdomain structures, you need to set your geo-target inside Google Search Console. Going into GSC and selecting a country target in the "International Targeting" report is a five-minute job that a surprising number of teams skip entirely.
- Translating only the body content, not the metadata. Your
<title>, meta description, and even your URL slugs should be localised. Translated content with English metadata is a hybrid mess that confuses both users and bots. - No localised link-building. This one isn't a technical mistake but it kills international rankings just as effectively. Domain authority doesn't automatically transfer meaning to a German audience. You need links from German-language, Germany-relevant sources.
---
Canonical Tags and How They Fight with hreflang
Here's something that trips up even experienced developers. Canonical tags and hreflang tags have to be in agreement. If page A has an hreflang tag pointing to page B as the German variant, but page B has a canonical pointing back to page A, you've created a loop. Google will see the canonical and assume B isn't the real version, which makes the hreflang signal largely pointless.
Seahawk had a SaaS client in 2022 with exactly this problem. Their CMS was auto-generating canonicals that all pointed to the English root. Every localised page. All canonicalling to English. The hreflang was technically valid but the canonicals were telling Google to ignore everything except the English version. Three months of wasted effort.
The rule: each localised page should have a self-referencing canonical pointing to its own URL, not to the primary language version.
---
How Google Actually Processes This (and What It Won't Tell You)
Google doesn't guarantee it will follow your hreflang tags. I want to be upfront about that. It's a hint, not a directive. Google says this explicitly in its own documentation. What this means practically is that if your content isn't genuinely localised (just English with a /de/ prefix and machine-translated body text), Google may still serve the "wrong" version because its own language detection disagrees with your tags.
Good hreflang implementation amplifies good localisation. It doesn't replace it.
The other thing: hreflang doesn't affect rankings in the primary search index. It affects which URL gets shown to which user in which country. Your German page still needs to rank for German queries on its own merit. hreflang just makes sure the right page appears for the right audience when you've already earned the ranking.
Use Aleyda Solis's hreflang tag generator if you're building these manually. It's the tool I point juniors to first. And run your implementation through Merkle's hreflang testing tool after the fact to catch errors before Google does.
---
Content Strategy Across Markets (the Bit Most Posts Skip)
Technical setup gets all the attention. But I've seen sites with perfect hreflang, correct canonicals, and well-configured GSC properties that still don't perform internationally. Why? Because they took their English blog content, translated it word-for-word, and called it localised.
German audiences search differently than British ones. "Running shoes" in the UK might be "Laufschuhe" in Germany, sure, but the intent behind the query, the format that performs well, the specifics of what people want to read, all of that differs too. You need keyword research done in the target language, by someone who actually uses that language, not a translation layer on top of English research.
A few things that actually move the needle on international content:
- Research local SERPs in a browser using a VPN or Google's country-specific search URLs
- Check competitor content in the target country, not your UK or US competitors
- Adapt examples, pricing, cultural references. A post full of dollar signs doesn't land in Germany.
- Build local backlinks before or alongside your content push, not six months after
---
When to Use a CDN or Hosting Location
Does server location matter for international SEO? Less than it used to, honestly. With CDNs like Cloudflare in front of your site, your server's physical location matters almost nothing. Cloudflare's edge nodes will serve content from wherever is geographically closest to the user anyway.
What still matters: page speed in the target region. Run your site through PageSpeed Insights and specifically check your Core Web Vitals for mobile users in your target market. I've seen UK-optimised sites that were beautifully fast domestically but loaded in 6 seconds in Australia because their image CDN had no edge presence there. That kills rankings independently of everything else.
---
FAQ
Does hreflang affect Google rankings directly?
No. hreflang tells Google which version of a page to show to which audience, it doesn't boost rankings. The ranking itself is determined by the usual factors: relevance, authority, on-page signals. Think of hreflang as routing, not ranking.
Can I use hreflang with a WordPress multisite?
Yes, and it's actually one of the cleaner setups when done right. Plugins like WPML or Polylang handle hreflang generation automatically, though I always audit their output because auto-generated tags occasionally have the self-referential or bidirectionality issues mentioned above. Don't assume the plugin did it perfectly. Check it.
How do I check if my hreflang is working?
Pull your pages in Google Search Console under the "International Targeting" report and look for errors. Also fetch individual pages with the URL Inspection tool to see what tags Google has actually indexed. And use Screaming Frog's hreflang tab during a full crawl. That gives you the full picture: missing reciprocal pairs, broken URLs, language code errors.
Do I need separate sitemaps for each country or language?
Not strictly required, but it's cleaner. If you're using subdirectories, a separate XML sitemap per language that's submitted individually inside GSC makes crawl management easier, especially as the site grows. A single sitemap works too, as long as every hreflang URL is included.
What's the single most common hreflang mistake?
Missing self-referential tags. Every time. I've audited probably 200 international sites in the last four years and it's the error I find most consistently, usually because the developer read a simplified tutorial that didn't mention it. Second place goes to implementing hreflang on the HTML pages but forgetting to update the XML sitemap version (or vice versa) after a URL migration.
---
International SEO is genuinely one of the areas where getting the boring technical details exactly right separates sites that grow globally from sites that spin their wheels for years. The concepts aren't mysterious. The execution just requires more precision than most people expect going in. Get the domain structure right first. Then build hreflang carefully and validate it. Then do the actual localisation work. In that order.
That German client I mentioned at the start? We fixed the hreflang, cleaned up the canonicals, and got them proper German-language links from local industry sites. Within four months they were pulling 60% of the traffic their UK site got. Not bad for a market they'd been invisible in.