E-commerce canonical: variants, filters, pagination
Canonical tags are often misused on e-commerce sites. Here are 4 concrete cases—variants, filters, pagination, languages—and the right setup.

E-commerce canonical: variants, filters, pagination
The <link rel="canonical"> tag is one of the most powerful SEO tools — and one of the most misused on e-commerce sites. When configured correctly, it resolves duplicate content, consolidates SEO authority, and helps manage the thousands of technical URLs a catalog generates.
Here are the 4 concrete cases you’ll find on 90% of stores, and the right implementation for each.
Self-referential canonical: the foundation
Every page on your site should have a canonical that points to itself. It feels counterintuitive at first, but that’s the rule.
<!-- Page: https://example.com/products/chaussure-derby -->
<link rel="canonical" href="https://example.com/products/chaussure-derby" />
Why:
- It tells Google that this URL is the reference version (not a copy, not a variant)
- It protects against stray parameters (UTM, tracking, etc.): if someone links to
/products/chaussure-derby?ref=newsletter, Google sees the canonical and knows the real URL is the clean version - It helps normalize URLs with/without a trailing slash, with/without www, http vs https
Without a canonical, Google has to guess which URL to canonicalize, and its choices are not always optimal.
Case 1 — Product variants
This is the most common case. One product with 5 colors × 4 sizes = 20 variants. Each variant can potentially have a distinct URL:
/products/chaussure-derby ← parent product
/products/chaussure-derby?variant=12345 ← black size 44 variant
/products/chaussure-derby?variant=12346 ← black size 45 variant
/products/chaussure-derby?variant=12347 ← brown size 44 variant
On most platforms (Shopify, WooCommerce), variants change the displayed price and images but do not create a real new page — just the same page with a different state.
Canonical implementation:
<!-- On ALL these URLs, the canonical points to the parent -->
<link rel="canonical" href="https://example.com/products/chaussure-derby" />
Even if the current URL is ?variant=12346, the canonical is the parameter-free version. Google consolidates all link equity on the parent URL, and the variants never appear in the SERP.
Common mistake: letting each variant self-canonicalize with its own parameter. Result: Google sees 20 near-identical pages and ranks none of them properly.
Case 2 — Variants with separate pages
If your catalog treats variants as standalone pages with clean URLs (example: /products/chaussure-derby-noir-44), the logic changes.
If the variants have distinct SEO content (different title, adapted description, distinct reviews):
- Self-referential canonical on each variant
hreflangor internal linking logic to connect them
If the variants share 90%+ of the content:
- Canonical to one “main” variant (usually the most popular)
- Or canonical to the generic parent product
Example:
<!-- /products/chaussure-derby-noir-44 -->
<link rel="canonical" href="https://example.com/products/chaussure-derby-noir" />
<!-- /products/chaussure-derby-noir-45 -->
<link rel="canonical" href="https://example.com/products/chaussure-derby-noir" />
Result: Google indexes chaussure-derby-noir as the canonical version, and the specific sizes do not appear in the SERP.
Case 3 — Category pagination
You have a “Shoes” category with 200 products, paginated across 10 pages:
/collections/chaussures ← page 1
/collections/chaussures?page=2 ← page 2
/collections/chaussures?page=3 ← page 3
2026 approach (post rel=next/prev):
Google deprecated support for rel=next/prev in 2019. Today’s best practice:
<!-- On /collections/chaussures -->
<link rel="canonical" href="https://example.com/collections/chaussures" />
<!-- On /collections/chaussures?page=2 -->
<link rel="canonical" href="https://example.com/collections/chaussures?page=2" />
<!-- On /collections/chaussures?page=3 -->
<link rel="canonical" href="https://example.com/collections/chaussures?page=3" />
Each page is self-referential — they contain different content (different products), so they deserve to be indexed separately.
Do NOT do this: canonicalize all paginated pages to page 1. This is a common mistake. Result: Google indexes only page 1, and your products on pages 3–10 become invisible.
Case 4 — Faceted filters
This is the most complex case. A category with filters:
/collections/chaussures ← unfiltered
/collections/chaussures?color=noir ← filtered by color
/collections/chaussures?color=noir&size=44 ← filtered by color + size
/collections/chaussures?sort_by=price-asc ← sorted by price
Three possible strategies:
Strategy 1 — Canonicalize all filtered variants to the parent category
<!-- On /collections/chaussures?color=noir -->
<link rel="canonical" href="https://example.com/collections/chaussures" />
Simple. Works if you do not want filtered pages indexed. Trade-off: queries like “black shoes” will not rank to the right filtered page.
Strategy 2 — Clean URLs for important filters, self-canonical
For combinations with strong search volume, create clean URLs:
/collections/chaussures-noir
/collections/chaussures-noir-homme
Each URL has its own self-referential canonical, and parameterized URLs (?color=noir) canonicalize to these clean versions.
Strategy 3 — Block filtered URLs via robots.txt
Do not let Google crawl them at all. See e-commerce robots.txt.
Recommendation: Strategy 2 for commercially important filters, Strategy 3 for infinite combinations.
Canonical and i18n: don’t confuse it with hreflang
Classic trap. You have an FR page and its EN translation:
/fr/products/chaussure-derby
/en/products/leather-derby-shoes
❌ Mistake: setting a canonical from the EN version to the FR version.
<!-- On /en/products/leather-derby-shoes -->
<link rel="canonical" href="https://example.com/fr/products/chaussure-derby" />
Consequence: Google ignores the EN version, treats it as a duplicate of FR, and does not index it.
✅ Best practice: each localized page has its own canonical + hreflang.
<!-- On /en/products/leather-derby-shoes -->
<link rel="canonical" href="https://example.com/en/products/leather-derby-shoes" />
<link rel="alternate" hreflang="en" href="https://example.com/en/products/leather-derby-shoes" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/products/chaussure-derby" />
See our full guide on multilingual e-commerce hreflang.
Implementation by platform
Shopify
Shopify automatically generates a canonical on each product, pointing to the clean URL without parameters. Usually correct by default. You can override it in the template:
<!-- theme.liquid in the <head> -->
<link rel="canonical" href="{{ canonical_url }}" />
For URLs with variant parameters, Shopify canonicalizes correctly by default.
WooCommerce
No native canonical on every page. SEO plugins (Yoast, RankMath, AIO SEO) handle this. All of them use a self-referential canonical by default, with page-level customization options.
Check with a site: search in Google or with Screaming Frog that every URL on your site has a canonical and that it points to the right URL.
Headless
Manual generation in each page component. In Next.js with generateMetadata, the alternates.canonical field handles this cleanly.
Canonical audit in 15 minutes
Steps:
- Crawl with Screaming Frog: the “Canonical” report identifies all URLs and their canonicals
- Filter anomalies:
- URLs without a canonical → fix them
- Canonicals pointing to a 4xx or 5xx URL → fix them
- Canonical chains (A → B → C) → simplify to A → C directly
noindexpages with a canonical → contradiction to resolve
- Check variants: for 10 products with variants, verify that all variant URLs have the correct canonical
- Check pagination: for each paginated category, verify self-reference on every page
FAQ
Is a page without a canonical penalized?
Not directly, but it is at risk. Google chooses its own canonical URL, which may not be the one you want. On an e-commerce store, always define the canonical explicitly.
Does Google respect the canonical 100% of the time?
No. The canonical is a signal. Google can ignore it if it believes another URL is more appropriate. Common reasons: canonical to a lower-quality page, to a page with fewer backlinks, or contradiction with other signals (hreflang, internal linking).
Can I have multiple canonicals on one page?
No. Only one <link rel="canonical"> tag per page. If multiple are present, Google ignores the directive entirely.
Canonical vs 301: what’s the difference?
A 301 is a physical redirect: the user and the bot are sent to another URL. A canonical leaves the current URL accessible but signals that another one is the reference version. Use a 301 for permanently moved URLs, and canonical for intentional duplicates (variants, parameters).
Is a page with a canonical to another page indexed?
No, normally not. Google “merges” the page with its canonical and indexes only the canonical URL. If you want both indexed (rare case), you need to differentiate their content and use a self-referential canonical on each.
Can the canonical be relative (example: /products/foo)?
Technically yes, practically no. Always use the absolute URL with protocol (https://example.com/products/foo). Relative URLs are a source of errors (wrong scheme, wrong host).
For auditing and fixing canonicals across your catalog at scale, see Ecomptimize for Shopify or Ecomptimize for WooCommerce.
Did you enjoy this article?