A multi-market website can have correct language tags on one page and still have a broken language set because the corresponding page omits the return link, uses a non-equivalent URL, or points its canonical elsewhere. Audit each page relationship as a small graph: which URLs are genuine versions of the same page for different languages or regions, and do all members describe the same set?
Google recommends separate URLs for language versions and supports hreflang annotations to help Search show an appropriate variant. The annotations require reciprocal references: if page A lists page B, page B must list page A. Codes must identify a language using ISO 639-1 and may include a region using ISO 3166-1 Alpha 2; a region without a language is invalid. Some commonly used labels such as UK do not work as an assigned region code for this purpose; use the correct code for the intended market, such as en-GB. Localized versions of pages · Managing multilingual and multi-regional sites
Define the page set before checking the tags
Do not start with a list of language codes. Start with the actual page equivalents. A product page for a different model, an offer with another currency, or a service unavailable in a market may not be an equivalent merely because the template is similar. If a localized version does not exist, do not invent a URL to fill the matrix. If the destination is a language selector for unmatched users, x-default can identify that fallback; it does not substitute for the language and region variants that do exist.
For every page set, create a row for each intended alternate:
| Set ID | Locale | Source URL | Expected canonical | Expected alternates | Relationship reason |
|---|---|---|---|---|---|
| product-123 | en-GB |
/uk/products/widget/ |
same URL | en-US, ar-SA, x-default if used |
Same product, UK offer and copy |
| product-123 | en-US |
/us/products/widget/ |
same URL | en-GB, ar-SA, x-default if used |
Same product, US offer and copy |
| product-123 | ar-SA |
/sa/ar/products/widget/ |
same URL | en-GB, en-US, x-default if used |
Same product localized for Saudi Arabia |
The values are illustrative only; actual URL paths and locale targets must match the site. Record market differences such as availability, price, shipping, terms, or product variants. If a page serves the same language across several regions with no material regional variation, decide whether those URLs are genuinely distinct and worth maintaining before adding a separate hreflang target.
Check the annotation graph in both directions
Fetch each URL in the set and extract its declared alternates from the chosen implementation: HTML <link rel="alternate" hreflang> elements or the corresponding sitemap annotations. Google supports these methods; use one consistently for a page set where possible, so two sources do not drift apart. Include the page itself as an alternate, and ensure the same intended members and codes are listed consistently on each equivalent page.
For each declared edge A → B, verify B is a valid destination and has the reciprocal edge B → A. Then verify that each member links to itself with the correct code. A set with missing reciprocal links may be ignored or interpreted incorrectly. A one-way relationship is not repaired by adding x-default to a page selector.
Validate the locale values syntactically and semantically. A language code must identify the page's actual visible language; a region should describe the audience when that distinction is meaningful. Do not use region-only values or informal country labels. Google determines a page's language from its visible content rather than a lang attribute alone, so check that the main content and navigation match the declared language. Avoid forced redirects that prevent people or crawlers from viewing other versions.
Inspect canonical, response, and destination behavior
An alternate tag pointing at a redirect, 404, blocked page, or unrelated product cannot serve the intended user. Check that each target resolves to a working final URL and that internal links and sitemap entries use the correct canonical route. Inspect canonical tags separately: if a distinct regional page is intended to be indexable as its own variant, investigate a canonical that points to a different market or language before changing it. Do not mass-rewrite canonicals solely to make a validator pass; first confirm the site’s page-equivalence and URL policy.
Normalize URLs only for comparing the audit inventory, not to silently alter live URLs. Watch for case sensitivity, trailing-slash policy, query parameters, HTTP/HTTPS, alternate hostnames, and duplicate routes. Record the HTTP status, final URL, canonical, visible language, market details, and annotation set for every page. Keep the exact source URL so a developer can reproduce the finding.
Build an exception queue instead of a 12-country spreadsheet trap
For a large network, keep a page-set table and compute exceptions: missing self-reference, missing return edge, invalid language or region code, unexpected URL, non-200 target, redirect target, canonical mismatch, or content that is not a true regional equivalent. Group by template and locale so one template defect can be fixed systematically, while content-specific exceptions get human review.
Start with the most important page types and a representative sample, then expand coverage. Use Search Console international targeting signals only where available in current reporting; tools and reports change. A third-party checker can help enumerate tags, but verify critical pages in rendered HTML and by inspecting their live URL. A clean tag report confirms implementation checks, not indexing, ranking, or traffic stability.
Hreflang page-set audit sheet
Set ID: [product/article/location family]
Page variants: [locale → canonical URL]
Equivalence rule: [same product, service, or content task]
Annotation method: [HTML / sitemap]
Missing self-reference: [URLs]
Missing reciprocal edge: [A → B without B → A]
Invalid locale code: [value and target URL]
Target response/final URL: [status and redirect chain]
Canonical mismatch: [observed / expected / reason]
Visible language and market match: [evidence]
Decision owner: [content / development / SEO]
Short-video script: Find the broken hreflang relationship
Opening: “Hreflang is not a list of countries—it's a relationship between equivalent pages.”
Visual: Show two pages, A linking to B, then B missing the return reference.
Narration: “Map the real localized page set, check each URL’s language and region code, include self-references, and verify every page points back to its alternates. Then check that the targets load and the canonical matches your intent.”
Close: “Fix the relationship that is actually broken; don't rewrite every URL just to clear a tool warning.”
Educational carousel: Seven checks for a regional hreflang set
- Cover: “Audit page relationships, not just locale codes.”
- Group only genuine language or regional equivalents.
- Confirm each URL is the right page for its market.
- Include self-references and reciprocal alternates.
- Validate language and region codes; avoid region-only values.
- Test targets, redirects, status codes, and canonicals.
- Review exceptions manually; a clean tag test does not guarantee rankings.
Field experiment thread: Validate one template before scaling
1/ Choose one stable page type and a small set of markets with real equivalent URLs. Capture the live annotations, status, final URL, canonical, and visible language before making changes.
2/ Build an expected adjacency matrix: rows are source pages, columns are target pages. Mark an edge only when the target is a true equivalent; mark self-edges explicitly.
3/ Compare actual and expected edges in both directions. Record missing return links, invalid codes, unavailable URLs, redirects, and canonical mismatches as separate exception types.
4/ Fix one template or page set, deploy through the normal review path, and re-fetch every member. Confirm no unrelated market URL or canonical changed.
5/ Expand the checker only after the sample behaves correctly. This validates annotation completeness; it does not measure or guarantee ranking recovery.
Tool-neutral prompt pack: Audit localized URL relationships
Prompt 1 — Page equivalence
Given this URL inventory and page metadata [data], group only pages that are true language or regional equivalents. Explain the evidence for each group and flag uncertain product, currency, availability, or content differences. Do not invent missing variants.
Prompt 2 — Graph validation
Compare the expected alternates [matrix] with the live annotations [HTML or sitemap data]. Report missing self-references, missing reciprocal edges, extra URLs, invalid locale codes, and unreachable targets. Keep each issue tied to source URL and target URL; do not modify the site.
Prompt 3 — Safe remediation plan
Prioritize these hreflang exceptions [findings] by affected page set, template scope, user impact, and evidence. Separate code defects from content-equivalence and canonical decisions. Propose tests and rollback checks; do not recommend a mass URL or canonical change without confirming the URL policy.
Stop-doing swipe file: Replace locale-count fixes
Stop: “Add all 12 country codes to every page.”
Use: “List only the real equivalent pages for this content, market, and offer.”
Stop: “One page points to the English page, so the set is done.”
Use: “Check the self-reference and the return link from every member.”
Stop: “The hreflang validator is green, so rankings are safe.”
Use: “The syntax passed. We still need to verify page equivalence, canonicals, responses, and live search evidence.”
Stop: “Set every canonical to the default market.”
Use: “Confirm whether each regional page is distinct and inspect the intended canonical policy before changing it.”
Hook–Value–Template: Fix the edge, then verify the set
Hook: “A hreflang loop often breaks because one page in the set forgot to point back.”
Value: A page-level relationship map exposes reciprocity, code, URL, and canonical errors without assuming that every locale should share the same target list.
Template: “Page [A] declares [locale] → [B]. Page [B] [does/does not] return the edge. Both pages [do/do not] self-reference. The URL [status/final destination], declares canonical [value], and visible content [language/market]. The pages are [equivalent/not equivalent/uncertain] because [evidence]. Next action: [fix / editorial decision / leave unchanged].”
Example: “The UK page declares the US page as en-US, but the US page omits the UK return link. Both URLs return 200, but the UK page canonical points to its own UK URL. The pages use the same product family with different currency and shipping terms. Fix the missing reciprocal annotation in the shared template, then recheck the full set; do not redirect either market.”
Use the audit to make a specific page relationship correct. Do not treat the number of locales or a green checker as a search-performance result.