hreflang on 27 homepages: 10 declare it, 2 forgot x-default
hreflang tells engines which language version belongs to which reader. We read 30 homepages on 2026-08-17: 10 of the 27 we could reach declare it, and 2 of those 10 have no x-default.

FIELD TEST · 2026-08-17 · 30 sites · single snapshot
Sample and method: the same 30 sites we used for our robots.txt and sitemap surveys. One homepage request each, browser user agent, 2026-08-17. Three sites refused us, so the counts below are out of 27. This crawl also feeds four other posts in this batch — same fetch, different questions.
Ten of the 27 homepages we could read declare hreflang at all. Eight of those ten include an x-default. The gap that matters is not the seventeen sites with none — plenty of them are English-only — it is Notion, which declares 22 locales and no x-default, leaving engines to guess which one to show a reader outside all 22.
Who declares hreflang, and how many locales
The spread is wide. Stripe declares 89 alternates from its homepage; BBC declares two. Both are correct for what they are, which is the point — the count tells you about the site, not about the quality of the implementation.
| Site | Alternates | x-default |
|---|---|---|
| stripe.com | 89 | yes |
| shopify.com | 66 | yes |
| figma.com | 34 | yes |
| notion.com | 22 | no |
| slack.com | 16 | yes |
| cloudflare.com | 10 | yes |
| nytimes.com | 9 | yes |
| github.com | 8 | yes |
| webflow.com | 4 | yes |
| bbc.com | 2 | no |
How we measured it
The extraction rule was fixed before the crawl and did not change after we saw the results.
- Request
https://{host}/once, following redirects, with a desktop browser user agent. - From the returned HTML, take every
<link rel="alternate">that also carries anhreflangattribute. - Count them, count the distinct values, and record whether
x-defaultis among them.
We read the HTML as delivered. Tags injected later by client-side code are invisible to this method, and they are equally invisible to a crawler that does not run the page.
The missing x-default is the expensive one
An x-default entry tells an engine which version to serve when no declared locale matches the reader. Without it, a reader in a country outside the declared set gets whichever page the engine picks, and you have no say in it.
Notion is the case worth studying. Twenty-two locales is a serious localisation programme, and the one line that tells an engine what to do with everyone else is absent. BBC's two-entry set has the same hole but a much smaller blast radius.
Our own request had a Japanese IP, and two sites noticed
This is a limitation and a finding at once. Our egress address geolocates to Osaka, so two sites routed us away from the address we asked for before any HTML came back.
| Requested | Actually served |
|---|---|
| stripe.com | stripe.com/jp |
| slack.com | slack.com/intl/ja-jp/ |
So the alternates we counted for those two came off a Japanese page, not the page a US reader gets. Their canonical tags pointed at the Japanese URLs too, which is correct behaviour for the page we were handed — it just is not the page we asked for.
Worth carrying forward: IP-based redirection and hreflang are two different mechanisms solving the same problem, and a crawler egressing from one country only ever sees one side of it. The published crawler IP ranges for the major AI engines sit mostly in the United States.
What we did not check
We did not verify reciprocity. An hreflang set is only valid if every page it names points back at the whole set, and confirming that for Stripe alone would mean fetching 89 more URLs. We fetched one page per site, so we cannot tell you whether any of these ten sets are internally consistent — only that they exist.
We also cannot say what any engine did with them. Declaring hreflang is an input; which version actually gets shown is a decision we have no visibility into from outside.
What to do with your own hreflang
Three checks, in the order that catches the most for the least effort.
- Confirm
x-defaultexists if you declare more than one locale. It is one line and it removes a guess. - Fetch your homepage with curl and count the alternates. If the number is zero and you run more than one language, they are being injected client-side and crawlers are not seeing them.
- Do not rely on IP redirection instead of hreflang. It sends every crawler to whichever version matches its egress country.
- Do not declare a locale you do not actually serve. A named alternate that 404s is worse than no declaration.
If you are deciding which languages to run in the first place, that is a different question from how to declare them — our chapter on how to find keywords for a new website covers why each language needs its own keyword list rather than a translation. The same 27 homepages also told us something about their structured data, which we wrote up in most homepages carry no structured data. Checking all of this across a whole site, rather than one page at a time, is what QueryWin is being built to do.
Common questions
Does hreflang affect AI answers?
We did not test that and will not claim it. What hreflang does verifiably is tell search engines which language version belongs to which audience. Whether an AI engine reads the tag or infers language from the text, we have no way to observe from outside.
Is 89 alternates too many?
No, if you serve 89. The cost of a long set is page weight and the maintenance burden of keeping every entry alive. Stripe's set loaded fine.
Do I need hreflang for one language?
No. Seventeen of the 27 sites here declare none, and most of them run a single language. The tag exists to disambiguate, and there is nothing to disambiguate.
Where should the tags go?
In the HTML head of every page in the set, or in the sitemap. Both are documented; the head is easier to verify with one curl.


