Shopify handles a surprising amount of technical SEO for you and then blocks you from fixing the things it gets wrong. Effective work on the platform means knowing which constraints are genuinely fixed, which are theme-level and editable, and which "problems" are not worth spending time on.
What you cannot change (and should stop worrying about)
/collections/and/products/path prefixes./pages/for static content and/blogs/{blog}/{article}for posts.- The core checkout flow on non-Plus plans.
- Server-side response headers and caching behaviour.
None of these hold a store back. Google indexes millions of Shopify URLs in this format. Effort spent trying to strip prefixes is effort not spent on duplication and performance, which do matter.
Duplicate URL patterns to control
| Pattern | Risk | Handling |
|---|---|---|
/collections/x/products/y | Duplicate of the product URL | Canonical to /products/y — verify the theme outputs it |
/collections/all | Competes with real collections | Keep it out of internal linking and the sitemap where a curated equivalent exists |
Tag filters /collections/x/tag1+tag2 | Combinatorial URL explosion | Index only tag pages with real search demand; block or noindex the rest |
?sort_by=, ?filter.* | Crawl waste | Canonical to the clean collection URL; avoid crawlable links to sorted states |
Paginated ?page=2 | Thin duplicates if mishandled | Self-canonical each page; keep products linked from somewhere crawlable |
Variant URLs ?variant= | Duplicate product content | Canonical to the parent product |
canonical_url more often than store owners realise. Crawl the store and group by canonical value to see what is actually output.
robots.txt.liquid
Shopify's default rules are sensible: cart, checkout, account, internal search and most parameter paths are already disallowed. Add rules to remove crawl waste — for example blocking multi-tag filter combinations such as Disallow: /collections/*+* — rather than to hide problems. A blocked URL keeps whatever indexing state it already had, because Google can no longer read the directive on the page.
Sitemaps
Shopify generates /sitemap.xml automatically and it cannot be edited directly. Two consequences worth knowing:
- Pages you set to noindex through a theme edit may still appear in the generated sitemap on some setups — check and resolve the contradiction where it happens.
- The sitemap includes all published products; unpublishing rather than noindexing is the reliable way to remove something from it.
Indexing controls
Shopify has no indexing UI, so it is done in theme.liquid with a Liquid condition on the template name and current_tags, outputting <meta name="robots" content="noindex, follow"> where appropriate. Typical noindex candidates: internal search results, tag-filtered collections without search demand, thank-you and policy duplicates, and any collection created purely for merchandising with no unique content.
Redirects
Shopify's URL redirect tool handles one-to-one 301s and imports in bulk via CSV — this is the right place for them. Two habits prevent trouble:
- When you change a product or collection handle, Shopify offers to create the redirect automatically. Accept it; recreating a missing redirect later requires knowing the old handle.
- After a replatform onto Shopify, build the redirect map from a full URL inventory of the old site, including images and blog paths — the same process as any migration.
Collection and product page content
Technical hygiene gets a store crawled; content gets it ranked. The recurring gaps on Shopify stores:
- Collection pages with a heading and a product grid, and nothing that explains the category or answers buying questions.
- Manufacturer-supplied product descriptions duplicated across every retailer selling the same item.
- No internal linking between related collections.
- Blog content disconnected from the products it should support.
Put unique intro copy above the grid on commercially important collections, supporting content below it, and link between related collections with descriptive anchor text.
Performance at theme level
Shopify controls the server, so your levers are in the theme and the app stack:
- Audit apps. Every installed app can inject scripts into every page, including ones where it does nothing. Removing an unused app is usually the single largest win.
- Use Shopify's image CDN correctly with sized URLs and
srcsetrather than full-resolution originals scaled in CSS. - Preload the LCP image on product and collection templates; never lazy-load it.
- Limit apps that render above the fold — review widgets and currency selectors are common CLS sources.
- Defer non-critical scripts and load chat or popup apps after interaction.
The store-specific detail is covered in Shopify speed optimisation.
Structured data
Most themes output some product schema and most review apps output their own, which frequently produces conflicting or duplicated graphs. Validate with the Rich Results Test and ensure: one Product node per product page, accurate Offer price and availability, BreadcrumbList matching the visible trail, and review markup only where reviews are actually displayed.
Diagnostic pass for any Shopify store
- Crawl the store and group URLs by pattern — collections, tags, parameters, products.
- Check canonical output on product URLs reached via collections and variants.
- Review robots.txt.liquid against the crawl waste you found.
- Compare indexed URL count in Search Console against products plus collections plus pages; a large excess means filter or tag URLs are being indexed.
- Test the LCP element and app script load on product and collection templates.
- Validate structured data on one product, one collection and one article.