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.
Any page that carries hreflang. Up to 25 pages in the set are fetched, including alternates that only the other alternates declare.
Each row is a page; each cell says whether that row declares the column. A broken pair is an asymmetric cell.
Problems first. Every rule is Google’s unless it says otherwise.
What each URL actually returned: status, redirects, canonical, robots, and every annotation it carries.
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.
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.
https://example.com/foo, not //example.com/foo or /foo.es-LA for Laos.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.
Being plain about the limits, because a checker that reports confidently on things it cannot see is worse than no checker:
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.
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.