Skip to content

Duplicate Content · Auto-canonicals

Shopify Auto-Canonicals: What They Do, When They Break

Shopify auto-emits a canonical link tag on every page of every store. The verbatim Shopify SEO overview statement: canonical tags are auto-generated "to prevent duplicate content from appearing in search results"1. The canonical points each product, collection, page, and blog post back to its primary URL — meaning the same product reachable at /products/handle and /collections/foo/products/handle resolves to one canonical for search engines. Four cases break this default; this article names each.

Published Verified 2026-05-22

What Shopify auto-emits on every page

Every Shopify theme that follows the Dawn-derived starter pattern emits a self-referencing canonical via the canonical_url Liquid object inside theme.liquid's head. The default tag points each resource back to its primary URL — /products/handle for products, /collections/handle for collections, /pages/handle for pages, and /blogs/BLOG/ARTICLE for blog articles. Per Shopify's SEO overview, this auto-canonicalisation is one of the platform's built-in protections against duplicate content in search.

In theme code, the standard pattern in theme.liquid looks like a <link rel="canonical" href="{{ canonical_url }}"> tag. The Liquid object canonical_url resolves to the page's primary URL at render time. Shopify's themes ship with this tag in the head; the SEO FAQ2 references theme.liquid as the place to debug missing head elements when something looks off.

The canonical works with two other platform defaults: the auto-generated /sitemap.xml (which only ever lists primary URLs) and the default /robots.txt block on /collections/*+* and /search3. Together these three mechanisms keep the duplicate URL surface narrow without merchant configuration.

How canonicals work on a Shopify store

A canonical link element is a hint to search engines about which version of a URL is the master. When Google crawls /collections/dresses/products/linen-shirt and finds a canonical pointing to /products/linen-shirt, it consolidates ranking signals (links, engagement, freshness) into the canonical URL and treats the variant as a duplicate. The same applies to Bing and to AI shopping engines that respect the canonical signal. Shopify's auto-canonical is self-referencing for primary URLs and target-redirecting for variant URLs.

Google's canonical documentation4 confirms self-referencing canonicals are valid and recommended for unique pages. The variant case (collection-prefixed product URL pointing to the bare product URL) is the more interesting one — this is where Shopify's auto-canonical earns its keep against the duplicate URL pattern every Shopify store generates.

One detail worth knowing: a canonical is a hint, not a directive. Google can ignore the canonical if the variant page has stronger external signals (more inbound links, fresher content, etc.). In practice this rarely happens on a Shopify store with the default setup because the auto-canonical, the sitemap-only-lists-primary-URLs default, and the robots.txt blocks all push the same way.

Four cases where the auto-canonical breaks

The auto-canonical fails in narrow but real cases. (1) Custom-coded theme templates that removed the canonical_url tag from theme.liquid or main-product.liquid. (2) Third-party page-builder apps (PageFly, Shogun, Replo) that re-render the head and omit the canonical. (3) Stores using the within: collection Liquid filter on product links without a canonical override, generating crawlable collection-prefixed URLs that bypass the auto-canonical. (4) International stores with sub-folder routing where the canonical points to the wrong language variant. Shopify's SEO FAQ confirms the debug path: inspect theme.liquid, main-product.liquid, and main-list-collections.liquid.

Case 1 is the most common on stores with custom themes commissioned 2018-2022 — agencies sometimes stripped the canonical tag thinking they could re-add it later, and then forgot. Case 2 is the highest-impact case on growing stores: a page-builder app installed for a new landing page rebuilds the <head> with its own template, and the canonical is silently dropped. Case 3 is the rarest but trips up developers using within: collection in product loops — the resulting links carry the collection prefix and the auto-canonical does not catch them unless the canonical override is explicit.

Verifying the canonical with one curl

A single curl command returns the canonical tag for any URL. The pattern is curl piped through grep on the word 'canonical'. The expected output for a primary URL is a self-referencing canonical; for a variant URL like /collections/foo/products/handle, it's a canonical pointing to the bare /products/handle. Any other output is a bug to fix.

bash Verify the canonical for a product URL
 # Self-referencing canonical (expected for primary URL) curl -sL https://yourstore.com/products/linen-shirt | grep -i 'canonical' # Variant URL — expect canonical pointing to bare /products/handle curl -sL https://yourstore.com/collections/all/products/linen-shirt | grep -i 'canonical' # If output is missing or points to the wrong URL, audit theme.liquid and # any page-builder app templates active on the affected route. 

Run this across the homepage, a product, a collection, a page, and a blog article. Five checks cover the platform. For bulk auditing, Screaming Frog or Sitebulb both report canonical tags at the URL level — the right tool for stores with thousands of products.

Manual canonical override — when and how

Manual canonical override is justified in three cases. (1) A page-builder template that omits the canonical — add the link element in the page-builder's head settings. (2) International stores using subdomains or sub-folders where the auto-canonical points to the wrong locale — override via theme.liquid with a locale-aware Liquid block. (3) Cross-domain canonicalisation (rare on Shopify, e.g. a Shopify store syndicating content from a primary domain) — override with the full external URL. Never override a self-referencing canonical to point elsewhere unless one of these three conditions applies.

The override pattern in theme.liquid replaces the default <link rel="canonical" href="{{ canonical_url }}"> with an explicit URL. For an international setup, the Liquid logic checks request.locale.iso_code and emits a locale-specific canonical. For a page-builder template, the override is per-template inside the page-builder's settings panel rather than in theme.liquid.

For the broader duplicate-content picture — the /products/ vs /collections/products/ pattern Shopify auto-canonicals were designed for — see /shopify-seo/collections-products-canonical/. For filter URLs and the /collections/*+* pattern, see /shopify-seo/filtered-collections/.