Skip to content

Lesson 1 of 3

Duplicate URLs and canonicals

Collection-path product URLs, tag pages and parameters: the duplicates your platform creates and how to point them home.

5 min readIntermediateUpdated 2026-08-22

A store selling trail shoes has one best-selling product and one page for it. A crawl shows that page living at half a dozen addresses: the plain product URL, the same product under three collection paths, a variant parameter and a sort parameter. Nobody built those. The platform made them, and Google now has to work out which one is the real page.

Your job is to make that decision for Google, clearly and consistently, so everything a product earns lands on one URL instead of being spread across copies.

Why one product ends up at six addresses

Store platforms build URLs from context. On Shopify, a shopper who reaches a product from a collection usually gets a link like /collections/trail-shoes/products/ridge-runner, while the same product also exists at /products/ridge-runner. Choosing a colour appends ?variant=. Sorting a collection appends ?sort_by=, filtering appends filter parameters, and every product tag quietly gets its own page at /collections/trail-shoes/<tag>. WooCommerce does the same with different names: product tag archives, ?orderby= on category pages, attribute filters, plus www, trailing-slash and http variants.

To a crawler, each of those is a separate URL to fetch, store and compare. Google's own documentation on consolidating duplicate URLs is clear that there is no duplicate-content penalty, so the problem isn't punishment. The problem is dilution: crawl time spent on copies instead of new products, links split between versions, and Google choosing a canonical for you that may not be the one you'd pick.

How Google chooses a canonical

When Google finds a group of pages with the same or very similar content, it picks one as the canonical and treats the rest as duplicates. Only the canonical appears in results.

Google's documentation lists the signals it weighs. The rel="canonical" tag in the page's head is a strong one. So are redirects, which URL appears in your sitemap, which URL your own site links to, and a preference for HTTPS over HTTP. The key word is "weighs": the canonical tag is a strong signal, not a command. If your tag says one thing while your navigation, sitemap and redirects say another, Google may overrule you, and Search Console reports the page as "Duplicate, Google chose different canonical than user".

That gives you the rule for the whole lesson. The URL in the canonical tag, the URL in the sitemap, the URL your internal links use and the URL your redirects land on must all be the same URL.

Google's guidance also names things not to do. Don't block duplicate URLs in robots.txt to "fix" duplication: a crawler that can't fetch a page can't read its canonical tag, so nothing consolidates. Don't point every page of a paginated collection at page one; Google's pagination guidance says each page in a series carries its own canonical. And don't declare a canonical to a page with genuinely different content, because Google is likely to ignore it.

Point each duplicate type home

Work through them in this order:

  1. Collection-path product URLs. The canonical on every version must be the plain /products/ address. Shopify provides a canonical URL value that its standard themes output for exactly this reason, but a customised or older theme can break it, so check rather than assume.
  2. Variant parameters. A ?variant= URL is the same product with a different option selected, so its canonical is the base product URL. The exception is a variant people search for by name, such as a colour with its own demand; give that its own product.
  3. Sort and filter parameters. A sorted or filtered collection is the same collection in a different order or subset, so canonicalise those URLs to the clean collection URL. Very large stores with thousands of filter combinations also have a crawl problem, which Google's faceted navigation guidance covers.
  4. Tag pages. The awkward case, because a tag page shows a different subset of products, so a canonical to the parent collection is dishonest and Google may ignore it. Decide per tag: if it matches a real search ("waterproof trail shoes"), give the page a proper title, an intro paragraph and a link from the collection, and treat it as a collection in its own right. If it doesn't, set it to noindex.
  5. Protocol, www and trailing slash. Pick one version of each and redirect the rest with a 301. Shopify handles this for you; on WooCommerce it's a WordPress setting plus a server rule.

Confirm that Google agreed with you

A correct tag is your intention; Search Console tells you whether Google accepted it. In the Pages report, "Alternate page with proper canonical tag" is the healthy status. "Duplicate without user-selected canonical" means you never declared one. "Duplicate, Google chose different canonical than user" means your signals disagreed; inspect that URL and you'll usually find your sitemap or internal links pointing at the version Google chose.

Fixes take time to show, because Google has to recrawl the copies, so re-check after a few crawls rather than the next day.

What to take away

  • Store platforms create several URLs for one product or collection by design, and Google has to pick one; your job is to make that choice obvious.
  • The canonical tag is a strong signal, not an order, so it only holds when your sitemap, internal links and redirects all agree with it.
  • Collection-path, variant, sort and filter URLs should canonicalise to the plain product or collection URL, while tag pages either earn their own place or get noindex.
  • Search Console's "Duplicate" statuses show whether Google accepted your canonicals, and a disagreement almost always traces back to a conflicting signal.

Next

With your URLs pointing home, the next leak to plug is speed: Store speed and themes shows where the seconds go and what to remove.

Free tools this lesson uses

Saved in this browser only.

Chapter 6: Reclaim the traffic your platform is costing you

All 9 chapters