The wrong language version: checking hreflang with JMX
A customer in Zurich gets the German price list, a visitor in Vienna the Swiss one, and in Search Console the .de URL ranks for Austrian queries. The cause rarely lies with the one page that is displayed wrongly: hreflang is a mutual declaration, and as soon as one version of the group steps out of line, Google as a rule discards the assignment for the whole cluster — including the language versions that are marked up cleanly. It gets expensive quietly. The traffic does not collapse, it just converts worse.
How to go about it in JMX
- Settings → Crawl: all versions in one run. If the languages sit on subdomains such as
de.orfr., switch on “Include subdomains”. The reciprocity check can only judge what lies in the same crawl. - The Technical tab, “Language codes” card. Three numbers at a glance: pages without a
langattribute, codes outside the form BCP 47 requires, and hreflang annotations with an unusable code. What could not be checked is called “unknown” there and not “fine”. - The Results tab, Hreflang sub-tab. The markup per page sits here. A click on the row opens the detail view with findings, links and source — there you see what the language switcher actually outputs.
- The Issues tab, Hreflang category. Ten rules apply. As errors come
SEO.HREFLANG.TO_ERROR,SEO.HREFLANG.MISSING_SELF,SEO.STRUCTURE.HREFLANG_NO_RETURNandSEO.HREFLANG.INVALID_CODE— the last of which checks against ISO 639-1 and ISO 3166-1 alpha-2, which is whyen-UKandde-EUstand out although they look right. As warnings follow targets that redirect, are canonicalised or are not indexable. - The Search tab, Source area. Mode “does not contain”, term
hreflang, restricted to the path area/en: the list of pages that carry no markup at all and therefore appear in no rule. - The Tasks tab. A missing self-reference is usually one line in the layout; a target that redirects with a 301 is work per page. The list carries that distinction as effort and leverage.
What to watch out for
The most common misreading: hreflang is neither a redirect nor a ranking signal. It decides which of the versions that rank anyway gets served. If you land on the wrong language in a browser because a redirect by IP country sent you there, you have a different problem — and one JMX does not see: the crawler fetches from one location and with one identity.
The limit of the method is in the rule itself. Only targets the crawl fetched as an internal HTML page are checked. If the versions sit on separate country domains instead — example.de, example.fr, example.it — the targets are external as far as the crawl is concerned, the check does not run, and the absence of a finding is then not reassurance but a gap. That leaves one run per domain.
Two more special cases. If the markup is not in the HTML but in the sitemap, it belongs in the Sitemap check tab, which checks codes, self-reference, reciprocity and x-default separately; nothing is crawled there, and only both together are the complete check. The missing x-default, in turn, is deliberately only a notice, because Google recommends it and does not require it — with three versions and customers from 40 countries, Google decides who gets what without it.
If codes, self-references and return links are all right and the wrong version still ranks, then hreflang is no longer the cause but two pages that say the same thing — and the next look goes to the near-duplicate detection in the same issue list.