DEV Community

Smart Calculators
Smart Calculators

Posted on

Shipping 30 locales at once taught me what Google actually tracks in hreflang

The conventional wisdom on multi-locale rollouts is "ship incrementally." I ignored it. I had a static Next.js site, a batch of localised content that had passed review, and a clean hreflang implementation. Rolling out 20 new locales in a single release felt like a low-risk operation.

It wasn't. The search-visibility dip showed up within days — not because anything was technically broken, but because I had underestimated how much of hreflang's behaviour is a trust model, not a structural one.

This post is what I wish someone had told me before that deploy.

Hreflang is a trust declaration, not a translation directive

If you have five English variants (en-US, en-GB, en-AU, en-CA, en-IN) and five Spanish variants (es-ES, es-MX, es-CO, es-AR, es-CL), Google does not just read the hreflang cluster and serve each region the right version.

It evaluates whether the content actually differs enough per variant to justify the cluster. If the pages look like identical English copy with slightly different URLs, or identical Spanish copy with slightly different disclaimers, the cluster can look like duplication with extra steps.

The fix was not more locales. The fix was fewer locales done more thoroughly.

A multi-locale page is not "done" when the text is translated

Translation is the cheapest part. Credibility is the expensive part.

A French user arriving at /fr-FR/tools/mortgage expects French-language examples, French tax treatment, French-currency defaults, and a disclaimer that reads like a French person wrote it. If any of those are missing, the page reads as a translated English page that happens to live at a French URL — and both Google and the user can smell the difference.

The lesson I internalised: shipping a locale means shipping the full locale-specific context, not just the translated UI strings.

Schema choices matter more than I expected

I had WebApplication JSON-LD on every calculator page. On paper, that was correct — these pages are interactive web applications.

In the SERP, what Google did with that signal was not what I wanted. The snippet treatment started looking more like a software-product card and less like a rich tool result. For a utility page where users need to see the actual calculator content to decide to click, that swap hurt click-through before anything in the algorithm could evaluate whether the content was good.

I switched to HowTo-style schemas that describe the calculation method, and the snippet treatment moved back toward something more useful.

The hreflang bit that still holds up

Most of the chaos came from things I had to unlearn. One piece did not need unlearning: the sitemap-time alternate generation. It is boring by design — and boring is exactly what hreflang clusters reward.

function buildAlternates(path) {
  const alternates = [];
  for (const locale of locales) {
    alternates.push({ locale, href: `${BASE_URL}/${locale}${path}` });
  }
  alternates.push({ locale: "x-default", href: `${BASE_URL}/${defaultLocale}${path}` });
  return alternates;
}
Enter fullscreen mode Exit fullscreen mode

Two things worth stealing from this shape:

  1. Every locale gets a fully-qualified URL including the hostname. Relative hrefs work locally but can be misinterpreted by crawlers that hit the sitemap from a different origin.
  2. x-default always points at the default-locale version of the same path. It never changes per release. Moving x-default around is one of the fastest ways to lose Google's patience with your cluster.

Anything fancier than this — per-locale path rewrites, canonical hopping, conditional redirects — usually makes things worse under pressure.

The takeaways

  • Don't stack locale rollouts. One or two locales per release, with time between them, keeps the cluster interpretable.
  • Localise context, not strings. The page has to read like it was made for that market, not translated for it.
  • Audit your JSON-LD. The wrong schema type can quietly change how your page appears in the SERP long before any content evaluation.
  • Keep x-default boring. Stable canonical fallback, never moved.

I build smart-calculators.net in my spare time — a multi-locale static calculator platform currently running on the lessons above. If you are about to ship a big i18n rollout, I hope this saves you a couple of weeks of Search Console anxiety.

Top comments (0)