hreflang checker

A tag that looks right on one page means nothing until the other page returns it. Enter one URL: the checker fetches it, then every alternate it declares, and shows which pairs point back — and which ones Google ignores.

Free, no emailChecks the whole setAddress recorded, not pages

Page to check

Any page that carries hreflang. Up to 25 pages in the set are fetched, including alternates that only the other alternates declare.

Why you have to check the whole set

Almost every hreflang tester reads one page and tells you whether its tags are well formed. That catches typos. It cannot catch the failure that matters most, because that failure is not on the page you are looking at.

Google is explicit about the rule: “If two pages don’t both point to each other, the tags will be ignored.” A German page can carry a perfect set of annotations and still be ignored, because the English page it points at never points back. Nothing on the German page is wrong. The only way to see the problem is to fetch the other page and compare — and on a site with ten markets, to do that for every pair.

That is what this checker does. It fetches the page you enter, follows every alternate it declares, follows any further alternates those pages declare, and then checks each pair from both ends.

Reading the matrix

Rows are the pages doing the declaring; columns are the pages being declared. A healthy set is a solid block of ✓ with ● down the diagonal, because every page lists itself and every page lists every other.

A missing return tag shows up as a pair of cells that do not mirror each other: a ✗ where one page declares the other without being declared back, and a ○ in the opposite corner where the return tag should be. You can spot a broken market across a whole row at a glance, which is the point of drawing it rather than listing it.

What it checks

  • Return tags. Every declared pair, from both sides.
  • Self-references. Google: “Each language version must list itself as well as all other language versions.”
  • Fully-qualified URLs. Google: alternate URLs must include the transport method, so https://example.com/foo, not //example.com/foo or /foo.
  • Valid codes. Against the whole of ISO 639-1 and ISO 3166-1, with the same rules as the hreflang generator — including the valid codes that mean somewhere else, like es-LA for Laos.
  • Duplicates and x-default. The same code pointing at two URLs, one URL declared in two different languages, more than one x-default, or none anywhere in the set.
  • Redirects, errors and canonicals. Declared URLs that redirect or fail, and pages whose canonical points somewhere else while they carry hreflang — two signals that contradict each other.
  • Both methods. Annotations in the HTML head and in the HTTP Link header. Google says using several methods at once brings no benefit; the checker flags it because two copies tend to drift apart.

One thing it deliberately does not flag: several hreflang values pointing at the same URL. Google’s John Mueller has confirmed that is allowed — en-GB, en-IE, en-NL and en-BE can all point at one English page for Europe. Two different languages on one URL is flagged, because a page is rarely written in both.

What it cannot see

Being plain about the limits, because a checker that reports confidently on things it cannot see is worse than no checker:

  • hreflang in XML sitemaps. Large sites often declare hreflang only there. If a page shows no annotations, check the sitemap before concluding there are none.
  • Tags added by JavaScript. The checker reads the HTML the server sends, not what a browser builds afterwards.
  • Sites that block automated requests. Some answer with a bot check instead of the page. The checker recognises the common ones and marks the page unknown, rather than reporting a missing return tag that is really a firewall.
  • Redirects by location. The fetch comes from Cloudflare’s network, so a site that redirects by country may show the checker a different page than your visitors see.
  • Sets larger than 25 pages. The checker says how many further URLs it found and did not fetch.

What happens to the URL you enter

Unlike the generator and the calculator, this one cannot run entirely in your browser: a browser is not allowed to fetch other sites’ pages. So the URL goes to this site’s server, which fetches the public pages and returns only the hreflang signals — never the page contents. The address you check is recorded, with how many pages were in the set and what failed; the pages themselves never are. The requests identify themselves as JorgeHorstHreflangChecker, so site owners can see what they were.

Once the tags are right, the next question is whether the pages behind them are worth ranking. That is where most international sites actually lose, and it is covered in the international SEO audit checklist.

Questions

Check the whole set, not one page. Every page has to list itself and every alternate, and every alternate has to list it back — Google says that if two pages don’t both point to each other, the tags are ignored. One page’s source cannot show that; you have to fetch each alternate and compare, which is what this checker does.
The annotation on page B that points back to page A, when A already points to B. hreflang is a mutual declaration: A → B only counts if B → A exists too. A missing return tag produces no error message anywhere, which is why it is the most common way hreflang fails.
Yes. Google’s John Mueller has confirmed it — for example en-GB, en-IE, en-NL and en-BE all pointing at one English page for Europe. What is usually a mistake is one URL declared in two different languages.
Usually because the site answered with a bot check instead of the page, or the page took longer than eight seconds. Either way the page is shown as unknown rather than broken, so a firewall never gets reported as a missing return tag.

Sources