Most teams approaching multilingual SEO start by translating a few pages and worry about architecture later. Twelve months later they are paying a contractor to migrate everything from ?lang=de URLs to a proper subdirectory structure, watching their German organic traffic crater for six weeks during the cutover, and emailing me to ask why. The architecture decision is the most consequential one you will make in a multilingual project, and almost everything else — hreflang, translation workflow, plugin selection — is tactics layered on top of that foundation.
I have implemented multilingual SEO for B2B SaaS companies expanding from English-only into Spanish, German, French, and Portuguese. This guide walks through the decisions in the order you should make them: validate the demand, choose an architecture that will not need rebuilding, get hreflang right the first time, decide your translation workflow, and avoid the mistakes that turn multilingual projects into money pits.
Validate the Demand Before You Build Anything
The most common multilingual mistake is starting the project at all. Teams burn six months and forty thousand dollars translating into three languages, then discover the foreign pages get fewer than 200 visits a month combined. Translation is expensive; maintenance is more expensive. Point to evidence of latent demand before anyone touches a translation memory tool.
Four signals I look for, in order:
- GA4 country segments. If 20% or more of your sessions over the last 12 months come from countries whose primary language is not English, that is a strong signal. Bonus points if those sessions concentrate in two or three countries rather than spreading across thirty.
- Conversion-rate gap by language. Compare conversion rates of English-as-default visitors from non-English-speaking countries against domestic English visitors. A meaningful gap — English-from-Germany converting at 40% the rate of English-from-the-US — suggests language friction is leaving money on the table.
- Support tickets requesting native-language docs. If CS is fielding "do you have this in Spanish?" more than once a month, that is qualitative demand you can later quantify.
- Sales pipeline blocked by language. "Procurement requires German documentation" turns multilingual from a marketing project into a revenue project.
One weak signal: do not commit. Two or more: real opportunity. Translate one language first, measure for six months, then decide on the next.
The Four Architectural Choices
Once you have decided to invest, you choose an architecture. There are four real options. Three of them are defensible depending on your situation. One is a trap.
1. ccTLDs (example.de, example.fr)
Each language gets its own country-code top-level domain. The strongest possible geo-targeting signal and the cleanest separation. Each domain has its own DNS, hosting, SSL, and analytics property — that isolation is the upside and the downside.
You operate what is effectively a separate website per market. Domain authority does not transfer; backlinks earned by example.com do not help example.de rank. ccTLDs are right for enterprises with country-specific legal entities, retailers with localized inventory, and any business where markets are genuinely separate operations rather than one product translated four times.
2. Subdomains (de.example.com, fr.example.com)
Google treats subdomains as essentially separate properties for ranking; expect partial rather than full domain-authority transfer. The upside is operational separation: different stacks per language, hosted in different regions, managed as semi-independent sites without paying for ccTLDs.
I generally do not recommend subdomains for SaaS. The authority-sharing penalty is real, geo-targeting is weaker than ccTLDs, and operational overhead is closer to ccTLDs than to subdirectories. Subdomains make sense when each market has its own product team shipping at different cadences.
3. Subdirectories (example.com/de/, example.com/fr/) — Recommended for Most
One domain, language paths. Every language inherits full domain authority. Backlinks earned by English content help German content rank. One hosting setup, one analytics property (with language as a dimension), one CMS, one team. This is the default for B2B SaaS, content-led SMB, and any business where the product is the same across markets.
The geo-targeting signal is weaker than ccTLDs — you set geography via hreflang and Search Console's international targeting rather than the domain itself — but for most businesses this is the right trade.
4. URL Parameters (example.com/page?lang=de) — Don't
Parameter-based language switching causes problems at every layer. CDN caching gets messy because the same URL serves different content. Analytics segmentation requires custom dimensions. hreflang works in theory but is fragile in practice — many plugins struggle with parameter URLs. Search engines treat the parameter as content variation rather than as a separate page. There is no situation in 2026 where this is the right answer.
Architecture Comparison
| Architecture | Geo Signal | Complexity | Authority Sharing | Cost | Best For |
|---|---|---|---|---|---|
| ccTLD | Strongest | High | None | $$$ per domain | Enterprises, country-specific entities |
| Subdomain | Weak | Medium-High | Partial | $$ shared infra | Operationally independent markets |
| Subdirectory | Weak (set via hreflang) | Low-Medium | Full | $ shared everything | SMB, B2B SaaS, content sites |
| URL parameters | None | Low to set up, high to operate | Full | $ but technical debt | Nothing |
How hreflang Actually Works
hreflang is a markup signal that tells Google: "this URL has equivalent versions in these other languages and regions; please show the right version to the right user." It does not affect rankings directly. It affects which version of an already-ranking URL gets shown in the SERP.
Hreflang doesn't help you rank in another language. It helps Google show the right language to the right user — only after you've already earned the ranking.
Three rules govern correct hreflang implementation:
- Symmetry. Every alternate must reference itself and every other alternate, including itself. If the English page lists German and Spanish alternates, the German page must list English, Spanish, and itself. Asymmetric tags are the most common failure mode and Google's documentation explicitly warns about them.
- Correct codes. Use ISO 639-1 language codes (
en,de,es,fr). Optionally combine with ISO 3166-1 alpha-2 region codes (en-US,en-GB,es-MX). Region codes are case-insensitive but the language-region separator is a hyphen, not an underscore. - x-default. One alternate should be marked
x-defaultto tell Google which version to show when no other rule matches — a French user searching from Japan, for example. This is usually your English version.
You have three places to implement hreflang: HTML <link> tags in the page head, HTTP response headers (used for non-HTML files like PDFs), or sitemap-level annotations in your XML sitemap. For a typical content site, HTML link tags are simplest and easiest to debug. Sitemap-level becomes worth it past a few hundred translated URLs because it is centralized.
The Worked Example
Suppose you run a SaaS site at example.com with a feature page at example.com/blog/feature. You add Spanish and German translations at example.com/es/blog/feature and example.com/de/blog/feature. Each page needs four hreflang tags: itself, the two alternates, and an x-default. Here is what the head of the English version should look like:
<link rel="alternate" hreflang="en" href="https://example.com/blog/feature" />
<link rel="alternate" hreflang="es" href="https://example.com/es/blog/feature" />
<link rel="alternate" hreflang="de" href="https://example.com/de/blog/feature" />
<link rel="alternate" hreflang="x-default" href="https://example.com/blog/feature" />
<link rel="canonical" href="https://example.com/blog/feature" /> The Spanish version's head should contain the same four hreflang tags — pointing at the same three URLs — plus its own canonical:
<link rel="alternate" hreflang="en" href="https://example.com/blog/feature" />
<link rel="alternate" hreflang="es" href="https://example.com/es/blog/feature" />
<link rel="alternate" hreflang="de" href="https://example.com/de/blog/feature" />
<link rel="alternate" hreflang="x-default" href="https://example.com/blog/feature" />
<link rel="canonical" href="https://example.com/es/blog/feature" /> The German version is the same pattern with a German canonical. Notice three things. First, all hreflang URLs are absolute — never use relative paths or fragment URLs. Second, every page references itself in the hreflang block. Third, the canonical for each language version points to itself, not to the English original. Mixing these up is one of the most expensive mistakes I see.
Canonical and hreflang Together
The interplay between rel="canonical" and rel="alternate" hreflang trips up almost every team. Each tag has one job:
- Canonical points within a language. "This URL is the preferred version of this page in this language." The Spanish canonical is the Spanish URL, not the English URL.
- hreflang points across languages. "These URLs are equivalent versions in different languages."
If you canonical /es/blog/feature to /blog/feature, you are telling Google "the Spanish page is a duplicate; only index the English one." Google then drops your Spanish URL from the index. I have audited sites where the entire Spanish tree was canonicalized to English and they wondered why nothing ranked. It was not in the index.
Common hreflang Mistakes
Six mistakes account for the vast majority of hreflang issues I find in audits.
- Asymmetric tags. Page A lists B as an alternate, but B does not list A. Google will likely ignore the entire annotation. Audit symmetry with a tool like Ahrefs Site Audit or Sitebulb — do not eyeball it.
- Wrong region codes. The UK is
gb, notuk. Pan-Spanish pages should useesrather thanes-ESif they target all Spanish speakers; usees-MXonly if you have a Mexico-specific page. Wrong codes are silently ignored. - Conflicting canonical and hreflang. Hreflang points to URL X, canonical points to URL Y. Google interprets the canonical as authoritative and ignores the hreflang. Always make a page's canonical point to itself.
- Missing x-default. Without an x-default, users in unmatched locales get whatever Google guesses. Set x-default explicitly — usually to your English version.
- Relative or fragment URLs.
href="/de/blog/feature"orhref="#"will not work. Use absolute URLs with the protocol:https://example.com/de/blog/feature. - Pointing to redirect targets. If your German page is at
/de/blog/featurebut the English page hreflangs to/de/feature(which 301-redirects), Google may discard the annotation. Always hreflang the final URL, not a redirect.
Translation: Machine, Human, or Hybrid in 2026
The translation question is more interesting in 2026 than it was three years ago because GPT-class models genuinely produce excellent translations for many content types. The right answer depends entirely on what you are translating.
Machine translation alone works well for B2C blog content, FAQs, knowledge base articles, and product documentation in non-regulated industries. The output is typically indistinguishable from competent human translation. It fails on legal text, financial disclosures, healthcare content, and anything where precise terminology matters — the failure mode is plausibly fluent translations with subtle errors only a domain expert catches.
Human translation alone remains right for legal pages, marketing copy hinging on cultural references, anything affecting brand voice, and content where mistakes cause regulatory or reputational risk. Slow and expensive: $0.10 to $0.25 per word for a competent native-speaker translator in a B2B technical domain.
Hybrid — AI first draft followed by a native-speaker editor pass — is what I recommend for most programs. You get the speed and cost benefits (60-80% cheaper than full human translation) while keeping a domain-fluent native speaker as the quality gate. The editor's job is not to retranslate but to catch idiom mistranslations, terminology inconsistency, register shifts, and cultural awkwardness. This is also where you build a translation memory and term glossary that improves over time.
Whatever you choose, do not publish raw machine translation as final on critical pages. The cost of looking unprofessional in your fastest-growing market dwarfs the marginal cost of the editor pass.
Handling Partial Translations
You will rarely translate the entire site in one shot. The question is what to do during the months when some content is translated and some is not.
The wrong answer is publishing stub pages with hreflang pointing at them — "translation coming soon" or auto-machine-translated placeholders sitting in the index. Google indexes these, ranks them poorly, and your German users land on broken-feeling pages. Two better approaches:
- noindex incomplete translations until they are ready. The pages exist, internal navigation works, but search engines do not index them. When the content reaches publication quality, remove noindex and add hreflang.
- Restrict hreflang to translated pairs only. If your English blog has 200 posts and you have translated 60 into Spanish, only the 60 pairs get hreflang annotations. The other 140 English posts stand alone with no Spanish alternate, and Spanish users searching for those topics see the English version — which is better than seeing a stub.
URL Slug Localization
Should /blog/multilingual-strategy become /de/blog/mehrsprachige-strategie, or stay /de/blog/multilingual-strategy? There is a real debate here.
Localized slugs send a stronger relevance signal to users and search engines. A German user is slightly more likely to click a German URL than an English one, and the slug contributes to keyword relevance for German search queries. The downside is operational: redirects multiply (the original slug, the localized slug, every variant), analytics URLs get harder to read for English-speaking analysts, and your CMS needs to handle slug-per-language cleanly.
My rule of thumb: localize slugs for B2C and consumer blog content, where the SEO and user-experience benefit is real and the editorial team usually speaks the target language. Keep English slugs for B2B technical content, where readers often search in English even when they prefer reading the body in their native language, and where engineering teams need URL stability for redirects, analytics, and tooling.
WordPress Plugin Comparison
The plugin choice is less consequential than the architecture choice but still matters. Four plugins dominate the WordPress multilingual space.
| Plugin | Pricing | Architecture Support | Strengths | Weaknesses | Best For |
|---|---|---|---|---|---|
| Polylang | Free / Pro $99-199/yr | Subdirectory, subdomain | Lightweight, strong free tier, clean data model | Occasional REST API rough edges, fewer integrations | Most content sites, blogs, B2B SaaS |
| WPML | $39-199/yr | All four (including ccTLD) | Most comprehensive, string translation, WooCommerce integration | Heavier, more complex, more expensive at scale | Ecommerce with WooCommerce, complex sites |
| TranslatePress | Free / Pro $99-249/yr | Subdirectory | Visual front-end editor, easy for non-developers | Less flexible data model, weaker for large sites | Small sites, marketing teams without developer support |
| MultilingualPress | $199+/yr | WP Multisite (each language is a subsite) | True content separation, scales to many languages | Requires multisite, infrastructure heavier | 5+ language enterprises, agencies |
My defaults: Polylang for most content sites, WPML when you have WooCommerce and need its catalog and checkout translation, MultilingualPress when you are managing five-plus languages at enterprise scale and need genuine subsite isolation.
Structured Data per Language
Each language version should ship its own JSON-LD with the inLanguage property set correctly ("inLanguage": "de" on the German page). Article, FAQ, and breadcrumb schema all support it. Do not copy English JSON-LD onto translated pages — German content tagged as English in the rich-results signal can suppress rich-result eligibility in the target locale.
Sitemap Structure
For sites under a few hundred translated URLs, a single XML sitemap with hreflang annotations works fine. At scale, split into per-language sitemaps referenced from a sitemap index: sitemap.xml indexes sitemap-en.xml, sitemap-de.xml, sitemap-es.xml. Each per-language sitemap is smaller, easier to debug, and easier to regenerate independently. Submit the index to Search Console, not each language sitemap separately.
Common Mistakes Beyond hreflang
Six mistakes I see beyond the hreflang failures already covered:
- Building multilingual without first checking GA4 segments. Translating into a market that does not have demand. Validate before you commit.
- Using
?lang=URL parameters. Covered above. The single worst architectural choice. - Translating UI strings but leaving images and screenshots in English. A German user reading a German tutorial then sees an English screenshot and the experience breaks. Localize the visuals or commit to keeping them in English consistently.
- No plan for content drift. The English version gets updated; the German and Spanish versions do not. After a year, your translated content is meaningfully different from your canonical content. Set a process: when English content is materially updated, translation tickets are created automatically.
- Forgetting language-aware internal linking. Internal links from German pages should go to other German pages, not jump back to English. Audit and fix.
- Letting hreflang become stale. URLs change, redirects accumulate, hreflang annotations point to dead targets. Audit hreflang at least quarterly with a crawler that flags broken alternates.
Practical Wrap-Up
Three takeaways. First, validate demand with GA4, support tickets, and pipeline data before committing a dollar to translation; the worst version of multilingual is the one no one uses. Second, choose subdirectory architecture unless you have a specific reason otherwise — ccTLD for country-specific entities, MultilingualPress for five-plus languages at scale, subdomain rarely, URL parameters never. Third, get hreflang symmetric, absolute, self-canonical, and complete with x-default before launch — broken hreflang is worse than none.
Default translation workflow in 2026 should be AI first draft plus native-speaker editor pass, except for legal and high-stakes content. Plan for content drift before launch, not after. Audit hreflang quarterly the way you audit sitemaps. The teams that succeed at multilingual SEO are the ones that made the architecture decision once, carefully, and never had to redo it.