Back to notes

April 27, 2026 · 6 min read

An Hreflang Mess That Took Three Months to Fully Untangle

A site with eight language versions had hreflang tags that contradicted each other in almost every direction. Here's how we found and fixed it.

PostmortemSEO

The symptom was simple: French users in Canada were landing on the France version of the site, and the site owner wanted to know why. The actual answer took three months to fully resolve, because the hreflang implementation underneath it was wrong in at least four different, compounding ways.

Hreflang tags are supposed to be reciprocal — if page A says page B is its alternate for a locale, page B needs to say the same thing back about page A. On this site, roughly a third of the pairs weren't reciprocal at all, which meant Google was simply ignoring those hints, because non-reciprocal hreflang is treated as unreliable.

What we actually found

  • Non-reciprocal tags on roughly a third of all language pairs, caused by a CMS plugin update eighteen months earlier that silently changed the output format
  • Two language versions pointing to the same URL for different locale codes, an impossible hreflang state that Google's documentation explicitly warns against
  • No x-default tag at all, so there was no fallback for users in regions the site hadn't explicitly mapped
  • Hreflang values using region codes that didn't match the actual content language in three cases (fr-FR tagged on content that was actually written in fr-CA)
Hreflang doesn't fail loudly. It fails by quietly routing the wrong users to the wrong pages for months before anyone notices.

The fix, and why it took so long

The technical fix — regenerating a correct, fully reciprocal hreflang map with proper x-default handling — took about a week once we understood the actual state of the problem. The three months was mostly re-crawl and re-evaluation time: Google needed to recrawl every affected URL, re-parse the corrected signals, and then actually change its routing behavior, and that process doesn't happen on a schedule you can push.

The lesson that stuck with me: hreflang is the kind of thing that degrades silently through unrelated changes — a CMS update, a migration, a plugin patch — because nothing else about the site visibly breaks when it goes wrong. If you haven't audited your hreflang map in the last year and you've touched your CMS or URL structure in that time, you should assume it's wrong until you've actually checked.