hushwork
1316 wordsDrafted by the Hushwork engine · human-reviewed

Fixing Duplicate Content on Shopify

Where Shopify's duplicate URLs come from, which ones matter, and how to fix each

What duplicate content actually costs

Duplicate content on Shopify is rarely the catastrophe merchants fear and rarely as harmless as they hope. There is no "duplicate content penalty" in the classic sense — when Google finds the same content at several URLs, it picks one canonical version and consolidates signals to it. The costs are quieter: you lose control over which URL Google picks, internal links split their weight across variants, and on a large catalog, crawlers spend their time on copies instead of on new pages.

It helps to separate two problems that share a name. The first is duplicate URLs — one product reachable at several addresses. That is plumbing, and Shopify's plumbing mostly works out of the box. The second is duplicated words — the same description pasted across near-identical sofas, or manufacturer copy shared with every other retailer stocking the same toy brand. No canonical tag fixes that, because the pages really are different products.

This guide walks through the URL mechanics first, because they are quick to verify and usually already handled, then the copy problem, then a triage you can run in one sitting. Most stores will end up confirming more than fixing — which is itself worth knowing.

Collection-path product URLs

Click a product from a collection and Shopify links it as /collections/sofas/products/aria-loveseat. The same product also lives at /products/aria-loveseat. One product, two URLs — the most cited Shopify duplicate. It is also, in a standard theme, already solved: themes emit a rel=canonical tag pointing the collection-path URL at the plain /products/ address, and Google consolidates the two.

So the job is not to fix it but to confirm nothing broke it. Two checks:

  1. Open a collection-path product URL, view the page source (right-click → View Page Source), and search for rel="canonical". It should reference the /products/ address.
  2. In Search Console, run the same URL through URL Inspection and read the "Google-selected canonical" field. This shows what Google actually chose, which can differ from what your theme declares.

The usual breakage cases are heavily customized themes and page-builder apps that rewrite the document head and drop the tag. If either check fails, restore {{ canonical_url }} in the theme's theme.liquid layout — it is the stock Liquid object that renders the correct canonical on every page type.

Variant parameters and pagination

Selecting a variant appends a parameter: /products/stacking-rainbow?variant=41230987. Every variant deep link, every shared cart URL, every ad landing on a specific size creates another address for the same page. The standard canonical strips the parameter, so all variants consolidate to the base product URL — verify with the same page-source check as above. Variant URLs need no redirects and no special handling beyond an intact canonical tag.

Pagination looks similar but is the opposite case. /collections/wooden-toys?page=2 is not a duplicate of page one — it lists different products. Do not canonicalize page two to page one: that tells Google the deeper pages are copies, and products that only appear there can drop out of crawling. Shopify's canonical_url object keeps the page parameter on paginated collections for exactly this reason. Leave paginated URLs crawlable and self-referencing.

The decision rule that separates the two: a parameter that changes which products appear (pagination) deserves its own canonical; a parameter that only changes how the same content displays (variant selection, sort order) should canonicalize to the clean URL. Stock Shopify gets both right — your checks are about catching what a theme or app changed.

Tag and filter URLs

Tags create path-style URLs — /collections/bookshelves/white — each showing a subset of the parent grid under the same description. Twenty tags on one collection means twenty thin near-duplicates competing with the page you want to rank. The symptom that tags have gotten away from you: Search Console's page indexing report fills with two-segment /collections/ URLs you never deliberately created.

Filters from Shopify's Search & Discovery app behave better. They generate query-string URLs that canonicalize back to the base collection, so they consolidate on their own and generally need nothing from you.

For tag URLs the fix is editorial, not technical: decide which subsets deserve to be pages. A tag matching real search demand — "white bookshelf" has searchers behind it — should be promoted to a genuine collection with its own title, description, and URL. The rest should carry a noindex robots meta tag, added in the theme with a conditional on current_tags. How to choose which subsets earn a page, and how to write the ones that do, is covered in our collection page SEO guide.

When the copy itself is the duplicate

URL plumbing cannot help when the words themselves repeat. Two patterns dominate. First, internal duplication: a furniture store carries the same loveseat in six fabrics as six separate products and pastes one description across all six. Second, manufacturer duplication: a toy store publishes the supplier's stock description — the same paragraph that appears on every other retailer's site, plus the manufacturer's own, which usually outranks everyone carrying it.

Canonicals are the wrong tool here; these are genuinely different pages that deserve to exist. The fix is differentiated copy, prioritized by value: sort products by revenue and rewrite from the top. Write to the buying decision — how the bouclé wears in a house with pets, which ages the stacking toy actually suits versus what the box claims, what assembly involves. The details manufacturer copy never carries are precisely what make yours distinct.

For catalogs too large to hand-write, a template that pulls each product's own attributes — dimensions, materials, age range, compatibility — produces copy that varies wherever the products vary. That is the core idea behind programmatic SEO on Shopify, and done honestly it reads better than boilerplate, not worse.

Canonicals, robots, or nothing

Three tools, often confused, with different failure modes.

Canonical tags are hints, not directives — Google usually honors a sensible one but can override a canonical that contradicts other signals. They are the right tool for variant parameters and collection-path URLs: the duplicate stays reachable, and its signals consolidate onto the version you chose.

Shopify lets you edit robots.txt through the robots.txt.liquid theme template, which blocks crawling outright. That sounds stronger but interacts badly with canonicals: a blocked URL is never crawled, so the canonical tag on it is never seen — and a blocked URL that earns links can still get indexed, title-only. The rule: never block URLs whose canonicals you want discovered. Reserve robots.txt edits for genuinely unbounded URL spaces, and note that Shopify's default file already blocks internal search and cart paths.

Doing nothing is correct more often than merchants expect. Collection-path products and variant parameters with intact canonicals need no action; paginated collections need no action. The instinct to "clean up" every duplicate-looking URL in Search Console causes more damage — blocked canonicals, orphaned products — than the duplicates themselves ever did. Verify the plumbing, then leave it alone.

A one-sitting triage

Run each symptom through its check before changing anything.

  1. Same product indexed at two paths. Check: URL Inspection on the collection-path URL — what is the Google-selected canonical? Fix: if it is not the /products/ URL, restore {{ canonical_url }} in the theme layout.
  2. Indexing report full of tag URLs. Check: do any of those tags match queries with real demand? Fix: promote those to standalone collections; noindex the rest via a current_tags conditional.
  3. Two similar products trading rankings for one query. Check: read both descriptions side by side. Fix: if the copy is near-identical, rewrite each around its distinct attributes; if the products genuinely serve one query, consider merging them into one product with variants.
  4. Filtered URLs showing up in reports. Check: confirm they canonicalize to the base collection. Fix: usually nothing — that is the intended behavior.

Most stores finish this list with one real fix and three confirmations. The deeper protection sits upstream, at planning: Hushwork's content engine clusters keywords before it generates anything, so it never publishes two pages chasing the same query in the first place.

Frequently asked questions

Is there a Google penalty for duplicate content?

Not for ordinary duplication — Google consolidates duplicate URLs to one canonical and moves on. The exception is scaled content abuse: publishing masses of low-value pages primarily to manipulate rankings, which Google's spam policies do act against. A reused product description will not get you penalized; it just will not rank well.

Should page 2 of a collection canonicalize to page 1?

No. Paginated pages list different products, so they are not duplicates. Canonicalizing them to page one tells Google the deeper pages are copies, and products that only appear there can fall out of crawling. Shopify's stock canonical_url keeps the page parameter — leave that behavior alone.

Do variant URLs like ?variant=123 need redirects?

No. The standard canonical tag already points every variant URL at the base product page, so Google consolidates them. Redirecting would actually break things — variant deep links from ads and shared carts need to keep working. Just confirm the canonical tag is intact in your theme.

How do I see which URL Google chose as canonical?

Use URL Inspection in Search Console: paste the URL and read the "Google-selected canonical" field. This shows Google's actual choice, which can differ from the canonical your theme declares. If the two disagree on important pages, that gap is where your investigation starts.

Keep reading