LocaleWatch a read-only watchdog for the translations you already have

A published Shopify language nobody can reach

"Published" feels like the last switch: flip it and the language is live. It is not the last switch. A language can be published — translations stored, admin happy — and attached to no market, which means no storefront URL serves it to anyone. The two are separate records, and the second can come undone while the first stays green.

What it looks like

Like nothing. That is the point. A published language with no market attachment has no URL root, appears in no hreflang tag, and cannot be seen by any outside crawl — the storefront simply behaves as if the language did not exist. Inside the admin, meanwhile, the language shows as published and its translations are all still there. There is no error banner and nothing to click that says "unreachable".

How we watched it happen, live

We staged the state on our own development store to see the exact mechanics. Brazilian Portuguese was published and serving at /pt/. In the admin's language settings we toggled off its domain assignment — one switch. Two things happened at the same moment: Shopify's market-attachment record for the language became an empty list, and the /pt/ path stopped serving Portuguese and fell back to the store's root. Toggling the assignment back restored both. The translations were never touched; only the road to them was removed.

The trap inside the trap: you cannot guess the URL

While measuring this we nearly fooled ourselves, and the mistake is worth publishing. To test whether the language was reachable we probed /pt-br/ — the language's code, the obvious guess. It fell through to the root, and we briefly concluded the language was unreachable. The real path was /pt/: the language was attached and serving the whole time. Shopify records each language's true root URL; the store's own hreflang map says the same thing from the outside. Across 70 stores we measured, 27 had at least one language living at a path that is not its language code. The absence of a guessed path is not the absence of a language — measure the real one.

Why it matters and how to check

The cost is quiet: translations you paid for, served to nobody, while every dashboard you look at reports a published language. Checking takes two minutes per language:

One honest caveat from our own measurement discipline: an outside check can only see what is servable. A language missing from hreflang could be unattached — or your theme may simply not emit hreflang. The admin-side check is the record; the outside check is the symptom.

Does the admin ever warn you?

Sometimes. In the whole time we have watched this state, Shopify's admin showed a warning about it exactly once — a notice on our development store that Brazilian Portuguese was not assigned. We would not build a process on a banner we have seen once; the domain-assignment column in the language settings is the record worth checking on a schedule.

We also cannot tell you how common this state is in the wild, and neither can anyone else measuring from the outside — that is the uncomfortable part of a defect whose only symptom is absence. A market-less language leaves no storefront trace to count. What we can say is that the state is reachable from one admin toggle, stays until someone flips it back, and touches nothing that would make a dashboard complain.

Related measurements

Check your own store in one minute.

Our free scanner reads your public storefront in every published language and lists the products where the translation stopped matching the source — with links to your own pages, so you judge the evidence yourself. No install, no login.

Run the free check

To hear about it first — a weekly watch with an email when a translation breaks — that's LocaleWatch on the Shopify App Store.