The Shopify URL Structure Problem, and What to Do
Aisle map
The Shopify URL structure is the platform's most-complained-about limitation, and unusually among common complaints, the complaint is accurate. You cannot change it, there is no app that changes it, and anyone who tells you otherwise is selling a redirect.
What follows is what the constraint actually is, how much damage it does, and which of the circulating fixes are real.
What Shopify forces
Four path segments are hardcoded into Shopify's router and cannot be removed:
- Products live at
/products/<handle> - Collections live at
/collections/<handle> - Static pages live at
/pages/<handle> - Blog content lives at
/blogs/<blog>/<article>
The consequences follow directly. You cannot put a product at the root of your domain. You cannot build a hierarchical category path — /clothing/shirts/blue-tee is not expressible, and neither is any nested taxonomy deeper than the flat collection model. Every product in the catalogue sits at the same structural depth regardless of how your range is actually organised.
For a store with fifty products this is invisible. For a store with a genuine multi-level range — categories inside categories inside departments — it means the URL structure will never reflect how the business thinks about its own catalogue.
The duplicate path problem
This is the part that causes real trouble. When a product belongs to a collection, Shopify will also serve it at a collection-scoped address: /collections/<collection>/products/<handle>. A product in six collections is reachable at seven distinct URLs, all serving identical content.
That happens automatically. You did not configure it, and you cannot switch it off. A catalogue of 500 products across a dozen collections can generate several thousand addressable URLs for 500 pieces of content.
What canonical tags do, and do not, fix
Shopify handles the obvious half of this properly: each collection-scoped variant carries a canonical tag pointing at the clean /products/<handle> address. Search engines are told which version is authoritative, and they generally respect it.
So the catastrophic version of the problem — a search engine treating seven URLs as seven competing pages — mostly does not happen. Anyone telling you Shopify's duplicate URLs will destroy your rankings is overstating it considerably.
What canonicals do not fix is everything downstream of the URL a customer actually gets. Internal links from collection pages frequently emit the collection-scoped form, which means those are the links being crawled and shared. Analytics splits the same product across multiple paths unless you normalise it. A customer copying a URL to share may send the long version. And crawl budget goes on variants rather than on pages that need it — which matters on large catalogues and not at all on small ones.
The theme edit that helps
The practical fix is a theme edit rather than a setting. Product links in a theme are generated with a filter that, by default, scopes the URL to the collection being browsed. Removing the within: collection portion of that link makes product links emit the clean /products/<handle> form everywhere.
The edit is small, it lives in whichever snippet renders your product cards — commonly a product-grid or product-card file — and it changes every internal product link on the site at once. That is the single highest-value change available, because it stops the site itself from propagating the variant URLs.
One trade-off to know: collection-scoped URLs are what power previous/next navigation within a collection on some themes. Check that behaviour after the edit rather than assuming it is unaffected.
The part you can control: handles
Within each forced prefix, the rest of the URL is yours. The handle — the slug after /products/ or /collections/ — is editable, and it is where any real URL work on Shopify happens.
Handles default to a slugified version of the title, which is usually fine and occasionally terrible. A product called "Blue Tee — SS26 Drop 2 (Final Restock)" produces a handle nobody wants, and that handle is what customers see and share. Editing it at creation costs nothing; editing it later means a redirect.
Two habits worth adopting. Set the handle deliberately when the product is created rather than accepting the default, keeping it short and descriptive of the thing rather than the campaign. And when you do change one, use Shopify's URL redirect tool so the old path continues to resolve — abandoned handles are the most common source of broken links on a Shopify store, and they accumulate silently through seasonal renaming.
The same applies to collections. A collection handle outlives the merchandising decision that created it, so name it for the category rather than the season.
Redirects, proxies and the things that do not work
Shopify's URL redirect tool handles genuine moves — a renamed product, a retired collection — and should be used for those. What it will not do is let you serve products at paths Shopify does not route. A redirect from a pretty URL to the real one still leaves the real one as the address that exists.
A reverse proxy in front of the storefront can present cleaner paths, and large merchants occasionally do this. It is infrastructure work with real maintenance and real risk of subtle breakage, and it is out of proportion for almost every store that considers it.
What does not work: apps claiming to remove the path segments, since they cannot change the router; and elaborate redirect chains, which add latency and confuse crawlers without producing a different underlying structure.
What to actually do
- Make the theme edit so internal links emit clean product URLs.
- Check that canonical tags are present and pointing at
/products/<handle>— they should be by default. - Normalise product paths in analytics so one product is one row.
- Design your collection structure around how customers browse rather than trying to simulate a hierarchy the router cannot express.
- Stop there. Beyond this point the effort exceeds the return for almost every catalogue.
And weigh it honestly before committing to the platform: if your entire acquisition strategy depends on a specific site architecture, this is a constraint to understand first rather than discover later. It is one of the six limitations set out in what Shopify is bad at, and it is weighed against the platform's strengths in our full Shopify review.
Asked in the aisle
Can you remove /collections/ and /products/ from Shopify URLs?
Do Shopify duplicate product URLs hurt SEO?
How do I stop Shopify using collection-scoped product links?
Can Shopify do nested category URLs?
Working out whether the platform is right for you at all? Start with the full Shopify review, or go straight to Shopify pricing, plan by plan.