Key Insights in 60 Seconds
Most of Shopify's technical SEO is handled for you. Skim what the platform does, then audit the handful of gaps that actually cost you indexation.
What You'll Learn
If you opened Google Search Console and found dozens of URLs flagged “Duplicate without user-selected canonical”, or watched pages drop out of the index, your first question is the right one: is this a Shopify problem, or is it normal? The honest answer is “mostly normal” — and the value of a technical SEO audit is knowing which of those flags are expected platform behavior and which are the few that actually cost you traffic. If that report is what brought you here, jump straight to decoding it.
This guide walks the whole picture in order: what Shopify already handles for you, where duplicate URLs really come from, the two filtering models that behave differently, how pagination and structured data should look, how to read your own store's data, whether crawl budget is even your problem, and finally which fixes you can make from the admin versus which need a developer. No fabricated statistics, no scare tactics — just the platform's documented behavior and Google's own guidance.
What Shopify's Technical SEO Already Handles
Before you fix anything, know what you don't have to. Shopify handles the three pieces of technical SEO that merchants on open-source platforms wrestle with manually: canonical tags, robots.txt, and the sitemap. Starting from what the platform already does keeps the audit focused — you're looking for the handful of gaps, not re-solving problems Shopify solved for you.
Default canonical tags
Every Shopify theme has access to a global canonical_url object available on every page , which themes use to output a canonical link element. That tag tells search engines which URL is the representative one when the same content is reachable through several addresses. It is worth being clear about what a canonical does and doesn't guarantee, because that shapes everything that follows in this audit.
You can indicate your preference to Google using these techniques, but Google may choose a different page as canonical than you do, for various reasons. That is, indicating a canonical preference is a hint, not a rule.
In other words, a canonical tag steers Google; it doesn't force it. Shopify's defaults are sensible, but if you ever need to override a canonical at the collection level, there's no admin setting for it — that's a theme-level change, which is why it lands in the developer column later.
robots.txt and robots.txt.liquid
Shopify generates a default robots.txt that works for most stores. Out of the box it already disallows the paths that should never be crawled — and one of them is the key to the whole faceted-navigation question later:
| Default disallow rule | What it protects |
|---|---|
/admin | Your store's admin area |
/cart | The cart page |
/checkout | The checkout flow |
/collections/*+* | Multi-tag filtered collection URLs |
/search | Internal search results |
/policies/ | Policy pages |
Notice the fourth rule. Shopify already blocks multi-tag filter combinations — URLs where two or more tags are joined with a + — but it does not block single-tag filters. Hold that thought; it's the difference between panic and a plan when we reach filtering. If you do need to go beyond the defaults, Shopify lets you add a robots.txt.liquid template with four kinds of control:
Your sitemap.xml
Every Shopify store automatically generates a sitemap.xml containing links to your products, primary product images, pages, collections, and blog posts. It updates itself whenever you add a webpage, product, collection, image, or blog post, and it always lives at your domain root (for example, example.com/sitemap.xml). The main file links out to separate sitemaps for products, collections, blogs, and pages.
Two practical notes. You don't create or edit it — it's fully generated, so there's no custom sitemap to upload. And a sitemap reader like Google can't access it if your store is password protected, so confirm the password page is off before you expect indexing. To see how all of this fits into the wider platform, our overview of how a Shopify store actually works maps the moving parts.
Where Duplicate URLs Actually Come From
When you have no preferred canonical set, Google will identify which version of the URL is objectively the best version to show to users. That's the safety net under everything below. Each row is a legitimate way Shopify generates extra URLs, how it happens, and what the default handling is — including the honest gaps where Shopify doesn't document the behavior and you have to verify on your own store.
Duplicate URL Sources on Shopify
| URL source | Example | How it is generated | Default handling |
|---|---|---|---|
| Collection-scoped product URLs | /collections/shoes/products/x | Standard storefront routing — a product is reachable inside every collection it belongs to. | Themes usually keep one canonical_url on the product; Shopify does not document this per-route — verify with URL Inspection. |
| Single-tag filters | /collections/shoes/blue | Tag filtering adds the tag as a URL path segment. | NOT blocked by the default robots.txt — you decide whether to leave or block it. |
| Multi-tag filters | /collections/shoes/blue+wide | Tags combine with a + and AND-logic (only products with both tags show). | Blocked by the default robots.txt rule Disallow: /collections/*+* — already handled. |
| Storefront filters | /collections/shoes?filter.v.option.color=blue | Shopify Search & Discovery reflects filters as URL query parameters. | Crawlable query parameters — apply Google's faceted-navigation guidance if the catalog is large. |
| Variant parameters | /products/x?variant=123 | Selecting a variant appends a ?variant= parameter. | Themes usually keep the same canonical_url — Shopify does not document this explicitly, so verify. |
| Pagination | /collections/shoes?page=2 | The paginate Liquid tag emits ?page=N links across a collection. | Each page is its own URL and canonical — Google treats them as separate pages, which is correct. |
| Vendor / type collections | /collections/vendors?q=Acme | link_to_vendor and link_to_type auto-generate collection pages for every vendor and product type. | Generation is documented; the indexation status of these pages is not — audit them on your own store. |
URL generation per Shopify Liquid docs; canonical/indexation behavior marked “verify” is not documented per-route by Shopify.
The pattern across that table is that most duplicate URLs are handled for you — by default canonicals, by the robots.txt multi-tag block, or by Google's own consolidation. The rows worth your attention are the ones marked “verify” and the single-tag filters, because those are where a large catalog can leak crawl. This short walkthrough shows the duplicate-content idea in a Shopify context before we go deeper:
Tag Filters vs Search & Discovery: Two SEO Models
This is the part most generic SEO advice gets wrong for Shopify. “Faceted navigation” isn't one thing on this platform — it's two, and they produce completely different URLs. Which one your store uses decides what crawlers see and what, if anything, you should block.
Tag-based filtering (URL path segments)
With tag filtering, a selected tag becomes a segment in the URL — filtering the Front page collection to the new tag produces /collections/frontpage/new. Combine tags and they join with a + using AND-logic: /collections/frontpage/new+sale shows only products that have both tags. As you saw, the default robots.txt blocks those multi-tag + combinations, but single-tag URLs like /collections/frontpage/new stay crawlable.
Search & Discovery filters (query parameters)
Shopify's free Search & Discovery app uses a different mechanism. When filters are applied, they're reflected in the collection or search URL through URL parameters such as ?filter.p.product_type= or ?filter.v.option.color=. Shopify launched the Search & Discovery app in August 2022 , and it's the current, supported way to add merchandising-grade filters.
How to tell which one you have
Filter one of your own collections and read the address bar. Extra folders after the collection handle mean tag-based filtering; ?filter. parameters mean Search & Discovery. The reason it matters is crawl efficiency: Google notes that crawlers hit a very large number of faceted URLs before working out they're useless, which is why its guidance on large filtered catalogs is blunt.
Use robots.txt to disallow crawling of faceted navigation URLs. Oftentimes there's no good reason to allow crawling of filtered items, as it consumes server resources for no or negligible benefit.
That guidance is aimed at large catalogs; a 200-product store rarely needs to act on it. The comparison below is the quick reference for identifying your model and the sensible next step for each.
Tag Filtering vs Search & Discovery
| Dimension | Tag-based filtering | Search & Discovery (Filter API) |
|---|---|---|
| URL shape | Path segment: /collections/x/blue | Query parameter: ?filter.v.option.color=blue |
| How to identify it | Filtering adds folders after the collection handle. | Filtering adds ?filter. parameters to the collection URL. |
| Default robots.txt handling | Single tags crawlable; only multi-tag + combos are blocked. | Query-parameter URLs are crawlable by default. |
| What to do | Decide per collection whether single-tag URLs should be crawlable. | Apply Google's faceted-navigation guidance on large catalogs. |
Pagination Done Right
Collections and blogs split across pages with the paginate Liquid tag, which generates ?page=N links. The old advice was to wire these together with rel="next" and rel="prev", but Google retired that: it no longer uses those tags. Here is what actually matters now.
The good news for Shopify merchants is that the default paginate behavior already gives each page a unique ?page=N URL, so most of this is handled. Your job is to make sure your theme doesn't force every page's canonical back to page one — Google's guidance is explicit that each page should be its own canonical.
Structured Data and Your Theme
Structured data is what lets your products appear as rich results — with price, availability, and review stars — in search. Shopify provides a structured_data Liquid filter that converts an object into schema.org format: a product without variants becomes Product, a product with variants becomes ProductGroup, and an article becomes Article. The filter exists — but whether your storefront actually outputs it depends on how your theme is built.
Modern themes generally handle this well; Shopify's flagship Horizon and other current Online Store 2.0 themes ship Product markup. But “generally” isn't “verified,” so check rather than assume: run a product URL through Google's Rich Results Test to see exactly which rich results your page can generate. If your theme's architecture is itself the question — how templates and markup are assembled — our guide to Shopify Online Store 2.0 covers sections, templates, and where theme code lives.
See the Scale on Your Own Store
Theory only goes so far; now look at your own data. You don't need a paid tool to run a technical audit — Google gives you the two that matter, and a free crawler fills in the rest. Start with the report that probably brought you here.
Reading the Page indexing report
In Search Console, the Page indexing report groups your URLs by status. The trap is reading every “Duplicate” line as a problem. Most aren't. Here's what each of the four statuses you'll see most on a Shopify store actually means, and whether it's normal or worth acting on.
Decoding Your Page Indexing Report
| Search Console status | What Google means | Normal or act? |
|---|---|---|
| Duplicate without user-selected canonical | The page is a duplicate of another page but doesn't declare a preferred canonical. | Usually normal on filter, variant, and pagination URLs. Act only if it lands on a page you want indexed. |
| Duplicate, Google chose different canonical than user | The page is marked canonical, but Google thinks another URL is a better canonical. | Act — a signal mismatch. Check the page with URL Inspection and align your canonical with Google's choice. |
| Crawled – currently not indexed | Google crawled the page but didn't index it; it may or may not be indexed later. | Normal to leave — no need to resubmit. Act only if important pages sit here for a long time. |
| Alternate page with proper canonical tag | The page correctly points to a canonical that is indexed, so there's nothing to do. | Normal — this is the healthy state. No action needed. |
Status definitions: Google Search Console Help — Page indexing report.
Confirming a canonical with URL Inspection
When a status does look wrong, the URL Inspection tool settles it. It shows two fields that matter for duplicates: the user-declared canonical (what your page says) and the Google-selected canonical (what Google actually chose among similar pages). When they differ, Google decided another URL was a better canonical — that's your signal to investigate the page rather than guess.
Why the site: operator misleads
site: operator doesn't necessarily return all the URLs indexed under a prefix, so it's the wrong tool for counting indexed pages or deciding something isn't indexed. If a URL doesn't show in a site: query, use the URL Inspection tool to check whether it can be indexed instead of assuming it's missing.Free crawlers for the full picture
To see the URLs a crawler actually reaches on your store, a desktop crawler helps. Screaming Frog's free tier crawls up to 500 URLs , which is plenty to spot filter and pagination sprawl on a small catalog. Pair it with the Rich Results Test for structured data, and you have a complete diagnostic kit without spending anything.
Is Crawl Budget Actually Your Problem?
“Crawl budget” is the time and resources Google devotes to crawling a site, set by a crawl-capacity limit and crawl demand. It's the reason a lot of Shopify SEO advice tells you to panic about filter URLs. Before you do, ask whether it applies to you at all — because Google is refreshingly direct about who this even concerns.
If your site doesn't have a large number of pages that change rapidly, or if your pages seem to be crawled the same day that they are published, you don't need to read this guide. For Google Search specifically, merely keeping your sitemap up to date and checking your index coverage regularly is adequate.
Google reserves its crawl-budget guidance for large sites — roughly a million or more unique pages that change moderately often — and for medium or larger sites of ten thousand or more pages with very rapidly changing content. Below that, the platform's defaults and Google's consolidation do the work. To find out which camp your store is in, estimate your crawl surface — the number of URLs a crawler can request for your catalog shape — with the tool below.
Ranges: 10–500,000 products, 1–10,000 collections, 0–30 tags, 1–50 pages. This counts single-tag filter and pagination URLs — the patterns Shopify's default robots.txt does not block.
Your crawl surface is below the 10,000-page mark where Google's crawl-budget guidance kicks in. Google says stores this size only need to keep the sitemap current and check index coverage. Your priority is not saving crawl — it is canonical and indexation cleanliness: make sure the pages you care about are the ones getting indexed.
Estimate only. This counts single-tag filter URLs and pagination URLs only — not confirmed duplicate-content penalties, and it does not predict traffic. It excludes multi-tag filter combinations (blocked by Shopify's default robots.txt), Shopify Search & Discovery's ?filter.* query-parameter filter URLs (a separate filtering model this estimator does not count — size that separately if your store runs on it), variant and vendor/type URLs (whose indexation Shopify does not document), and any other URLs your theme or apps add. Crawl-budget thresholds are Google's, verified July 2026.
If the estimator puts you in the safe zone, resist the urge to over-engineer robots.txt — your effort is better spent on canonical and indexation cleanliness. If it puts you in medium or large territory, that's where disallowing low-value filter URLs earns its keep, because Google notes that using rel=canonical on faceted URLs can, over time, decrease the crawl volume of the non-canonical versions.
What's Your Technical SEO Risk?
You've seen what Shopify handles, where duplicates come from, and how to read your own data. Now turn it into a verdict. Answer six questions about your theme, filtering, robots.txt, Search Console, catalog size, and canonical setup, and you'll get a risk level plus the specific gap to close first.
Fix It Yourself or Call a Developer
Here's the honest split between what you can do from the Shopify admin and what genuinely needs someone in the theme code. Plenty of technical SEO is DIY: you can edit page titles and meta descriptions from the Search engine listing section without touching a line of Liquid. The work that needs a developer is the work that touches theme templates or the robots file.
DIY or Call a Developer?
| The fix | DIY or developer? | Why |
|---|---|---|
| Edit a product or page title and meta description | DIY — Shopify admin | The Search engine listing section has a pencil-icon editor; no theme code. |
| Keep the sitemap current | Automatic | Shopify generates and updates sitemap.xml for you; you can't (and shouldn't) hand-edit it. |
| Block single-tag or faceted filter URLs | Developer | This means editing robots.txt.liquid — an unsupported customization where mistakes are costly. |
| Override a collection's canonical URL | Developer | There's no admin field for it; it takes a metafield plus a theme.liquid edit, not a native setting. |
| Fix missing or malformed structured data | Developer | Structured data is emitted by theme Liquid; correcting it means working in the theme code. |
The dividing line is code. Anything that changes theme Liquid or robots.txt.liquid carries real risk — recall that Shopify warns a wrong robots edit can cost all your traffic — so it belongs with someone who does this for a living. If you're not sure whether you need a freelancer, an agency, or just an afternoon in the admin, our Shopify development guide routes you to the right specialist and budget in about a minute.
One thing this audit deliberately leaves out is storefront speed. Core Web Vitals matter for rankings, but they're a different discipline from crawl and indexation — our guide to what the best Shopify stores do differently covers speed as a conversion and ranking lever in full.
Your Impact-First Audit Protocol
The table above tells you who does each fix; this checklist tells you in what order. It's sequenced so you measure before you change anything and confirm the pages that matter before spending on code. Steps one through three are DIY for everyone; step four onward depends on your catalog size and filter model, and the last step is where a developer comes in. Tick each off as you go — your progress is saved on this page.
Impact-First Technical SEO Audit
Work top to bottom. The first three steps are DIY diagnosis; the last steps route code-level fixes to a developer and verify them.
Open Google Search Console and note which URLs show Duplicate or Crawled – currently not indexed, and whether any are pages you actually care about. This is a measurement, not a fix — do it first. DIY.
Before you tick this off
- Opened Search Console > Indexing > Pages and reviewed the status breakdown
- Listed which statuses sit on filter, variant, or pagination URLs versus real product and collection pages
- Flagged any product or collection page that is NOT indexed
Run the URL Inspection tool on your top products and collections and compare the user-declared canonical with the Google-selected canonical. DIY.
Before you tick this off
- Inspected your best-selling products and key collections
- Compared user-declared canonical against Google-selected canonical for each
- Noted any page where the two disagree
Filter one of your collections and read the URL: path segments mean tag filters, ?filter. parameters mean Search & Discovery. Knowing which you run decides everything downstream. DIY.
Before you tick this off
- Applied a filter on a live collection and copied the resulting URL
- Classified it as tag-based (path segment) or Search & Discovery (query parameter)
- Checked whether single-tag or filter URLs appear in your Search Console coverage
For a large catalog, decide whether single-tag and pagination URLs should be crawlable, and plan the robots.txt rules that reflect that. DIY to plan; developer to edit robots.txt.liquid.
Before you tick this off
- Estimated your crawl surface and compared it to Google's crawl-budget thresholds
- Decided which filter URL patterns add no search value
- Wrote down the robots.txt rules a developer would implement
Check a product page's rendered canonical tag and run the Rich Results Test to confirm Product structured data is present and valid. DIY to check; developer to fix.
Before you tick this off
- Viewed a product page's rendered canonical link element
- Ran the Rich Results Test on a product and a collection URL
- Recorded any structured-data errors the test reported
Route robots.txt.liquid rules, canonical overrides, and structured-data fixes to a developer, then re-run URL Inspection to confirm the changes took. Developer work, verified by you.
Before you tick this off
- Briefed a developer on the specific robots, canonical, and structured-data fixes
- Confirmed the changes are live in the rendered HTML
- Re-ran URL Inspection on the affected pages to verify Google's view updated
The Bottom Line
A Shopify technical SEO audit isn't about rebuilding what the platform already does — it's about telling normal behavior apart from the few real gaps. Most “Duplicate” flags are expected. Crawl budget is a large-catalog concern, not a universal one. And the highest-impact fixes — robots rules, canonical control, structured data — are theme code, not admin toggles.
Frequently Asked Questions
Front-end developer specializing in Shopify since 2017. Experienced in building custom Liquid themes, optimizing storefront performance, and integrating third-party apps. Writes in-depth, data-driven e-commerce guides based on hands-on experience with real merchant stores.
What to Read Next
Hire a Shopify Developer: When, Why & What It Costs
When you actually need a Shopify developer, real costs by project type, freelancer vs agency rates, and a hiring process that avoids costly mistakes.
Read articleWhat Is a Shopify Theme? Types, Costs & How to Choose
Everything about Shopify themes — how they work, free vs premium comparison, top themes by niche, customization options, and how to choose the right one.
Read articleShopify AI Tools: What Sidekick & Magic Actually Do
Where Shopify's built-in AI — Sidekick and Magic — is reliable without editing, where it fails, plan limits, and when a paid AI app is worth it.
Read article