Return links and self-reference, on a patch bay
Think of a hreflang set as a telephone patch bay. Each row is a page; each jack in that row is a link it carries to the page in that column. A connection only counts when both ends are plugged in: page X lists Y and Y lists X. The diagonal is each page listing itself.
The sample below has three faults. Find them by the red and amber lamps, then plug the gaps.
| page ↓ lists → | en | de | fr | es |
|---|---|---|---|---|
| enexample.com/ | ||||
| deexample.com/de/ | ||||
| frexample.com/fr/ | ||||
| esexample.com/es/ |
4 confirmed pairs 2 missing return links 1 missing self-reference
Click a jack to plug or unplug a link. A pair only counts when both pages list each other; the diagonal is each page listing itself.
That's exactly why the generator outputs one identical block for every page: if all rows are fully plugged, every pair is confirmed and every page lists itself.
All common hreflang errors
Missing return links (“no return tags”)
Wrong: en page lists de, but the de page has no link back to en
Fix: Put the identical, complete set on every version. If a version can’t carry it, remove that version from the others’ sets.
No self-referencing tag
Wrong: The de page lists en and fr, but not itself
Fix: Include the page’s own URL in its set, with the exact canonical URL.
Country code used as a language
Wrong: hreflang="jp", hreflang="uk", hreflang="se"
Fix: The first code is always a language: ja-JP, en-GB (or uk for Ukrainian), sv-SE.
Reserved or wrong region code
Wrong: en-UK, en-EU, fr-UN
Fix: Use assigned ISO 3166-1 alpha-2 codes: en-GB. Target EU countries one by one (de-DE, fr-FR…) or use the plain language.
Numeric region (es-419)
Wrong: hreflang="es-419"
Fix: Not supported by Google. Use es for all Spanish speakers plus specific countries (es-MX, es-AR) where you have them.
Underscore instead of hyphen
Wrong: hreflang="pt_BR"
Fix: pt-BR. Many CMSs store locales with underscores; convert them when printing tags.
Relative or protocol-relative URL
Wrong: href="/de/" or href="//example.com/de/"
Fix: Always write https://example.com/de/.
One code, two URLs
Wrong: hreflang="de" listed twice with different URLs
Fix: Each code should map to one URL per set. Merge or choose.
Alternates that redirect, 404 or are noindex
Wrong: href="http://example.com/de" that redirects to https://example.com/de/
Fix: Reference the final 200, indexable URL.
Canonical pointing to another language
Wrong: The de page’s canonical is the en page
Fix: Make every version self-canonical. See hreflang and canonical.
Tags outside the head
Wrong: <link hreflang> injected into <body>, or after an element that closes the head early
Fix: Place the link elements in the <head>; a stray <img> or <div> in the head can end it early for parsers.
Finding errors on your site
Google retired the International Targeting report in Search Console in 2022, so hreflang problems no longer show up there. Test a live URL and all its alternates with the hreflang checker, or paste tags or a sitemap into the hreflang validator. For codes, use the language code and country code tables.
Hreflang error questions
What does “no return tags” mean in hreflang?
Page A lists page B as an alternate, but page B does not list page A. Google requires the link in both directions; without it the pair may be ignored. The fix is to put the same complete set on every version.
What is a self-referencing hreflang tag?
The line in a page’s hreflang set that points to the page itself. Google says each language version must list itself as well as all other versions.
Why is en-UK flagged as an error?
UK is not the ISO 3166-1 alpha-2 code for the United Kingdom; GB is. Google explicitly says UK, EU and UN in hreflang have no effect.
Can hreflang errors hurt rankings?
Broken hreflang does not trigger a penalty. The cost is that Google ignores the annotations, so it may show the wrong language or regional URL to searchers.
Where can I see hreflang errors for my site?
Google retired Search Console’s International Targeting report in 2022, so use a crawler or this site’s checker (live pages) and validator (pasted tags or sitemaps).