Fixing Shopify Crawl Issues
Shopify controls much of how your store is crawled: it writes the sitemap, sets a sensible default robots.txt and adds canonical tags to product and collection pages. That covers a lot, but not everything.
Filters, tag views, vendor listings, app pages and international subfolders can still open up far more URLs than you have products, and merchants cannot see server logs to spot it. This guide maps the URL families a Shopify store creates, shows what the default rules already block, and explains how to extend them safely with robots.txt.liquid and hidden resources.
The URL families a Shopify store creates
Every Shopify store, whatever the theme, exposes a similar set of URL patterns. Knowing them turns a crawl report full of unfamiliar addresses into a short list of decisions.
| Pattern | Example | Blocked by default? | Usual treatment |
|---|---|---|---|
| Product | /products/linen-apron | No | Crawl and index |
| Product through a collection | /collections/kitchen/products/linen-apron | No | Canonicalised by Shopify; fix theme links |
| Variant | /products/linen-apron?variant=4211 | No | Leave; canonical points to product |
| Collection | /collections/kitchen | No | Crawl and index |
| Collection pages | /collections/kitchen?page=3 | No | Leave crawlable so products are found |
| Sort order | ?sort_by=price-ascending | Yes | Leave blocked |
| One storefront filter | ?filter.v.option.colour=Blue | No | Decide per store |
| Several filters | ?filter.v.option.colour=Blue&filter.p.vendor=Acme | Yes | Leave blocked |
| Single tag view | /collections/kitchen/linen | No | Decide per store |
| Combined tags | /collections/kitchen/linen+blue | Yes | Leave blocked |
| Vendor and type lists | /collections/vendors?q=Acme | No | Usually hide or block |
| Everything list | /collections/all | No | Decide per store |
| Blog tag archive | /blogs/news/tagged/recipes | No | Usually noindex |
| Search, cart, checkout, account | /search?q=apron, /cart | Yes | Leave blocked |
The "blocked by default" column reflects Shopify's default file at the time of writing. Shopify updates
its defaults from time to time, so always check your own live /robots.txt rather than relying
on any list, including this one.
/en-ie/ or /fr/,
repeat every family under each prefix. The default rules include matching versions for those paths, and
any rule you add should too.What the default robots.txt already does
Open https://your-store.example.com/robots.txt in a browser. The default file is long,
with separate groups for all crawlers and for a few named bots, and it ends with a Sitemap:
line. The rules that matter most for crawl waste block:
- Admin, cart, checkout, orders and account areas.
- Internal search results under
/search. - Collection URLs containing
sort_by, so reordered listings are not crawled. - Collection and blog URLs that combine tags with
+. - Collection URLs that combine two or more storefront filters.
- Policy pages under
/policies/and various internal endpoints.
What the defaults leave open is just as important. A single filter, a single tag, vendor and type
listings, /collections/all, blog tag archives and paginated collections are all crawlable.
On a small store that is usually fine. On a store with many collections, each with a dozen filter values
and a long tag list, the single-value views alone can outnumber the products several times over. That
is the gap robots.txt.liquid lets you close.
Editing robots.txt.liquid safely
Shopify lets you customise robots.txt by adding a robots.txt.liquid template to your
theme: in the admin, go to Online Store → Themes, choose Edit code
on the live theme, and add a new template of type robots.txt. The new template starts with Liquid that
reproduces the default rules. Keep that structure and add to it. Shopify's developer documentation shows
this pattern for adding a rule to the group for all crawlers:
{% for group in robots.default_groups %}
{{- group.user_agent }}
{%- for rule in group.rules -%}
{{ rule }}
{%- endfor -%}
{%- if group.user_agent.value == '*' -%}
{{ 'Disallow: /collections/vendors*' }}
{{ 'Disallow: /collections/types*' }}
{{ 'Disallow: /*/collections/vendors*' }}
{{ 'Disallow: /*/collections/types*' }}
{%- endif -%}
{%- if group.sitemap != blank -%}
{{ group.sitemap }}
{%- endif -%}
{% endfor %}
Because the loop outputs robots.default_groups, you keep every rule Shopify ships today
and any it adds in future. Removing a default rule works the same way, with an unless test
inside the rules loop that skips the rule you want to drop.
Sitemap:
line. Shopify also warns that incorrect edits can cause loss of traffic, and its support will not help
with customised robots.txt files, so test every change.Rules worth considering
- Vendor and type lists, as in the example, if you do not use them as landing pages.
- Single filter values you have decided not to index, for example
Disallow: /collections/*filter.v.pricefor price ranges, which are never useful as landing pages. - Single tag views on older themes that filter by tag, if you have replaced the useful ones with proper collections.
Before blocking, remember that blocked pages cannot show Google a noindex tag. If a pattern is already indexed and you want it removed from results, use a noindex tag first, wait for the pages to drop out, then block. The general rules for choosing which filtered views to keep are in Fixing faceted URL explosion.
How the Shopify sitemap behaves
Shopify generates /sitemap.xml automatically as an index that links to child sitemaps
for products, collections, pages and blog posts, split into several files on larger stores. You cannot
edit it directly, but you can control what goes into it:
- Products not available on the Online Store sales channel are left out, as are unpublished pages and drafts.
- The
seo.hiddenmetafield, set to1on a product, collection, page, article or blog, removes that resource from the sitemap and tells search engines not to index it. Shopify documents this for hiding pages such as thank-you pages or internal landing pages. - Password-protected stores cannot be crawled at all, so a store in development or behind a password page will show nothing to search engines until the password is removed.
- Markets with subfolders or separate domains add further URLs; check which sitemap files are declared in your live robots.txt for each market rather than assuming.
Submit /sitemap.xml in Search Console once. Shopify keeps it current as products are added and removed.
Apps, themes and other hidden URL sources
Many surprise URLs on Shopify stores do not come from Shopify itself. Check these when the crawl finds patterns that are not in the table above:
- Theme product cards that link through collection paths. The fix is a small Liquid change, covered in the Shopify ecommerce SEO guide.
- Filter and search apps that replace Shopify's storefront filtering and use their own parameters, which the default rules do not know about.
- Review, loyalty and wishlist apps that add their own pages or proxy paths under
/apps/or/pages/. - Currency and language switchers that append parameters to every internal link.
- Search result tracking parameters added to product links from on-site search, which are harmless because they carry a canonical, but inflate crawl reports.
- Removed apps that left snippets in the theme still outputting links to pages that no longer exist.
The fix, step by step
Step 1
Read your live robots.txt and sitemap
Open
/robots.txt on your live domain and save a copy, so you have a record of the defaults before
any change. Note which patterns are blocked for all crawlers, whether market subfolder versions are present,
and which sitemap is declared. Then open /sitemap.xml and each child sitemap it lists, and
check that the counts look roughly like your number of products, collections, pages and posts. Anything
wildly higher needs explaining.
Step 2
Map the URL families your store exposes
Run the Ecommerce Crawl from the home page and group the URLs it finds by pattern: products, collection-path products, collections, paginated collections, filters, tag views, vendor and type lists, blog tags and app paths. Count each group and compare it with your product total. In Search Console, open Crawl Stats under Settings and check the example URLs to see which of those families Googlebot is actually requesting.
Step 3
Decide what to leave, block or hide
For each family, choose one treatment. Leave products, collections and pagination crawlable.
Leave the default blocks in place. For single filters, tag views, vendor lists and /collections/all,
decide whether any are genuine landing pages; if they are, create a proper collection instead. Families
with no search value can be blocked in robots.txt, while individual resources you want kept live but
out of results can be hidden with a metafield.
Step 4
Edit robots.txt.liquid without losing the defaults
Duplicate the live theme as a backup, then add a robots.txt.liquid
template from the theme code editor. Keep the loop over robots.default_groups and add your
extra Disallow lines only inside the group where the user agent is *. Add a
matching rule for market subfolders where you use them. Save, reload /robots.txt in a private
window, and test each new rule against URLs that must stay crawlable.
Step 5
Hide thin resources with the seo.hidden metafield
For pages and products that must stay live but should not appear in search, such as
order confirmation pages, wholesale forms or internal campaign pages, add a metafield with namespace
seo, key hidden and value 1. You can do this through a metafield
definition in the admin, a bulk editing app or the Admin API. Check the resource has left the sitemap
and that its page source now carries a noindex tag.
Step 6
Clean up theme and app links that create URLs
Search the theme code for links that add collection paths, parameters or tag combinations to internal links, and change product cards to use the plain product URL. Check each installed app for pages or parameters it adds, and remove leftover snippets from apps you have uninstalled. If a filter app uses its own parameters, add those to your robots.txt rules or configure the app so only the filters you want are output as crawlable links.
Step 7
Check Crawl Stats after the change
Open the robots.txt report in Search Console to confirm Google has fetched your new file without errors. Run the Ecommerce Crawl again and check that blocked families have disappeared from the list of reachable URLs. After four to six weeks, compare Crawl Stats with your earlier notes: requests for blocked patterns should fade, and the examples should be dominated by products and collections. Recheck after every theme change or new app.
What you cannot change on Shopify
Some things are fixed by the platform, and it saves time to know them before planning work:
- You cannot change the
/products/and/collections/prefixes or remove them from URLs. - You cannot stop the collection-path product URLs from existing; you can only stop linking to them.
- You cannot read raw server logs, so Crawl Stats and crawl tools are your evidence.
- You cannot set HTTP status codes for individual pages; removed products return Shopify's standard 404 page, and redirects are managed in the admin's URL redirects section rather than on the server.
- You cannot edit the XML sitemap by hand, only influence what goes into it.
Server capacity is rarely the limit on Shopify, because hosting is managed and generally fast. Crawl problems on Shopify stores are almost always about how many URLs exist, not how quickly they load. For broader background, the Shopify robots and sitemap fixes cover syntax errors and sitemap warnings.
1. Can I edit robots.txt on Shopify?
Yes. Shopify lets you add a robots.txt.liquid template to your theme, which controls the file served at /robots.txt. The safest approach is to keep Shopify's loop over the default rule groups and add your own rules inside it, so you keep the defaults and any future updates. Shopify warns that mistakes can cause traffic loss and does not support customised files, so back up the theme and test every change before and after saving.
2. Should I block Shopify filter URLs?
Shopify already blocks URLs that combine two or more storefront filters, and sort orders, by default. Single filter values are left crawlable. Whether to block those depends on your store: if a single colour or brand filter matches real searches, a dedicated collection usually makes a better landing page, and the filter URL can then be blocked. Price range filters are rarely useful in search and are a common candidate for an extra rule.
3. Why does Search Console show collection-path product URLs?
Because your theme links to them. Shopify makes every product reachable through each collection it belongs to, and adds a canonical tag pointing to the plain product URL. Google follows the links, finds the duplicates, and reports them as alternate pages with a proper canonical tag. They are not an error in themselves, but changing product cards to link to the plain product URL stops crawlers being sent to the duplicates in the first place.
4. How do I remove a page from the Shopify sitemap?
Either take the resource off the Online Store sales channel, unpublish it, or set the seo.hidden metafield to 1 on it. The metafield is the right choice when the page must stay live for customers, such as an order tracking or wholesale sign-up page, but should not appear in search. It removes the resource from the sitemap and tells search engines not to index it. You cannot edit the sitemap file directly on Shopify.
5. Does Shopify Markets create duplicate content?
It can, if markets share a language and the content is identical. Shopify Markets serves each market on a subfolder, subdomain or separate domain and adds hreflang annotations that tell search engines which version is for which country, which is the correct way to handle same-language versions. Each market does add a complete copy of every URL family to the crawl, so any robots.txt rules you add should include matching versions for the market subfolders.
6. Is crawl budget a real problem for Shopify stores?
For most Shopify stores, no. Google says crawl budget matters mainly for large sites, and Shopify's hosting is fast enough that server capacity is rarely the constraint. It becomes worth attention on stores with thousands of products, many collections with filters or tags, several markets, or apps that add parameters to links. The first sign is usually a crawl or Crawl Stats report showing far more URLs than products, with many sitting in discovered but not indexed.
7. Will a password page stop Google crawling my store?
Yes. While the online store password is enabled, visitors and crawlers see only the password page, so nothing else can be crawled or indexed. This is useful while building a store, but it means Search Console will show little or nothing until the password is removed. Once you launch, remove the password, check that /robots.txt and /sitemap.xml load normally, submit the sitemap in Search Console and request indexing for the home page.
The Ecommerce Crawl maps the URLs on your store, finds faceted navigation explosion and duplicate product URLs, flags out-of-stock products, surfaces orphans and measures how efficiently your crawl is spent.
Open Ecommerce Crawl Fixes โ