ShipworkSite inspection
Hreflang

Crawlability

PaginationAre paginated pages set up right?Internal searchIs site search eating crawl budget?URL parametersAre parameters creating duplicates?Log analyserWhat does Googlebot actually crawl?Robots builderNeed a robots.txt file?Soft 404sAre pages “not found” but returning 200?JavaScriptCan crawlers see it without running JS?FreshnessIs my site quietly going stale?Robots.txtDoes robots.txt say what I think?

Indexing

Sitemap lastmodAre my sitemap dates valid?SitemapIs my sitemap actually fetchable?IndexingIs Google allowed to index my pages?CanonicalsIs Google indexing the wrong URL?Index signalsDo sitemap and index signals agree?Sitemap generatorNeed a sitemap.xml for my site?Bulk URL statusWhere does each of these URLs really land?Redirect builderNeed the redirect rules?RedirectsAre my URLs answering directly, over HTTPS?

On-page

Keyword ideasWhat are people searching for?SERP previewHow does my page look in Google?Content qualityAre your pages too thin or too alike?Image weightAre images slowing the page?CannibalizationAre pages competing with each other?On-page checkDoes the page use its target phrase?ImagesAre my images accessible and loading?Meta tag builderWhat should my title and share tags say?DuplicatesDo my pages compete for one query?

Links

Orphan pagesWhich pages can no link reach?Link graphHow deep do your pages sit?Anchor textDo links say what they point at?Outbound linksAre external links still alive?Broken linksAre internal links sending visitors nowhere?

Structured data

Rich resultsIs my markup eligible for a rich result?Structured dataIs my product schema valid?Schema coverageDo my key pages carry structured data?Social previewHow does my page look when shared?Schema vs pageDoes markup match the page price?Schema builderNeed valid JSON-LD?

International

Hreflang sitemapDo page and sitemap hreflang agree?HreflangDo my language versions link back?Hreflang builderNeed the hreflang tags?Page DoctorWhy is this page not doing well?Redirect planMy site has dead links — what redirects do I write?Sitemap diffIs anything missing from my sitemap?Robots simulatorWhat does my robots.txt actually block?Can Googlebot?Can Googlebot fetch this URL?
Every error, explainedGuides
Pricing Learn Error guides Run free audit

+1 free check

Welcome to Shipwork

Sign in free and your next check this month is on us.

Continue with GoogleContinue with email

We email you a 6-digit code. No password.

No card needed. Reports and watches follow you to any device.

All errorsHreflang not reciprocal

Why a hreflang cluster only works when every version links back

What the error means

Hreflang declarations form a group: every alternate must list the others, and each listed page must link back. When a language version does not return the link — or points at a URL that 404s, redirects, or is blocked — Google treats the cluster as unreliable and may ignore it entirely, serving the wrong version to the wrong country.

Why Google rejects it

Reciprocity is how Google validates that the set of alternates was written deliberately rather than scraped or mistyped. A one-way hreflang — the home page lists six languages, but the German page lists none — fails that test, and the annotation that was supposed to route users stops routing anything.

Two language versionsEN links to DEDE links nowhere
One-way hreflang fails the reciprocity test.

How to fix it

  1. Make the set self-referential and complete: every URL in the cluster lists every member, including itself, plus the x-default where used.
  2. Use absolute URLs with the correct scheme, and make sure each target returns 200 to an outside request — a 403 from bot protection silently kills the cluster.
  3. Do not point alternates at URLs that redirect. List the final URL, or the annotation points at a move rather than a page.
  4. Combine hreflang with self-canonicals: an hreflang target that canonicalises elsewhere contradicts itself and is dropped.

Common causes

Only the source page lists the alternate

A language switcher or manually added head tags may be present on the main-language page but missing from translated templates. Google expects the alternate pages to confirm the relationship too. Inspect the source of both pages and compare their complete hreflang sets, including each page's self-reference.

The return link uses a different URL variant

One page may reference the HTTPS URL while its partner points to HTTP, www instead of apex, a trailing-slash variant, or a redirecting old path. The URLs look related in a browser, but the literal alternate values do not identify the same final pages. Compare each href with the canonical live URL.

A localized URL does not return a usable page

An alternate can return 404, 403, a redirect chain, or a page that requires a locale cookie. In that case the annotation does not reliably identify an accessible equivalent. Request the exact URL externally and confirm it loads the intended language or regional version directly.

A plugin or theme generates different sets by locale

Multilingual plugins can build alternate lists from translation relationships, while custom theme code may add another partial set. If a translation is unpublished or detached, one page can keep a stale reference that the other version no longer emits. Compare actual rendered tags across the full cluster.

Page tags and sitemap annotations conflict

Some sites publish hreflang in both HTML and XML sitemaps, then update only one source. One method may list a language version that the other omits or spells differently. Choose a source of truth or keep both generated from the same translation data, then check the relevant sitemap entry and page head.

Fix it on your platform

On Shopify

  1. List the actual language or market URLs Shopify publishes and confirm each translated page is active and accessible before treating it as an alternate.
  2. If an internationalization app generates hreflang, check its language assignment and URL mapping for each product or page; do not add a second hard-coded set to the theme without comparing the output.
  3. For custom theme output, inspect the published theme's <head> and ensure each localized URL emits its full alternate set plus itself.
  4. Use final HTTPS URLs in the annotations. If a market domain redirects to the primary domain, correct the mapping or use the intended final destination.

On WooCommerce

  1. Check the multilingual plugin's translation relationship for each affected page; the plugin can only emit reciprocal links when the translations are connected as equivalents.
  2. Inspect the active theme's rendered head and the plugin's sitemap output to find duplicate or conflicting hreflang sources.
  3. Publish the translation before expecting it in the alternate set, and confirm its permalink returns the localized page to a logged-out visitor.
  4. If you manage hreflang in custom code, generate all alternates from one mapping instead of maintaining separate language-specific snippets.

On other platforms

  1. Wix: check that each page is assigned to the correct language in the multilingual setup and that translated pages are published; inspect the published page tags.
  2. BigCommerce or Squarespace: inspect the active theme or multilingual integration that emits alternate tags and compare one page from each locale.
  3. For custom sites, store the language-to-URL mapping once and render the same complete, self-referencing set on every equivalent page.
  4. If both HTML and sitemap methods are in use, generate them from the same translation inventory and check that each URL uses its final canonical destination.

How to confirm it is fixed

  1. Choose two or more affected locale pages and compare their exact hreflang codes and absolute href URLs, including a self-reference on each page.
  2. Request every target URL directly from outside your logged-in session; confirm it returns the expected localized page without an error or redirect to another market.
  3. Run Shipwork's hreflang check to inspect page alternates and sampled return links, then use hreflang sitemap check if you also publish sitemap annotations.
  4. Use Search Console URL Inspection on representative URLs after publishing and allow time for Google to recrawl the localized pages.

Questions

How do I fix hreflang tags that are not reciprocal?
Make sure each equivalent page lists the same language or region versions, including itself, and that every referenced URL returns the intended page. Correct stale paths and publish the full set on each locale template or generate it from your multilingual plugin. Then compare the live source of both the original and translated URLs.
Does every translated page need a self-referencing hreflang tag?
Google's localized-page guidance says each variation should include a set of alternate links, one for each variant including itself. A self-reference helps make the complete relationship explicit. Check each page's rendered head or its sitemap entry rather than assuming that one language page's tags cover the others.
Can hreflang point to a URL that redirects?
Use the final URL for each language version rather than an old path that redirects. A redirecting, blocked or missing destination makes the alternate harder to process and can indicate a stale mapping. Open the exact href from the tag and confirm it directly serves the intended localized page.
Can I use both hreflang tags and a sitemap?
Google supports alternate annotations in page markup or sitemaps. If you use both, keep the sets consistent and generated from the same language mapping. Conflicting URL or language values make troubleshooting harder; a check can compare the page and sitemap declarations.
Why does Google show the wrong language page?
Hreflang is a signal that helps Google understand localized equivalents, not a guarantee of which URL will appear. First confirm that the alternate cluster is reciprocal, the localized pages are accessible and canonicalized appropriately, and each page genuinely serves the intended language or region. Google must recrawl the updated pages before reflecting changes.
Find out if this is happening to you

Shipwork reads your hreflang alternates, requests each target, and verifies the return trip — reporting alternates that are dead, redirecting, or that do not link back. Free, no account, no signup. Paste your store address.

Check my store for Hreflang not reciprocal

Other errors like this