Website problems
hreflang annotations being ignored
hreflang annotations tell search engines which URLs are the same content in different languages, so the right version is shown to the right audience. They are validated as a set rather than individually: every page must reference every other, including itself, with absolute URLs and valid codes. One missing return reference and the whole cluster is discarded — which is why annotations that look correct on the page you are reading achieve nothing.
The reciprocity rule
If the English page references the French one, the French page must reference the English one back.
Every page in the set must also reference itself, which is the requirement most often omitted.
An unconfirmed reference is treated as unreliable, and a set containing one is discarded rather than partially honoured.
So correctness is a property of the whole cluster, not of any single page — which is what makes it hard to verify by looking at one.
It also makes hand-maintained annotations fragile at scale, since adding a language means editing every existing page.
The three errors that discard a set
An invalid code: a language code that does not exist, or a region code where a language code belongs. Invalid values are ignored outright.
A relative URL, which is not accepted — every reference must be absolute, including scheme and host.
A reference to a URL that redirects, is blocked from crawling, or carries a canonical tag pointing somewhere else. The target must be an indexable page that references back.
A fourth, subtler one: declaring a version that does not really exist, which sends a searcher to a page that is not in the language promised.
Each of these is exact, which is why they are detectable rather than a matter of judgement.
The canonical tag interaction
Each language version must be canonical for itself.
A canonical tag pointing from the French page at the English one tells search engines the French version should not be indexed, which cancels the annotation entirely.
That combination is common on sites where the canonical tags were configured before the translations existed.
The two mechanisms answer different questions — which URL is the reference, and which language each URL is — and contradicting each other resolves in favour of the canonical.
Which is why reading both together is the only way to diagnose a set that refuses to take effect.
Where to declare them
In the HTML head, which is the easiest to verify by viewing source.
In HTTP headers, which is the only option for non-HTML files such as PDFs.
In the XML sitemap, which scales best because one file describes every set without editing any page.
Only one method per set. Mixing them produces contradictions resolved unpredictably.
On a large multilingual site the sitemap method is the one that survives, precisely because reciprocity is maintained in one place.
What they do not do
They do not improve ranking. A page with no visibility gains nothing from adding them.
They do not consolidate or divide ranking signals between versions, which is what canonical tags do.
They do not create translations, and declaring one that does not exist is worse than declaring nothing.
They decide which existing version is shown to whom, which is a real problem and a narrower one than it is usually sold as.
How to check it yourself
View source on each version and confirm every one references every other, including itself.
Confirm every reference is an absolute URL with scheme and host.
Confirm each referenced URL returns 200 rather than redirecting, and is not blocked in the robots file.
Read the canonical tag on each version and confirm it points at that version rather than at another language.
Check the language codes against the registry rather than assuming — the common mistakes are plausible-looking and wrong.
How VeriFixScan detects it
`seo.lang` reports the language declaration of the page and the annotations present in the served markup.
`seo.canonical` reports the canonical tags, which is where the most common cancellation is found.
`seo.sitemap` reads the sitemap, which is where annotations are declared on larger sites.
`seo.noindex` reports indexability, since a reference to a non-indexable page breaks the set.
Reciprocity can only be verified across the pages a crawl reached, so a reference outside that set is reported as unverified rather than as correct.
Frequently asked questions
- Do I need a self-referencing annotation?
- Yes, and it is the one most often omitted. Every page in a set references every page in the set, itself included, or the set is discarded.
- Will hreflang improve my rankings?
- No. It decides which language version is shown to whom. A page with no visibility gains nothing, and the annotations neither consolidate nor divide ranking signals.
- Why is my correct annotation not working?
- Check the canonical tag on each version. A canonical pointing at a different language version tells search engines not to index that version, which cancels the whole arrangement.
Sources
Related
VeriFixScan crawls a site and applies its checks to every page it reaches, keeping the evidence behind each finding. Scanning one website is free.
Scan a website