Shopify Markets: Audit Hreflang and Canonical Output
Use a two-market worksheet to find conflicting hreflang sources, wrong canonical targets and broken locale destinations.
When Shopify Markets, a theme and an SEO app all touch language annotations, inspect what the storefront actually emits before adding code. One well-maintained source is easier to verify than several competing sets of tags.
Shopify's current documentation says automatic hreflang annotations are output through content_for_header and warns about conflicting manual additions. This article supplies an audit procedure and fictional fixtures, not a hands-on test of a merchant account.
Choose a small representative set
Start with the homepage, a product and a collection in two configured markets. Record the expected customer destination first. Language-region codes describe the intended audience; an unfamiliar combination is not invalid merely because it is uncommon.
| Resource | English US | French Canada | Check |
|---|---|---|---|
| Home | https://example.com/ | https://example.com/fr-ca/ | Each destination works without login |
| Shirt | /products/linen-shirt | /fr-ca/products/chemise-lin | Translated handles resolve correctly |
| Collection | /collections/summer | /fr-ca/collections/ete | Annotations connect equivalent pages |
The localized handles above are invented. Do not paste them into a real theme.
Compare intended and delivered tags
An illustrative localized product might declare:
<link rel="canonical" href="https://example.com/fr-ca/products/chemise-lin">
<link rel="alternate" hreflang="en-US" href="https://example.com/products/linen-shirt">
<link rel="alternate" hreflang="fr-CA" href="https://example.com/fr-ca/products/chemise-lin">
Now suppose an app adds another fr-CA annotation pointing to the homepage. That is a concrete conflict: one audience code has two destinations for the same resource. Find the emitting source instead of appending another corrective tag.
Paste annotations into the hreflang checker and compare canonical output in captured snapshots with the HTML SEO diff. Fetch both destinations and check reciprocal annotations manually. A valid-looking snippet cannot establish that the other page is reachable or links back.
Audit worksheet
| Field | Record for each locale URL |
|---|---|
| Expected market and resource | The product/collection this customer should see |
| HTTP result and final URL | A response and redirect destination, not just the browser address |
| Canonical | Every emitted canonical and whether its target is intended |
| Alternate map | Code → full URL; preserve duplicates for review |
| Reciprocal set | What the linked locale page actually emits |
| Owner | Shopify automatic output, theme, app, or unknown |
| Indexed inspection | Google's selection if available, with date |
Choose one layer to own annotations. If a custom multi-store arrangement needs manual output, follow Shopify's current instructions and verify the whole cluster before disabling automatic tags. Avoid hardcoded handles in a global template: the same code runs on many resources.
Do not diagnose by the duplicate label alone
Two regional pages can be similar; hreflang does not make them different products or compel Google to index both. Confirm the business reason for the market versions and inspect declared versus selected canonicals. Do not invent local text solely to make a difference score rise.
For Google's implementation requirements, consult localized page versions. If the issue affects ordinary product variants rather than markets, use the variant URL guide.
Publish and verify
Keep a saved copy of the affected template/app settings. After the change, repeat the same sample and record the resulting tags, destination responses and date. Expand testing to another template and a translated handle. Mark anything not inspected as unknown; passing six URLs does not establish that every market URL is correct.