The fix, in one snippet
{% for loc in locales %}
<link rel="alternate" hreflang="{{ loc.code }}" href="{{ loc.url }}">
{% endfor %}
Illustrative values. Change the paths, hostnames and options to match your own site before using it.
The sections below explain what is tested, why it matters and the alternatives.
What we test
For each hreflang annotation whose target we also crawled, we check whether that target names the source page back. One-way pairs are reported with both URLs.
Targets outside the crawl cannot be checked, so this verifies the pairs we can see rather than the whole cluster.
Why it matters
Google's documentation is explicit: annotations must be confirmed from both sides, and unconfirmed ones are disregarded. This is a deliberate anti-abuse measure, since otherwise any site could claim to be the regional alternate of any other.
The result of a missing return link is that the cluster silently stops working. Nothing errors, nothing is reported on the page, and the regional targeting simply does not apply, which is why these faults survive for years.
The usual cause is templating: each locale generates its own alternates from its own list, and one locale's list is out of date. Every page in a cluster needs the complete set, including a link to itself.
How to fix it
Generate the annotations for an entire cluster from one shared list, and render the identical block on every member:
{% for loc in locales %}
<link rel="alternate" hreflang="{{ loc.code }}" href="{{ loc.url }}">
{% endfor %}
<link rel="alternate" hreflang="x-default" href="{{ default_url }}">
Each page must include itself in the set. Confirm with Search Console's International Targeting report, which lists "no return tags" errors with the specific URLs. For large sites, moving the annotations into the sitemap makes the symmetry mechanical rather than a matter of template discipline.
Where this fits
hreflang return links missing is check 3 of 3 that the seo & site health audit runs under international targeting, ordered the way they are worth fixing. That ordering is the point: Fixing this one while the check above it still fails buys less than it looks like.
Fix this one first
Above it in the same category sits hreflang annotations invalid (medium), where hreflang tells search engines which language and region each version of a page is for. An attacker who has that does not need this, so it is the better use of the same hour.
Found in the same scan
The seo & site health audit reports this alongside checks from other categories that are at least as serious, including Broken internal links, where an internal link that returns an error is a dead end for the reader and a wasted request for the crawler, and Crawl errors (4xx / 5xx), where uRLs reached during the crawl that returned a client or server error. A single run of seo & site health audit answers all of them at once.
The first few lines
You are a senior web engineer. I ran a security and SEO scanner against my site and it reported the finding below. Fix it properly rather than suppressing the symptom.
Finding: hreflang return links missing (medium severity)
Scanner check id: seo-hreflang-return
The rest of this prompt names the pages and line numbers we found the problem on, the configuration to change, and the constraints a good answer has to respect. It is free, it just needs an account so the work is not scraped wholesale.
Sign in with GoogleSigning in is free and takes one click. We store your email address and nothing else.