In this post
- Why Hreflang Errors Are So Costly in International SEO
- Mistake 1: Missing Self-Referencing Tags
- Mistake 2: Wrong Language Codes
- Mistake 3: Missing x-default
- Mistake 4: Inconsistent Canonical vs. Hreflang
- Mistake 5: rel=alternate in the Wrong Location
- Mistake 6: Mixing HTTP and HTTPS
- Mistake 7: Paginated Pages Without Hreflang
- Validating Your Implementation Before It Goes Live
This post was published on 1 April 2025. Search engine behaviour and product features change, so check the current documentation before you act on it.
Why Hreflang Errors Are So Costly in International SEO
A broken hreflang implementation does not produce a crawl error or a 404. It produces a silent ranking failure. Google either ignores the hreflang annotations entirely, serves the wrong language variant to the wrong audience, or consolidates ranking signals onto a page you did not intend as the canonical for that market. None of these failures surface in a standard technical audit unless you know exactly what to look for.
Hreflang is unforgiving because it operates as a complete set. Every page in a localised set must reference every other page in that set, including itself. A single missing or malformed annotation can invalidate the entire cluster. Given that implementation errors are common - the spec is precise and the failure modes are silent - most international sites are running with hreflang implementations that are partially or fully broken.
Mistake 1: Missing Self-Referencing Tags
What goes wrong: Each page in a localised set must include a hreflang annotation pointing to itself. When a page omits its own self-reference, Google treats the annotation set as incomplete and may disregard the entire cluster.
Exact fix: Every page at URL https://example.com/fr/page/ with hreflang="fr" must include:
<link rel="alternate" hreflang="fr" href="https://example.com/fr/page/" />
This annotation must appear on the page itself, not only on the other language variants.
Mistake 2: Wrong Language Codes
What goes wrong: Hreflang requires BCP 47 language tags. zh is not a valid hreflang value for targeting Chinese speakers in a specific market. Google expects zh-CN for Simplified Chinese or zh-TW for Traditional Chinese. Using zh alone produces an invalid annotation that Google ignores. Similar errors occur with pt instead of pt-BR or pt-PT, and es instead of es-MX or es-ES.
Exact fix: Map every locale your site serves to the correct BCP 47 tag before implementation. For Chinese, Portuguese, and Spanish variants, always use the language-region format. Validate all codes against the IANA Language Subtag Registry.
Mistake 3: Missing x-default
What goes wrong: The x-default annotation tells Google which URL to serve when no other hreflang value matches the user's language or region. Without it, Google makes its own choice - which may be the wrong language variant or an inconsistent selection across different data centres.
Exact fix: Add a x-default annotation to every page in every localised set. The target URL should be your language selector page or your default-market page.
<link rel="alternate" hreflang="x-default" href="https://example.com/" />
Mistake 4: Inconsistent Canonical vs. Hreflang
What goes wrong: When a page's canonical tag points to a different URL than the hreflang annotation for that page's language, Google receives contradictory signals. Google resolves this conflict by choosing one signal to trust - usually the canonical - and discarding the hreflang mapping for that page.
Exact fix: The URL in each page's self-referencing hreflang annotation must exactly match the URL in that page's canonical tag. Exact match means protocol, subdomain, and trailing slash treatment must all be identical. A canonical pointing to /fr/page/ with a hreflang pointing to /fr/page (no trailing slash) is a mismatch.
Mistake 5: rel=alternate in the Wrong Location
What goes wrong: Placing rel="alternate" annotations in the body rather than the head means Google will not process them. Some CMS configurations inject hreflang tags via JavaScript or append them below the closing </head> tag - both are processing failures.
Exact fix: Choose one implementation method (HTML head, HTTP header, or sitemap) and apply it consistently. Confirm that all hreflang tags appear inside <head> before any render-blocking scripts. Validate placement using a raw HTTP response inspection, not a rendered DOM view.
Mistake 6: Mixing HTTP and HTTPS
What goes wrong: A hreflang annotation pointing to an HTTP URL when the site is served over HTTPS will not match the crawled URL. Google treats these as different resources. This error is common on sites that migrated to HTTPS but generated hreflang tags from an old URL list.
Exact fix: All URLs in hreflang annotations must use HTTPS if the site is HTTPS. Run a regex check across your sitemap and HTML source for any hreflang attributes containing http:// on a site served over https://.
Mistake 7: Paginated Pages Without Hreflang
What goes wrong: Implementations typically apply hreflang to root-level pages but omit paginated series. When a paginated series exists in multiple languages - blog archives, product listings - the absence of hreflang on pages 2 through N creates an incomplete localisation signal.
Exact fix: Apply hreflang annotations to every URL that has a localised counterpart, including paginated pages. The annotation set for /fr/blog/page/2/ must include all language variants of page 2, not page 1.
Validating Your Implementation Before It Goes Live
The seven mistakes above share a common property: they are all preventable at generation time if your tooling enforces the rules programmatically. Manual hreflang construction is the primary reason these errors persist. The annotation sets are too large and too interdependent for manual management to scale reliably.
A structured Hreflang Generator enforces self-referencing requirements, validates language codes against BCP 47, requires x-default input, and outputs a complete annotation set that can be validated before deployment. If your current international SEO workflow generates hreflang tags manually or through an ad-hoc script, running an audit against the seven failure modes above will almost certainly surface at least one active error.
Put this into practice
This product does the work described above. The first run is free, without an account.

