Google's hreflang specification is defined by three hard requirements. Get any one wrong and the entire annotation set is silently dropped — no error in Search Console, no crawl warning, just Google reverting to its own judgment about which page to serve in which market.
Rule 1: Valid IETF BCP 47 Language Codes
Language values must follow IETF BCP 47, not ISO 639-1 alone. For most languages, a two-letter code is sufficient (en, fr, de). For region-specific variants, append a region subtag: en-GB, fr-CA, pt-BR. For script variants — particularly Chinese — use script subtags: zh-Hant (Traditional) and zh-Hans (Simplified). Using zh-TW as a script signal is technically a region code, not a script code, and can produce ambiguous results.
Rule 2: Self-Referencing Tags
Every page in a hreflang set must include a tag pointing to itself. A page targeting en-US must carry both the self-reference and annotations for every other locale in the set. Omitting the self-reference is one of the most common errors in hreflang implementations, and it causes that page's signals to be treated as incomplete.
Rule 3: Full Reciprocity
If Page A references Page B, Page B must reference Page A. This applies across every URL in the set. A four-locale implementation means each page carries four hreflang tags — one per locale plus its own. When a site adds a new locale but only updates one page, the broken reciprocity invalidates hreflang signals across the entire set.
A minimal valid HTML implementation looks like this:
<link rel="alternate" hreflang="en-US" href="https://example.com/en-us/page/" />
<link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/page/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/page/" />Each of those three URLs must carry all three tags. That is the minimum structure for a compliant two-locale set with an x-default fallback.