Duplicate content is one of the most common technical SEO issues on Shopify stores. It is not a bug — it is a consequence of how Shopify’s URL architecture works. Every Shopify store generates duplicate URLs by default, and if you do not address them, you are splitting your link equity, wasting crawl budget, and confusing Google about which pages to rank.
The good news is that most duplicate content issues on Shopify follow predictable patterns. Once you understand where they come from, fixing them is straightforward. This guide walks you through the entire process, from identifying the problem to implementing permanent solutions.
If you are running an ecommerce store and have noticed ranking inconsistencies or pages dropping in and out of Google’s index, duplicate content is one of the first places to look. Our complete technical SEO guide for Shopify covers the broader picture, but this article focuses specifically on duplicates.
Why Shopify creates duplicate content
Shopify’s architecture generates multiple URLs for the same content in several predictable ways. Understanding each one is essential before you start fixing anything.
Collection-based product paths
This is the most common source of duplicate content on Shopify. Every product has a canonical URL at /products/product-handle, but when accessed through a collection, Shopify also creates a URL at /collections/collection-handle/products/product-handle.
If your product appears in five collections, that is six URLs for the same page — the canonical product URL plus five collection-based paths. Shopify adds a canonical tag pointing to the /products/ URL, but this does not prevent Googlebot from crawling and processing all six URLs.
Pagination parameters
Collection pages with more products than the per-page limit generate paginated URLs: /collections/all?page=2, /collections/all?page=3, and so on. Each paginated page has different products but shares the same title tag and meta description unless you have customised them.
Tag filtering URLs
Shopify’s native tag filtering creates URLs like /collections/all/colour-blue or /collections/all/size-large. These filtered views often contain subsets of the same products already indexed on the main collection page, creating thin or duplicate content.
Variant query parameters
When a customer selects a product variant, Shopify appends a ?variant= parameter to the URL. While these are covered by Shopify’s default canonical tags, third-party apps or custom code can sometimes interfere with this behaviour.
WWW vs non-WWW and trailing slashes
Shopify handles WWW redirects automatically on its hosting, but if you are using a custom domain with an incorrectly configured DNS, you can end up with both versions accessible. Similarly, URLs with and without trailing slashes can sometimes both resolve.
Step 1: Find your duplicate content
Before you fix anything, you need a complete picture of the duplicate content on your store. Here is how to build one.
Run a full site crawl
Use Screaming Frog, Sitebulb, or Ahrefs Site Audit to crawl your entire Shopify store. Configure the crawl to follow all internal links and include URL parameters. Look for:
- Pages with identical page titles
- Pages with identical or near-identical content (use a near-duplicate detection feature if available)
- Multiple URLs resolving to the same content
- Pages with canonical tags pointing elsewhere
In Screaming Frog, the “Canonicals” tab shows you every page’s canonical tag and whether it is self-referencing or points to another URL. Filter for “Canonicalised” pages to see all URLs that point to a different canonical — these are your known duplicates.
Check Google Search Console
In Google Search Console, navigate to Pages > Not indexed. Look for these specific statuses:
- Duplicate without user-selected canonical — Google found duplicate pages and you have not specified a canonical tag, so Google chose one itself.
- Duplicate, Google chose different canonical than user — You set a canonical tag but Google disagreed with your choice. This often indicates a larger problem.
- Alternate page with proper canonical tag — Duplicates that are correctly handled by canonical tags. These are fine.
Search Google directly
Use site:yourstore.com searches to check for duplicate indexing. Search for a specific product name with the site operator and see how many URLs appear. If you see both /products/ and /collections/.../products/ versions in the results, your canonical tags are not working as intended.
For a thorough understanding of how to identify these issues alongside other technical SEO problems, see our guide on product page SEO.
Step 2: Fix canonical tags
Canonical tags are your primary weapon against duplicate content. They tell Google which URL is the “original” version when multiple URLs contain the same content.
Check Shopify’s default canonical behaviour
Shopify automatically adds canonical tags in the theme.liquid file using the canonical_url Liquid object. The default code looks like this:
<link rel="canonical" href="{{ canonical_url }}">
This should output the correct canonical URL for most page types. However, problems arise when:
- A theme developer has removed or modified the canonical tag
- An app injects its own canonical tag, creating a conflict
- Custom Liquid code overrides the default behaviour
- The theme uses a hardcoded URL instead of the
canonical_urlobject
Verify canonical tags are present and correct
View the page source on a product page accessed via a collection path (e.g. /collections/sale/products/your-product). The canonical tag should point to https://yourstore.com/products/your-product, not to the collection-based URL.
If the canonical tag is missing or points to the wrong URL, check your theme.liquid file. The canonical tag must appear inside the <head> section and must use the Shopify canonical_url object.
Fix conflicting canonical tags
Some Shopify apps inject their own canonical tags, which can result in multiple canonical tags on a single page. Google treats conflicting canonicals as if no canonical is set at all. To check:
// Search page source for multiple canonical tags
// View source on any product page and search for "canonical"
// You should find exactly ONE canonical tag
If you find multiple canonical tags, identify which app is injecting the extra one and either configure the app to stop doing so or contact the app developer. Alternatively, remove the app’s canonical tag using theme code that conditionally excludes it.
Step 3: Handle collection-based product URLs
Collection-based product URLs are the single biggest source of duplicate content on Shopify. Here are your options for dealing with them.
Option 1: Rely on canonical tags (default)
Shopify’s default canonical tags handle this correctly for most stores. The collection-based URL (/collections/sale/products/blue-jacket) includes a canonical tag pointing to the product URL (/products/blue-jacket). Google usually respects this.
However, if you have a large catalogue with many collections, the sheer volume of duplicate URLs can consume crawl budget. For stores with thousands of products across dozens of collections, a more proactive approach is warranted.
Option 2: Update internal links to use product URLs
By default, Shopify’s collection page templates link to products using the collection-based URL path. You can modify your theme’s collection template to link directly to the /products/ URL instead.
In your collection template, find the product link and change it from:
{{ product.url | within: collection }}
To:
{{ product.url }}
This simple change ensures that all internal links from collection pages point to the canonical product URL, reducing the number of collection-based URLs that Googlebot discovers and crawls.
Option 3: Add robots meta tags to collection product paths
For stores where crawl budget is a significant concern, you can add a noindex, follow meta tag to product pages when they are accessed via a collection path. This tells Google not to index the duplicate URL while still following links on the page.
{% if request.path contains '/collections/' and request.path contains '/products/' %}
<meta name="robots" content="noindex, follow">
{% endif %}
Use this approach carefully and test thoroughly. Incorrect implementation can accidentally noindex your canonical product pages.
Step 4: Fix pagination duplicates
Pagination creates a different type of duplicate content issue. Paginated collection pages are not exact duplicates — they contain different products — but they often share the same title tags and meta descriptions.
Make paginated pages unique
Add the page number to title tags and meta descriptions on paginated pages. In your collection template:
{% if current_page > 1 %}
{% capture page_title %}{{ collection.title }} - Page {{ current_page }}{% endcapture %}
{% else %}
{% capture page_title %}{{ collection.title }}{% endcapture %}
{% endif %}
Self-referencing canonicals on paginated pages
Each paginated page should have a self-referencing canonical tag. Page 2 should have a canonical pointing to /collections/all?page=2, not to /collections/all. Shopify handles this correctly by default, but verify it on your store.
Do not set the canonical on paginated pages to point to page 1. This is a common mistake that tells Google all the products on pages 2, 3, 4, etc. are duplicates of page 1, which is incorrect and can cause products on later pages to drop out of Google’s index entirely.
Consider increasing products per page
Reducing the total number of paginated pages reduces the number of URLs Google needs to crawl. If you are showing 12 products per page across a collection of 200 products, that is 17 pages. Increasing to 48 products per page reduces it to 5 pages. This is especially relevant for stores managing large catalogues where crawl efficiency matters.
Step 5: Address tag filtering URLs
Shopify’s native tag-based filtering creates URLs that are essentially filtered subsets of your collection pages. These are a significant source of thin and duplicate content, especially on stores that use tags extensively for product attributes like colour, size, material, and style.
Audit your tag-based URLs
Check how many tag-based URLs exist on your store. In Screaming Frog, filter for URLs containing /collections/ followed by a tag path. You may find hundreds or thousands of these URLs, many of which contain only one or two products.
Noindex tag filtering pages
In most cases, tag filtering URLs should be noindexed. They rarely offer unique value to searchers and they dilute your collection pages’ authority.
{% if current_tags %}
<meta name="robots" content="noindex, follow">
{% endif %}
Add this to your theme’s collection.liquid template. The follow directive ensures Google still follows links on the page, which helps with discovering and crawling product pages.
Block tag URLs in robots.txt
Shopify’s robots.txt is not directly editable in the traditional sense, but you can customise it through the robots.txt.liquid template. Add a disallow rule for tag-based URLs:
Disallow: /collections/*+*
Disallow: /collections/*/tag
Be aware that blocking URLs in robots.txt prevents crawling but not indexing. If Google has already indexed these URLs or discovers them through external links, they can remain in the index. Combine robots.txt blocking with noindex tags for a belt-and-braces approach.
Use proper filtering instead
If your customers need product filtering, implement a proper faceted search solution using JavaScript-based filtering with Shopify’s Storefront API or a dedicated filtering app. These solutions update the page content without creating new crawlable URLs, eliminating the duplicate content problem entirely. For more on this topic, see our SEO services page.
Step 6: Manage variant URL parameters
Product variants add ?variant=12345678 parameters to URLs. Shopify’s default canonical tags handle these correctly, but there are edge cases to watch for.
Verify canonical handling
Access a product page with a variant parameter and check the canonical tag in the page source. It should point to the base product URL without the variant parameter.
Custom variant pages
Some stores create separate pages or landing pages for specific variants — for example, a dedicated page for “Blue Size 10” of a shoe. If these pages have unique content (unique images, unique descriptions, unique reviews), they may warrant their own indexed pages. In this case, create them as separate products in Shopify rather than as variants, giving each one a unique URL and unique content.
Google Search Console URL parameters (legacy)
Google deprecated the URL Parameters tool in Search Console, but the principle remains: do not rely on Google to figure out which URL parameters are meaningful. Handle them correctly on your end with canonical tags.
Step 7: Set up ongoing monitoring
Duplicate content is not a one-time fix. New products, new collections, new apps, and theme updates can all introduce new duplicates. Set up ongoing monitoring to catch issues before they impact rankings.
Schedule regular crawls
Run a full site crawl at least monthly. Compare results against your previous crawl to identify new duplicates. Pay particular attention to:
- New collection pages that may create new product path duplicates
- Newly installed apps that may modify canonical tag behaviour
- Theme updates that may reset custom canonical tag configurations
- New tag combinations that create additional filtered URLs
Monitor Google Search Console weekly
Check the Pages report in Google Search Console every week. Look for spikes in “Excluded” pages, especially those with duplicate-related statuses. A sudden increase usually indicates a new source of duplicate content.
Set up crawl budget alerts
In Google Search Console, monitor the Crawl Stats report under Settings. If you see a significant increase in crawled pages without a corresponding increase in indexed pages, duplicate content is likely consuming your crawl budget.
Document your canonical strategy
Create a document that records your canonical tag strategy for each page type: products, collections, blog posts, custom pages. Share this with anyone who has access to your theme code or installs apps. This prevents well-intentioned changes from undoing your work.
Duplicate content on Shopify is not a defect — it is an architectural reality. The stores that rank well are the ones that understand this and manage it proactively, rather than discovering it after six months of stagnant rankings.
Andrew Simpson, Founder
Bringing it together
Fixing duplicate content on Shopify is a systematic process. Start by crawling your site to understand the scope of the problem. Then address each source of duplication in order: canonical tags, collection-based product URLs, pagination, tag filtering, and variant parameters. Finally, set up monitoring to catch new issues as they arise.
The most important thing to understand is that Shopify’s default behaviour creates duplicates by design. This is not a platform flaw — it is how the URL architecture works. Your job is to add the appropriate signals (canonical tags, noindex directives, internal linking patterns) so that Google understands which URLs to index and rank.
If your store has been live for a while and you have never addressed duplicate content, you are almost certainly leaving rankings and organic traffic on the table. A structured approach to fixing these issues typically shows measurable improvements within 4–8 weeks of Google’s next crawl cycle.
If you would like help auditing and fixing duplicate content on your Shopify store, get in touch. We can identify every source of duplication on your store and implement the fixes that will consolidate your rankings.