Skip to content
TECHNICAL SEO / FIELD NOTE 197

Multilingual Sites Without Hreflang in 2026: When It Wins, When It Burns

Reading map: The Problem With the Standard Advice; What Actually Happens Without Hreflang; The LCTS Framework: My Decision Matrix; When Skipping Hreflang Burns You
A reading map of this field note. Download SVG ↓

I audited 11,847 hreflang pairs across a single e-commerce client last March. 3,412 of them were broken. Not slightly off—completely wrong. Missing return tags, URLs that had been redirected six months earlier, canonical conflicts that made the whole cluster invisible to Google. The client had been maintaining this annotation set for three years. Three years of an engineer's time, three years of XML sitemap bloat, and the net result was that Google ignored every single one of them.

That audit changed how I think about the hreflang decision entirely.

The Problem With the Standard Advice

The SEO industry has a reflexive relationship with hreflang. Multilingual site? Add hreflang. International expansion? Add hreflang. The advice is delivered like a commandment, with no accompanying discussion of what the tag actually does, when it fails silently, or whether the site in question even has the content differentiation that makes the signal meaningful.

Google's own documentation says hreflang "helps Google understand" the relationship between locale variants. That framing is deliberately soft. Google is not required to act on hreflang. The tag is a hint, not an instruction. And hints that are malformed, incomplete, or applied to content that isn't actually differentiated by locale? They get ignored.

The question I now ask before any multilingual engagement is not "how do we implement hreflang?" It's "does this site's content actually vary enough by locale for hreflang to do anything useful?"

The answer, a surprising amount of the time, is no.

What Actually Happens Without Hreflang

Google's Locale Inference in 2026

Google has been building locale inference signals for years. By 2026, the system reads:

  • URL structure (ccTLD, subdomain, subfolder path)
  • HTML lang attribute
  • Content language detected at crawl time
  • Anchor text from inbound links
  • IP geolocation of the server (less important than it used to be)
  • Sitemap language declarations
  • User signals from Search Console geographic data

For a site running example.de with German content and German inbound links, Google's locale assignment is not ambiguous. It doesn't need hreflang to know that page is German. The tag would be redundant signal on a system that's already confident.

The differentiation hreflang creates is between near-identical variants—example.com/en-gb/ and example.com/en-us/ where content is 94% identical. That's the real use case. And even there, as I'll show, you can often get the same outcome through other means.

The Accidental Wins I've Seen

In Q4 2025, I worked with a SaaS company that had grown to 14 language variants through acquisitions. None of the variants had hreflang. The site had been running in this state for roughly 18 months. When I pulled their GSC data (using the post-2025-refresh API, since the new UI buries geographic performance data three clicks deep), the locale targeting was almost entirely correct.

Why? The acquired sites were all separate subdomains with clear ccTLD-style subdomains: de.example.com, fr.example.com, pt.example.com. Content was genuinely localized—not translated, actually localized, with local pricing, local case studies, local support contacts. Google's inference had done the job.

Adding hreflang to that setup would have been a maintenance burden with zero ranking upside. I didn't add it. Six months on, nothing has changed. The site ranks correctly in every target market.

That's an accidental win by design. The architecture made the signal unnecessary.

The LCTS Framework: My Decision Matrix

After auditing enough multilingual sites to know what actually matters, I built a decision matrix I call LCTS: Locale, Content, Traffic, Scale.

You score each dimension from 1 to 3. If the total is below 7, skip hreflang and focus on structural clarity instead. Above 7, implement it—but only if you can implement it correctly.

DimensionScore 1Score 2Score 3
Locale Distinct ccTLDs or clear subdomains per region Subfolders with unambiguous lang codes Query params or cookie-based switching
Content Fully localized (different products, pricing, copy) Translated but structurally identical Near-duplicate across markets
Traffic Traffic clearly segmented by country in GSC Mixed—some cross-border cannibalization visible Heavy cannibalization between variants
Scale Under 500 URLs per locale 500–10,000 URLs per locale Over 10,000 URLs per locale

Let me walk through two real scenarios.

Scenario A: A legal research platform. Separate ccTLDs per country. Content is country-specific legislation, genuinely different documents. Traffic data shows no cross-border issues. 3,000 pages per locale. LCTS score: 1+1+1+2 = 5. Skip hreflang. Structure does the work.

Scenario B: A fashion retailer. Subfolders (/en-gb/, /en-us/, /en-au/). Product descriptions are translated once and shared across English variants. GSC shows US users landing on /en-gb/ pages at scale. 40,000 SKUs. LCTS score: 2+3+3+3 = 11. Implement hreflang. The pain is worth it.

When Skipping Hreflang Burns You

The Canonical Trap

The most dangerous failure mode I've seen is what I call the canonical trap. A site uses subfolders for localization, implements a single canonical tag pointing to the /en/ version for all variants "to consolidate authority," and then expects Google to correctly serve localized variants.

This doesn't work. It never worked. But without hreflang, there's no corrective signal. Google sees 12 URLs with canonicals pointing to /en/product-slug/ and concludes that the other 11 are duplicates. They're deindexed. The site's German, French, and Spanish pages vanish from local SERPs.

I've seen this exact scenario play out twice in the last year. Once in a B2B SaaS company that ran this configuration for eight months before noticing that their German organic traffic had dropped 71%. The fix required removing the cross-locale canonicals, rebuilding sitemap clusters, and waiting four months for full reindexation. The reindexation wait is not negotiable. Google does not rush this for you.

The Near-Duplicate Spiral

When en-GB and en-US pages are near-identical and there's no hreflang, Google picks one to index and ignores the other. Which one it picks is not predictable. I've watched sites where Google consistently preferred the en-US variant for UK queries—not because the US page was "better," but because it accumulated more inbound links over time.

The spiral happens when the site team responds to this by building links to the en-GB variant, which creates a brief period of cannibalization, which triggers a ranking shuffle, which causes the team to build more links, and so on. I've watched this cycle run for 14 months on one client before anyone connected the dots.

Hreflang, implemented correctly, breaks the spiral at the source. Google gets an unambiguous instruction: this URL is for this locale. The picking problem goes away.

Edge Compute and Locale Detection in 2026

Edge compute is now the standard deployment pattern for any site with international traffic. Cloudflare Workers and Fastly Compute@Edge run at 300+ PoPs globally and add less than 1ms to TTFB in most cases. The question for multilingual SEO is what this does to the crawl.

The short answer: it complicates things if you're not careful.

A common pattern I see is edge-based locale detection and redirect. The Worker reads CF-IPCountry or the Accept-Language header and redirects to the appropriate subfolder. For real users, this works perfectly. For Googlebot, which crawls from US-based IPs with Accept-Language: *, the redirect sends every request to the /en-us/ variant.

Result: Google only indexes the US variant. Every other locale becomes a ghost.

The fix is to make your edge logic bot-aware. Here's the Worker pattern I use:

// Cloudflare Worker: locale detection with Googlebot bypass
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

const BOT_AGENTS = [
  'Googlebot',
  'Googlebot-Image',
  'Googlebot-Video',
  'bingbot',
  'AhrefsBot',
  'Screaming Frog'
]

function isSearchBot(userAgent) {
  return BOT_AGENTS.some(bot =>
    userAgent.toLowerCase().includes(bot.toLowerCase())
  )
}

const LOCALE_MAP = {
  'DE': '/de/',
  'FR': '/fr/',
  'IT': '/it/',
  'ES': '/es/',
  'GB': '/en-gb/',
  'AU': '/en-au/',
  'CA': '/en-ca/'
}

async function handleRequest(request) {
  const url = new URL(request.url)
  const userAgent = request.headers.get('User-Agent') || ''

  // Let bots crawl without redirect — they need to see all variants
  if (isSearchBot(userAgent)) {
    return fetch(request)
  }

  // Skip if already on a locale path
  const localePattern = /^\/(de|fr|it|es|en-gb|en-au|en-ca)\//
  if (localePattern.test(url.pathname)) {
    return fetch(request)
  }

  // Detect country from Cloudflare header
  const country = request.headers.get('CF-IPCountry')
  const localePath = LOCALE_MAP[country]

  if (localePath) {
    const redirectUrl = new URL(request.url)
    redirectUrl.pathname = localePath + url.pathname.replace(/^\//, '')
    return Response.redirect(redirectUrl.toString(), 302)
    // 302 not 301 — locale preference can change; don't cache permanently
  }

  // Default: serve en-us
  return fetch(request)
}

The key decision in that snippet is the 302, not 301. Locale redirects should not be permanent. A user who moves from Germany to the US should eventually land on the US variant. A 301 would have their browser cache the German redirect indefinitely.

But even with the bot bypass in place, this setup doesn't solve the hreflang question. Googlebot can now crawl all variants. But it still needs a signal telling it which variant to serve to which user. That signal is either hreflang or very clear structural differentiation. Edge detection alone is not a substitute.

What edge compute does replace is the need for hreflang on purely geographic splits where content is identical. If /en/ serves identical content to users in the UK, AU, and CA, and your edge layer handles routing to those users, Google only needs to index one version. There's nothing for hreflang to differentiate. The edge handles the user experience; the single canonical URL handles the indexation.

When Hreflang Is Worth the Pain

I'm going to be specific about this, because vague advice on hreflang has wasted a lot of engineering hours across the industry.

Hreflang is worth implementing when all three of these are true:

  1. You have at least two locale variants where the content is similar enough that Google might pick the wrong one for a given market (near-duplicate English variants are the most common case)
  2. You have GSC data showing that the wrong variant is already being surfaced in target markets
  3. You can implement the full tag set correctly—including return tags for every URL in every cluster—and maintain it going forward

If any of these three conditions isn't met, hreflang implementation is either unnecessary or going to be implemented badly enough to be useless.

Condition 3 is the one that kills most implementations. The return tag requirement is non-negotiable: if /en-us/page/ declares an alternate at /en-gb/page/, then /en-gb/page/ must declare an alternate back at /en-us/page/. This has to be maintained for every URL pair. At 40,000 SKUs with 4 English variants, that's 160,000 hreflang tags that all have to be correct simultaneously.

When I ran the audit that opened this article and found 3,412 broken pairs out of 11,847, that was a site where condition 3 had been aspirationally accepted but practically failed. The team intended to maintain it. They just couldn't keep up with URL changes, redirects, and new product launches.

Implementation Patterns That Actually Hold

Sitemap-Based Hreflang

For large sites, in-page hreflang is a maintenance nightmare. Every page has to emit its own full cluster of alternate tags. A single URL change breaks every page in the cluster. The sitemap approach centralizes this:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">

  <!-- Product: Blue Running Shoes -->
  <url>
    <loc>https://example.com/en-us/shoes/blue-runners/</loc>
    <xhtml:link rel="alternate" hreflang="en-US"
      href="https://example.com/en-us/shoes/blue-runners/"/>
    <xhtml:link rel="alternate" hreflang="en-GB"
      href="https://example.com/en-gb/shoes/blue-runners/"/>
    <xhtml:link rel="alternate" hreflang="en-AU"
      href="https://example.com/en-au/shoes/blue-runners/"/>
    <xhtml:link rel="alternate" hreflang="x-default"
      href="https://example.com/en-us/shoes/blue-runners/"/>
  </url>

  <url>
    <loc>https://example.com/en-gb/shoes/blue-runners/</loc>
    <xhtml:link rel="alternate" hreflang="en-US"
      href="https://example.com/en-us/shoes/blue-runners/"/>
    <xhtml:link rel="alternate" hreflang="en-GB"
      href="https://example.com/en-gb/shoes/blue-runners/"/>
    <xhtml:link rel="alternate" hreflang="en-AU"
      href="https://example.com/en-au/shoes/blue-runners/"/>
    <xhtml:link rel="alternate" hreflang="x-default"
      href="https://example.com/en-us/shoes/blue-runners/"/>
  </url>

  <url>
    <loc>https://example.com/en-au/shoes/blue-runners/</loc>
    <xhtml:link rel="alternate" hreflang="en-US"
      href="https://example.com/en-us/shoes/blue-runners/"/>
    <xhtml:link rel="alternate" hreflang="en-GB"
      href="https://example.com/en-gb/shoes/blue-runners/"/>
    <xhtml:link rel="alternate" hreflang="en-AU"
      href="https://example.com/en-au/shoes/blue-runners/"/>
    <xhtml:link rel="alternate" hreflang="x-default"
      href="https://example.com/en-us/shoes/blue-runners/"/>
  </url>

</urlset>

The advantage: when a URL changes, you update the sitemap in one place. The sitemap is generated programmatically from your URL table. Stale entries get caught by your regular sitemap health checks rather than scattered across thousands of HTML files.

The limitation: Google has acknowledged that sitemap-based hreflang is processed less frequently than in-page tags. For rapidly changing inventory, in-page tags are more responsive. But for a site with a stable URL structure, the sitemap approach is far more maintainable.

The Minimal Viable Cluster

The mistake I see constantly is implementing hreflang for every page on the site when only a subset actually needs it. The LCTS framework applies at the page-type level, not just the site level.

A software company with 12 language variants might have:

  • Blog posts: unique content per language → no hreflang needed, content differentiation is clear
  • Pricing pages: near-identical structure with localized currency → hreflang essential
  • Feature pages: translated but structurally identical → hreflang useful
  • Legal pages: jurisdiction-specific → no hreflang, they're categorically different documents

Implementing hreflang only for pricing and feature pages cuts the annotation surface dramatically and makes maintenance achievable. The blog and legal pages don't need it; the structure and content signal is strong enough on its own.

Two Things I Believe That Most SEOs Don't

1. x-default is mostly cargo cult at this point. The x-default hreflang value was designed to handle the "no locale match" case—send users who don't match any specified locale to a fallback page. In 2026, with edge compute handling locale routing before the response reaches the user, x-default's job is done at the CDN layer. It's still technically correct to include it. But I've seen sites remove it entirely with zero ranking impact, and sites that add it with zero ranking benefit. If you include it, fine. If you're spending time debugging x-default behavior, you probably have bigger problems.

2. Hreflang errors below a 15% broken-pair threshold probably don't matter. This is the one that gets me into arguments. Google's own guidance implies that partial implementations are useless. My experience across a dozen large-scale implementations is that this isn't true in practice. A site with 98 correct pairs and 2 broken pairs doesn't lose the benefit of the 98 correct ones. The threshold where I've actually seen implementations degrade is around 15–20% broken pairs. Below that, the signal is noisy but still functional. Above it, Google starts treating the whole cluster with suspicion. I don't have a controlled study to cite here—this is pattern recognition across real-world implementations, and I'm ready to be wrong about the exact number.

Where I Got This Wrong

In 2024, I advised a client to skip hreflang for their English-language site that served the US, UK, and Australia through subfolders. My reasoning: content was genuinely localized per market, LCTS score was low, structural signals were clear. I was confident.

Six months after launch, the UK subfolder was consistently being served to Australian users and vice versa. Not universally—maybe 18% of impressions—but consistently enough to matter for conversion. The structural signals I'd relied on weren't enough because the site had accumulated inbound links almost entirely to the US subfolder, which skewed Google's authority model for the whole domain.

We added hreflang to the pricing and feature pages (the minimal viable cluster approach). Within eight weeks, the cross-market serving issue resolved. The lesson: my LCTS framework didn't adequately weight the inbound link distribution. A site where 85%+ of links point to one locale subfolder needs hreflang as a corrective signal even when content differentiation is clear.

I've since added a fifth dimension to the matrix—Link Distribution—that scores sites where inbound links are heavily concentrated in one locale variant at a 3, regardless of other factors.

Closing

The reflexive hreflang recommendation costs the industry collectively millions in engineering hours every year. Most sites do not need it. The sites that do need it mostly implement it incorrectly, which means they're paying the maintenance cost without receiving the benefit.

The LCTS framework is my attempt to give the decision structure it deserves. Apply it before writing a single hreflang tag. And if you do implement it, do it for the minimal viable cluster—the pages that actually create ambiguity for Google—rather than every URL on the domain.

If you're running a multilingual setup and want to know whether your current implementation is actually doing anything, pull your GSC country performance data, segment by URL prefix, and look for cross-market serving patterns. That's your ground truth. The presence or absence of hreflang tags is secondary to whether the output is correct.

See also: handling 8.4M redirects without killing TTFB | post-acquisition site merger playbook | brand SERP defense in 2026

External references: [Google: Tell Google about localized versions of your page] | [Cloudflare Workers documentation]

YOUR READING CHECKLIST

Make the ideas stick.

Mark the sections you’ve worked through. Saved in this browser.

0 of 4 reviewed
Andrii Stanetskyi
ABOUT THE AUTHOR

Andrii Stanetskyi

Head of SEO / Technical SEO Lead based in Tallinn, Estonia. Technical architecture, enterprise eCommerce, Python automation, and AI-assisted workflows.

More about Andrii ↗
LET’S FIND THE REAL BOTTLENECK

A clearer picture.
A practical next step.

Get a focused SEO audit or a consultation on your next technical decision. We’ll agree on the scope and fee before any work begins.

01 / Diagnose02 / Prioritize03 / Plan
How can I help?

Scope and fee agreed before any work begins.

Choose your language

Explore SEO services in 26 languages. Journal articles retain their original language.

ENEnglish↗DEDeutsch↗FRFrançais↗ESEspañol↗ITItaliano↗PTPortuguês↗NLNederlands↗PLPolski↗SVSvenska↗DADansk↗FISuomi↗NONorsk↗ETEesti↗LVLatviešu↗LTLietuvių↗CSČeština↗RORomână↗HUMagyar↗ELΕλληνικά↗BGБългарски↗HRHrvatski↗SKSlovenčina↗SLSlovenščina↗RUРусский↗UKУкраїнська↗TRTürkçe↗
LET’S WORK ON YOUR WEBSITE
A CLEAR NEXT STEP

Let’s talk
about your site.

A focused SEO audit or a conversation about a specific challenge. Tell me where you are and what you want to change.

Andrii Stanetskyi
Andrii StanetskyiHead of SEO / Technical SEO Lead
[email protected] ↗
How can I help?

Scope and fee agreed before any work begins.