I Audited 100 Multilingual Sites. 87 Had Broken hreflang. Here's What They Got Wrong.

I grabbed a sample. SaaS companies, ecommerce brands, local business sites, a few marketplaces, a few media outlets. All of them were running in multiple languages. All of them were investing in international SEO.

87 of them had hreflang implementations that Google couldn't trust.

The wild part is that almost none of these teams knew. Search Console tucks the errors three menus deep. The analytics dashboard doesn't surface them. The SEO consultant signed off on "hreflang implemented ✓" six months ago and nobody opened the hood since.

Here's the pattern.

Error #1: Missing self-reference (found on 54 sites)

The most common failure. The English page lists the French and Spanish versions as alternates but never lists itself. Google reads this as "three languages, one of which is this page… wait, which one is this page?" and throws the whole cluster out.

Every page in the cluster needs to declare every URL in the cluster, including itself. No exceptions.

Error #2: Underscore instead of hyphen (found on 31 sites)

Developers write en_US out of habit. It's how every modern programming language formats locale strings. It's what the Django i18n middleware expects, what Rails uses, what iOS passes in NSLocale.

Google only accepts en-US. Hyphen. The entire tag is rejected if you use an underscore. Not "downgraded" — rejected.

Error #3: Return tag missing on one or more pages (found on 44 sites)

The cluster is a handshake. A claims B. B has to claim A back. Most of the failures I saw were asymmetric: the canonical English page declared Spanish correctly, but the Spanish page forgot to declare English in return. Google drops the whole pair.

This almost always happens when teams generate hreflang dynamically but keep the "master list" stored on only one template. The Spanish template was built in a different sprint by a different contractor, and nobody cross-checked.

Error #4: Wrong country code (found on 19 sites)

Someone writes es-SP for Spain. It's ES. pt-PT means Portuguese from Portugal; pt-BR is Brazilian Portuguese. Users assume the language code maps to the obvious country — fr-FR, de-DE — and try to extrapolate. Sometimes they extrapolate wrong.

Use the ISO 3166-1 alpha-2 list. It's boring. Keep it open in a tab.

Error #5: Redirects inside the cluster (found on 22 sites)

The English page lists /fr/home as the French alternate. /fr/home redirects to /fr/. Google sees the redirect and considers the alternate broken.

Always declare the final URL. If the URL you're declaring 301s or 302s anywhere, the handshake dies at the redirect.

Error #6: Declaring a noindex page as an alternate (found on 11 sites)

Someone marked the Spanish page as noindex during a content migration and forgot. The English page still cites it as an alternate. Google reads "this is the Spanish version" followed by "ignore this page entirely" and disposes of the whole cluster.

The audit tools flag this, but only if you run them.

The compounding effect

Here's what makes all of this worse. hreflang issues aren't binary — they compound.

A single broken handshake on a single page is a small problem. Five broken handshakes on five pages becomes a pattern that Google uses to discount your entire domain's hreflang signals. Once Google stops trusting the tags, adding new ones does nothing. You have to fix the existing errors first, wait for a recrawl, wait for the reputation to recover.

Teams that realize this usually realize it after a quarter of flat international traffic.

How to check your own site in 10 minutes

  1. Open Search Console
  2. Go to Indexing → International Targeting (yes, it's still there, just buried)
  3. Look at the language tab. Anything marked "No return tags" or "Unknown language code" is broken
  4. Cross-check with a free tool like TechnicalSEO's hreflang validator or the Screaming Frog crawler

If you have more than one or two errors, your hreflang is functionally off.

The easier path

Here's the reason we built SiteDialect the way we did. The whole class of errors above disappears when hreflang is emitted automatically from a single source of truth that knows which languages you support and which URL structure you're using.

Add one script tag. SiteDialect serves translated pages and emits correct <link rel="alternate" hreflang="…"> headers for all of them. Self-references, return tags, x-default — all handled. The handshake is always symmetric because one system is running both sides of it.

If your site's in the 87, this is the five-minute fix.

Fix the handshake once, not once per page

SiteDialect emits correct hreflang automatically. No more Search Console errors. No more broken return tags.

Get Started Free