Live · status OK
Back to blog
SEO & AEO14 min

Multilingual SEO and hreflang in practice: 11-language experience guide

TL;DR

Multilingual SEO fails in 70% of cases due to lack of reciprocal hreflang or inconsistent URL architecture. Stack 2026: URLs with /lang/ subfolder (no geographic domains except in specific cases), hreflang in Next.js Metadata + sitemap, x-default for fallback language, human translations (not automatic) on the 50 priority pages, content adaptation per market. Our optionweb.dev site has been operating in 11 languages in production for 18 months.

Julien Daniel
ByJulien Daniel
Founder & CTO, OptionWeb
Share
Globe with arrows linking 11 country flags for multilingual SEO

Our optionweb.dev site has been running in 11 languages for 18 months — FR, NL, EN, DE, ES, IT, PT, SQ, AR, MK, TR. This production rollout made us discover all the multilingual SEO pitfalls that no theoretical guide mentions. Here is the complete experience report and the methodology we now apply on all international client projects at OptionWeb.

1. URL architecture: subfolder vs subdomain vs ccTLD

Three architecture options for a multilingual site. The initial choice impacts everything else:

ArchitectureExampleAdvantagesDisadvantages
Subfoldersite.com/fr/, /en/1 domain = shared equity, simple to configureNo strong geographic signal
Subdomainfr.site.com, en.site.comSeparable DNS configuration, local teamsBacklink equity partially separated
ccTLDsite.fr, site.be, site.deMax geographic signal, local brandingDomain cost + infrastructure × N countries

Recommendation 2026: subfolder /lang/ for 90% of SMEs and companies. That's our choice on optionweb.dev. ccTLD only if you are Amazon or IKEA.

2. Hreflang: reciprocity is non-negotiable

Hreflang is the meta tag that tells Google which version of the page to serve to which user according to their language/country. Without correct hreflang, Google ranks only one version (usually EN) and ignores the others = massive loss of international traffic.

Absolute rule: reciprocity. If /fr/ points to /en/, then /en/ must point back to /fr/. Without reciprocity, Google ignores ALL hreflang on the page.

app/[lang]/page.tsxtsx
export async function generateMetadata({ params }: Props): Promise<Metadata> {
  const { lang } = params;

  return {
    title: t('home.title', { lng: lang }),
    alternates: {
      canonical: `https://optionweb.dev/${lang}`,
      languages: {
        'fr': 'https://optionweb.dev/fr',
        'nl': 'https://optionweb.dev/nl',
        'en': 'https://optionweb.dev/en',
        'de': 'https://optionweb.dev/de',
        'es': 'https://optionweb.dev/es',
        'it': 'https://optionweb.dev/it',
        'pt': 'https://optionweb.dev/pt',
        'sq': 'https://optionweb.dev/sq',
        'ar': 'https://optionweb.dev/ar',
        'mk': 'https://optionweb.dev/mk',
        'tr': 'https://optionweb.dev/tr',
        'x-default': 'https://optionweb.dev/en',
      },
    },
  };
}

Hreflang code format: ISO 639-1 (language, e.g. 'fr') OR ISO 639-1 + ISO 3166-1 (language-country, e.g. 'fr-BE'). The language-country format targets a specific market. Using only the language is enough in 90% of cases.

3. x-default and language fallback

The x-default attribute indicates the version to serve if the user's language is not in the hreflang list. It's your SEO 'lifeguard': without x-default, a Japanese user arriving on your multilingual site sees a random page according to Google's algorithm.

Best practice: point x-default to the most universal fallback language (often EN), or to a language selection page if you have one.

4. Multilingual sitemap or sub-sitemaps

Two approaches according to volume:

  • Single sitemap with hreflang xhtml:linkFor <5000 URLs total. Each URL lists its variants via xhtml:link. Heavy but centralised.
  • Sub-sitemaps per language + sitemap_indexFor >5000 URLs. One sitemap.xml per language (sitemap-fr.xml, sitemap-en.xml...), all referenced in sitemap_index.xml.
app/sitemap.tsts
export const dynamic = 'force-static';

export default function sitemap(): MetadataRoute.Sitemap {
  const SUPPORTED_LANGS = ['fr','nl','en','de','es','it','pt','sq','ar','mk','tr'];
  const PAGES = ['', '/blog', '/services', '/contact'];

  const urls: MetadataRoute.Sitemap = [];

  for (const page of PAGES) {
    for (const lang of SUPPORTED_LANGS) {
      urls.push({
        url: `https://optionweb.dev/${lang}${page}`,
        lastModified: new Date(),
        alternates: {
          languages: Object.fromEntries(
            SUPPORTED_LANGS.map(l => [l, `https://optionweb.dev/${l}${page}`])
          ),
        },
      });
    }
  }

  return urls;
}

5. Language detection: auto-redirect or user choice

When a new visitor arrives on your root optionweb.dev/, you have 3 options:

  1. Auto-redirect based on Accept-Language header → /fr/, /en/, etc. (risky UX but max conversion)
  2. Language choice page with memorisation cookie (explicit UX, penalises initial conversion)
  3. Fallback x-default + 'Switch to your language?' banner (recommended compromise)

Our choice on optionweb.dev: option 3. The root / redirects to /fr/ (default language), with a discreet banner offering to switch if Accept-Language indicates another supported language. Memorisation cookie to avoid re-offering the switch on each visit.

6. Translation strategy: human vs automatic

This is the main budgetary question of multilingual SEO. Three options according to business priority:

ApproachCost/pageSEO qualityWhen to use
Pro human translation15-50 €ExcellentTop 20-50 strategic pages
Post-edited machine translation (MTPE)5-15 €GoodSecondary pages, voluminous blog
Raw machine translation (DeepL, Google)0,001 €MediocreDrafts, low-criticality content

Recommended plan for exporting SME: top 30 pages in pro human translation, blog in MTPE, rest in raw MT marked noindex until human edit. Initial budget: 1 500-5 000 € for the top 30 pages × 10 languages.

7. The 8 multilingual pitfalls (experienced in production)

List of mistakes we made or saw on client projects in 18 months:

  1. Non-reciprocal hreflang: Google ignores everything. Mandatory monthly audit with Merkle Tool.
  2. Aggressive auto-redirect based on geographic IP: French user on holiday sees Turkish.
  3. Raw automatic translations on product pages: collapsing conversion, weak engagement signals, falling ranking.
  4. x-default pointing to main language instead of EN: users outside supported languages land on incomprehensible French.
  5. Forgetting to localise JSON-LD schemas: Organization in EN, Article in FR = inconsistency for Google.
  6. Pages duplicated between very close languages (PT-PT vs PT-BR, ES-ES vs ES-MX) without granular hreflang: cannibalisation.
  7. Sitemap not updated after adding a new language: new URLs never indexed for 6 months.
  8. Language cookie blocking crawlers: Googlebot only sees one language, others invisible.

Validation and monitoring tools

  • Hreflang Tags Testing Tool (Merkle)Free. Verifies hreflang reciprocity on any URL. To use monthly.
  • Google Search Console > International TargetingSection dedicated to hreflang errors detected by Google. Classic 'No return tags' notification.
  • Screaming Frog SEO SpiderFull site crawl with batch hreflang audit. 159 £/year pro version. Indispensable for large sites.
  • SistrixRanking tracking per country/language. 100-300 €/month. For companies with international reporting budget.
  • Ahrefs Site AuditIncludes hreflang audit. 99 $/month minimum. Good for one-shot audit before multilingual launch.
  • Manual curl auditFree. Check the hreflang returned by each URL via 'curl -I' and HTML inspection.
Tags#seo#hreflang#i18n#multilingual#international-seo#nextjs