Shopify Duplicate URL Checker
Paste a Shopify store URL. The tool samples 20 products from /collections/all, fetches the /collections/x/products/y copy and the plain /products/y page for each, reads the canonical on both, tests one ?variant= URL, and tells you which products are consolidated and which are competing with themselves.
Short answer
Every Shopify product reached through a collection gets a second URL at /collections/collection-handle/products/product-handle, alongside /products/product-handle. Themes resolve the pair by printing a canonical to the plain URL from Shopify's canonical_url object. This tool checks that the canonical is present and points at the right place on a sample of 20 products, 40 product fetches, plus one ?variant= URL.
Why Shopify creates two URLs for every product
A Shopify product has one handle and one page, but it is reachable at two addresses. The plain one is /products/handle. The second one appears the moment a collection page links to the product, because Shopify builds that link as /collections/collection-handle/products/handle so the product page knows where the shopper came from.
Both addresses return the same page with a 200 status. Add a product to three collections and it has four URLs. A store with 500 products in an average of two collections each serves 1,500 product URLs for 500 products, and every one of the extra 1,000 is a duplicate unless something says otherwise.
What says otherwise is one line in the theme layout, and it comes in two parts:
- canonical_url, a global Liquid object that Shopify's documentation describes as the canonical URL for the current page. On a product page it is the plain /products/handle address, whatever path the page was requested at and whatever ?variant= was appended.
- The link element that prints it. Dawn, Shopify's reference theme, does this on line 8 of layout/theme.liquid:
<link rel="canonical" href="{{ canonical_url }}">.
Shopify's help centre lists auto-generated canonical tags among the SEO features every store gets. That is true of the object. The tag itself is the theme's job, which is why a store can lose it without anyone changing a setting, and why the check has to be run against the live HTML rather than the admin.
What a correct canonical looks like for each URL family
Google's canonicalization guidance treats rel=canonical as a strong signal, asks for an absolute URL, and asks the canonical page to carry a self-referencing tag of its own. On Shopify that produces a different right answer for each of the URL families a store serves.
| URL family | Expected canonical | Verdict if wrong |
|---|---|---|
| /collections/x/products/y | https://store.com/products/y | Warning if missing or self-referencing; Error if it points at a 404, a redirect or another product |
| /products/y | Itself, https://store.com/products/y | Warning if missing; Error if it points elsewhere or the URL redirects |
| /products/y?variant=123 | https://store.com/products/y, parameter dropped | Warning if missing; Error if the canonical keeps the parameter or points elsewhere |
| /collections/x/tag | Itself (Shopify default); block in robots.txt.liquid if the tag adds nothing | Not checked here; see the robots.txt.liquid generator |
| /collections/x?page=2 | Itself, with ?page=2 kept | Not checked here; a canonical to page 1 hides every product past the first page |
The first three rows are what this tool fetches. The tag and pagination rows are listed because they are the two places people apply the product rule by mistake. Google's pagination guidance says not to use the first page of a sequence as the canonical, and Shopify's default self-referencing canonical on page 2 already follows that.
A redirect counts as consolidated
Some stores redirect the collection-path URL to /products/handle instead of serving it with a canonical. Google lists redirects above rel=canonical in the order of how strongly they influence canonicalization, so the tool reports that case as OK and names the status code, rather than asking for a canonical the page never renders.
What breaks the canonical on a Shopify store
The canonical fails in one of three ways, and each one leaves a different fingerprint in the results table. Knowing which you are looking at decides whether the fix is a theme edit, an app setting or a redirect map.
The theme drops the line
A custom theme built from scratch, or a Dawn fork where someone rewrote the head to add a font preload, ships without the canonical link element. Every product row then shows no canonical on both URLs. The fix is one line in layout/theme.liquid, and the Shopify SEO audit guide walks through where it goes.
An app overrides it
SEO apps, translation apps and some page builders inject their own head tags, and a few write a canonical of their own. When theirs is built from the requested URL rather than canonical_url, the collection-path copy canonicalises to itself. That is the self-referencing Warning, and it appears on every product at once.
The target moved
A renamed handle leaves the old /products/ URL redirecting, and any canonical that still points at it is pointing at a redirect. A deleted product leaves it at 404. Both show up as an Error on the plain URL row, which then cascades to every collection path pointing at it.
Two failures that look like canonical problems are something else:
- A blocked fetch. Password-protected stores, and stores whose bot filter answers 403 or 429, produce Warnings that describe this tool being refused. The reason column says so. Nothing about the page is known.
- No product links at all. A theme that renders the product grid in the browser leaves crawlers with an empty collection page, which is a bigger problem than the canonical and is reported as its own note.
What to do with each verdict
The summary counts three verdicts across the sample, and the table shows which URL earned each one. Work them in this order, because an Error on a plain URL is the cause of every Error that points at it.
- 01
Paste the store URL, or one collection URL
The tool fetches /collections/all by default. If your theme hides that collection, or you want to test the collection an app rewrote, paste the collection's own URL instead. A product URL also works and falls back to /collections/all on that store.
- 02
Read the Shopify signal first
The result opens with the header or asset path that identified the store as Shopify. If nothing was found, the paths still get checked, but the verdicts describe whatever the site serves at those addresses rather than Shopify's behaviour.
- 03
Check the summary counts
OK means both URLs of a product resolve to /products/handle, by canonical or by redirect. Warning means a canonical is missing or self-referencing on the collection path. Error means a canonical points at a 404, a redirect or another product, or the plain URL itself redirects.
- 04
Open the rows marked Error, then Warning
Each row shows the status, the canonical and the reason for both URLs. An Error row on the plain URL means every canonical pointing at that product is broken, so fix it before any collection-path row that points at it.
- 05
Look at the ?variant= row
The last row fetches one product with a variant id appended. The canonical should be the plain product URL with the parameter dropped. A self-referencing canonical here means every colour and size on the store is competing with its own product page.
- 06
Fix the theme layout, then rerun and crawl the whole store
The canonical line lives in layout/theme.liquid as link rel=canonical href={{ canonical_url }}. Restore it, remove any app that rewrites it, publish, and run this check again. Then crawl every product rather than twenty, because a sample cannot clear the products it never fetched.
A clean sample means the theme prints the right canonical. It cannot find the one product an app rewrote last week, or a handle renamed without a redirect. Those need every product fetched, which the Shopify canonical and duplicate content guide covers along with the tag, vendor and type pages.
A single URL, or the whole store
To confirm one fix, paste the URL into the canonical tag checker. To find every duplicate family, CrawlRaven's ecommerce mode crawls the whole store, groups the collection-path, variant and tag copies of each page, and joins the result with Search Console and GA4 into one ranked plan. Free plan for 1 site.
What this tool checks
Shopify signal
The powered-by or x-shopid header, or /cdn/shop/ asset paths, before any verdict is drawn
20 products from one collection
Read from /collections/all, or from the collection URL you paste
Collection-path canonical
Status and canonical on /collections/x/products/y for every sampled product
Plain URL canonical
Status and self-referencing canonical on /products/y, the target every other copy points at
?variant= canonical
One product fetched with a variant id, checking the parameter is dropped
Redirect and 404 targets
A canonical pointing at a URL that redirects or returns 404 is an Error, not a pass
Plain-language reasons
Every row states why it earned its verdict, including when the store blocked the fetch
Real limits, stated
20 products, 40 product fetches, one variant fetch, 15 seconds per fetch
A sample tests the template, not the catalogue
Frequently asked questions
Why does Shopify give every product two URLs?
Because a product linked from a collection page is served at /collections/collection-handle/products/product-handle, and the same product also exists at /products/product-handle. Shopify does this so the product page can show which collection the shopper came from, and it relies on a canonical tag to tell search engines the plain URL is the original.
Does Shopify add the canonical tag automatically?
Shopify provides it, and the theme has to print it. The canonical_url Liquid object holds the plain URL for every page, and Dawn's layout/theme.liquid prints it on line 8 as link rel=canonical href={{ canonical_url }}. A custom or edited theme that drops that line has no canonical anywhere, which is what this tool finds.
Is the collection-path URL a duplicate content problem?
Only when the canonical is missing or wrong. With the canonical in place, Google treats the collection-path URL as a copy of /products/handle and consolidates the ranking signals there. Without it, Google picks one of the two on its own, and Search Console reports the loser as Duplicate, Google chose different canonical than user.
What should the canonical on a Shopify product page be?
The plain /products/product-handle URL on the store's primary domain, as an absolute URL. That is true on the collection-path copy, on the plain page itself where it is self-referencing, and on any ?variant= URL. Google's canonicalization guidance asks for an absolute URL and for the canonical page to carry a self-referencing tag.
Why does my store redirect /collections/x/products/y instead of showing it?
Some stores add a redirect so the collection-path URL never renders, either through an app or a theme snippet, and Shopify itself redirects when the product is not in that collection. The tool reports this as OK, because a redirect to the plain product URL consolidates the two addresses at least as firmly as a canonical does.
What does the ?variant= check look for?
It appends the first variant id found on a product page to the plain URL and reads the canonical there. A correct theme prints the plain product URL with the parameter dropped. A canonical that keeps ?variant= tells Google each colour and size is its own page, which splits one product's signals across every option it sells.
Why does this tool only check 20 products?
Because each product needs two fetches, and 40 fetches against one store is a burst that finishes inside a minute without tripping bot protection. The sample is drawn from one collection page, so it tells you whether the theme prints a correct canonical, which is a template question. It cannot tell you about products the run never reached.
The tool says my site does not look like Shopify. Why?
It found no powered-by: Shopify or x-shopid header, no /cdn/shop/ or cdn.shopify.com asset path, and no Shopify.theme script on the collection page. Headless storefronts on Hydrogen or a custom front end often fail this test while still using Shopify for checkout. The paths are still checked; the verdicts describe what the front end serves.
What does a Warning verdict mean?
A Warning means the collection-path copy has no canonical, or its canonical points at itself, or a fetch was blocked or timed out. The first two mean two URLs are competing for one product. The last is about this tool being refused, not about the page, and the reason column says which it was.
What does an Error verdict mean?
An Error means a canonical points somewhere that cannot be indexed as this product: a URL that returns 404, a URL that redirects, or a different product's page. It also covers the plain /products/ URL redirecting, since every canonical on the store points there and a redirecting canonical target is treated as a broken hint.
Should collection tag pages and page 2 also canonicalise to the product?
No. Tag pages like /collections/all/sale and paginated pages like /collections/all?page=2 are listings, not products, and Shopify gives each a self-referencing canonical. Google's pagination guidance says not to point page 2 at page 1. Tag pages that add nothing are better blocked in robots.txt.liquid than canonicalised away.
How is this different from the canonical tag checker?
The canonical tag checker reads one URL you paste and validates its tag in isolation. This tool starts from a store, discovers 20 products, fetches both URL families and the ?variant= form for each, and judges whether the pairs agree. Use this one to test the theme, and the single-URL checker to confirm a specific fix.
Other on-page SEO tools
Canonical Tag Checker
Validate canonical tags for self-referencing, protocol mismatches, trailing slash conflicts, noindex conflicts, and og:url consistency.
Use toolHreflang Validator
Validate hreflang tags for international SEO: self-referencing, return tags, x-default, language codes, and duplicate detection.
Use toolSchema & JSON-LD Validator
Validate structured data markup: required properties, date formats, nested entities, and JSON syntax. Supports all major schema types.
Use toolMeta Tag Checker
Check title tags, meta descriptions, Open Graph tags, Twitter cards, canonical URLs, robots directives, and viewport settings.
Use toolMeta Tags Generator
Write the title, description, and social share tags every page needs. Live character counts plus previews of how it will look in Google and on social.
Use toolKeyword Density Checker
See which words and phrases your copy actually leans on. Single word, two word and three word counts with density and first-mention position.
Use toolSERP Snippet Preview
See your title and meta description the way Google renders them, measured in pixels. Desktop and mobile, with the exact character your snippet is cut at.
Use toolURL Slug Generator
Turn a list of page titles into clean, readable URL slugs. Accents transliterated, filler words optional, and duplicates caught across the whole list.
Use toolAnchor Text Generator
Build branded, partial, long tail and naked URL anchor variations for any page, then audit the anchors you already have against a natural distribution.
Use toolReadability Checker
Score any text on six readability formulas at once, then see which sentences are dragging the grade up. Passive voice and long sentences broken out separately.
Use toolPage Word Counter
Count the words on any URL, with the body copy separated from the nav, header and footer. Unique words, reading time, paragraphs and the heading outline.
Use toolImage Alt Checker
Audit the alt text on every image on a page. Missing attributes kept apart from decorative alt="", plus image links with no name, filenames used as descriptions and duplicates.
Use toolOpen Graph Preview
Paste your meta tags and draw the card each platform renders, cut where it really cuts. Works on staging and on tags you have not deployed yet.
Use toolTwitter Card Validator
X retired its own validator in 2022. Check twitter:card on a live URL, see which tags X reads through the Open Graph fallback, and prove the image loads.
Use toolOpen Graph Checker
Fetch a live URL and read its og: tags the way a scraper does, then check the card image actually loads rather than only that the tag exists.
Use toolHeading Analyzer
Read the H1 to H6 outline of any URL and find the skipped levels, empty headings and duplicate labels, with the page's own headings separated from its template.
Use toolBulk Title Tag Checker
Check up to 100 title tags at once, measured in pixels rather than characters, and find the duplicates across a set that no single-URL checker can see.
Use toolBulk Meta Description Checker
Check up to 100 meta descriptions at once, measured in pixels, and find the duplicates, empty tags and descriptions that just repeat the title.
Use toolSEO Content Grader
Grade a page or draft against 20 weighted signals plus an AI judgement kept clearly apart. The score shows its own arithmetic, and every row prints its method.
Use toolTitle Tag Generator
Write 12 candidate titles from a URL or a topic, each measured in real pixels at Google's desktop and mobile widths, with the brand appended by code and the keyword checked.
Use toolHeadline Generator
Write 12 H1 and blog headlines from a URL or a topic, each checked against the house style: length band, keyword present, and none of the template tells or bait an editor would cut.
Use toolBulk Alt Text Generator
Write alt text for every image on a page that has none or sits in an unnamed link, never for decorative ones, with each description checked against the alt checker's own rules.
Use toolHelpful Content Checker
Check which of Google's helpful content signals a page actually shows: author, dates, sourcing, content ratio and ad load. No invented score.
Use toolCollection Page SEO Checker
Fetch one Shopify, WooCommerce, BigCommerce or Magento category URL and get 13 checks with the observed values: title and description length, H1, canonical, pagination, robots, category copy word count, product links, BreadcrumbList and CollectionPage schema, image alt coverage and filter URLs.
Use toolRead up on crawling and indexing
A tool tells you what is wrong. These explain what to do about it.
Webflow and Google Search Console: The Setup, and Why Your Sitemap Isn't Showing
Read guideLumar (DeepCrawl) Review 2026: Pricing, Features & Honest Verdict
Read guideContentKing Review: The Tool Is Still Very Good. You Cannot Buy It.
Read guideTerms this tool checks
- Canonical Tag
A canonical tag (rel="canonical") is an HTML element that tells search engines which version of a page is the preferred, authoritative copy when multiple URLs serve similar or identical content.
- Duplicate Content
Duplicate content is substantively similar or identical content that appears on multiple URLs, either within the same website (internal duplicates) or across different websites (external duplicates).
- Indexation
Indexation is the process by which search engines add web pages to their searchable database (index).
Find every duplicate family across the whole store
CrawlRaven's ecommerce mode crawls the entire store, groups the collection-path, variant and tag copies of every page into one duplicate family each, and joins the result with Search Console and GA4 into one ranked plan. Free plan for 1 site, no credit card.