Free tool, no signup required

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.

Fetches /collections/all, then two URLs per product for up to 20 products.3 checks remaining today (free)

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 familyExpected canonicalVerdict if wrong
/collections/x/products/yhttps://store.com/products/yWarning if missing or self-referencing; Error if it points at a 404, a redirect or another product
/products/yItself, https://store.com/products/yWarning if missing; Error if it points elsewhere or the URL redirects
/products/y?variant=123https://store.com/products/y, parameter droppedWarning if missing; Error if the canonical keeps the parameter or points elsewhere
/collections/x/tagItself (Shopify default); block in robots.txt.liquid if the tag adds nothingNot checked here; see the robots.txt.liquid generator
/collections/x?page=2Itself, with ?page=2 keptNot 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Twenty products tell you whether the theme prints a correct canonical, because a template is right or wrong for every page it renders. They cannot find one product an app rewrote. Run the Shopify SEO checklist for the store-wide pass, then the product schema generator, since Product markup belongs on the canonical URL only.

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 tool

Hreflang Validator

Validate hreflang tags for international SEO: self-referencing, return tags, x-default, language codes, and duplicate detection.

Use tool

Schema & JSON-LD Validator

Validate structured data markup: required properties, date formats, nested entities, and JSON syntax. Supports all major schema types.

Use tool

Meta Tag Checker

Check title tags, meta descriptions, Open Graph tags, Twitter cards, canonical URLs, robots directives, and viewport settings.

Use tool

Meta 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 tool

Keyword 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 tool

SERP 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 tool

URL 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 tool

Anchor 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 tool

Readability 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 tool

Page 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 tool

Image 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 tool

Open 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 tool

Twitter 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 tool

Open 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 tool

Heading 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 tool

Bulk 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 tool

Bulk 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 tool

SEO 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 tool

Title 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 tool

Headline 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 tool

Bulk 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 tool

Helpful 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 tool

Collection 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 tool

Read up on crawling and indexing

A tool tells you what is wrong. These explain what to do about it.

Terms 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.