Canonicalization for variants and filtered pages
The same product reachable at /products/wrap-dress, /collections/dresses/products/wrap-dress, and ?variant=39281 - the same collection at ?sort_by=price and ?page=1. Multiplicity is the ecommerce condition. The canonical tag is the instrument for managing it: a line in the page's head declaring "of all URLs showing this content, this one is the original."
What a canonical does and doesn't do
A canonical consolidates: Google (usually) indexes the declared URL and credits it with the equity of its duplicates. Two properties matter in practice. It's a hint, not a command - Google can override it when signals disagree, which is precisely when GSC shows "Duplicate, Google chose different canonical than user" (a report worth reading: it means your declared canonical and your linking behavior are telling different stories). And it doesn't stop crawling - canonicalized duplicates still consume crawl attention, which is why the previous lesson's tools exist alongside this one.
What Shopify does natively - verify, don't assume
Shopify's defaults are sane: collection-path product URLs canonicalize to /products/, variant-parameter URLs canonicalize to the base product, paginated pages self-canonicalize with page parameters intact (correct - page 2's products deserve indexing too). The audit, per template, takes minutes: view source, find rel="canonical", check it points where expected. Where this breaks is themes and apps: heavily customized themes sometimes override canonical logic wrongly, and page-builder or filtering apps sometimes inject their own. After any theme change, this check belongs next to the schema check from Phase 3.
The judgment calls
Two situations require actual decisions. Variant URLs with real search demand: if "wrap dress red" is a query people make and your red variant deserves its own indexed presence, the canonical-to-base default erases it. Options range from separate products per colorway (the Phase 1 modeling decision, revisited with SEO eyes) to theme work giving variants indexable URLs. There's no universal answer - there's your demand data.
Filtered collection pages worth ranking: /collections/shirts?filter=linen canonicalizing to /collections/shirts is right for noise, wrong if "linen shirts" is a term you want to win - the canonical throws that page's chance away. The clean pattern: real demand gets a real collection (/collections/linen-shirts, from your taxonomy work), filters stay canonicalized noise. The rule that generalizes: canonicals manage duplicates; demand deserves dedicated URLs. When you find yourself wanting a parameter URL to rank, what you actually want is a page.