Build a templates/robots.txt.liquid that keeps Shopify's default rules and adds yours: AI crawler policy, extra Disallow paths, custom groups and sitemaps. Paste any robots.txt.liquid or live /robots.txt to check it, and test a URL the way Googlebot reads it.
The loop's rules as templated stores printed them on 16 September 2026. Shopify can change them; your store's may differ.
2 · Check a robots.txt.liquid or robots.txt
Nothing leaves your browser.
Paste a file and press Check file.
What the checker read (rendered template)
3 · Test a URL path
Pick what to test against, a crawler and a path. If the checker is empty, the tester uses Shopify's managed file.
What robots.txt.liquid is
Every Shopify store serves a /robots.txt file whether you touch it or not. robots.txt.liquid is the theme template that lets you change what it says. It lives at templates/robots.txt.liquid, it can't be a JSON template, and no theme ships with it: you add it when you need it2. The glossary entry for robots.txt.liquid has the short definition.
Shopify puts a caution on the feature: it's an unsupported customization, Support can't help with it, and "Incorrect use of the feature can result in loss of all traffic"4. That's why this generator never lets you disallow / for every crawler and always keeps Shopify's default loop.
Shopify's two default files
On 16 September 2026 we fetched /robots.txt from 38 Shopify storefronts. Apart from three with fully custom files, they split cleanly in two.
Stores without a template (23 of them, including Shopify's own Dawn demo store) served a new managed file5. It opens with "# Shopify storefront. Public product, collection, page, blog, policy, cart, and localized HTML is crawlable", then a block of comments for AI agents. It has 87 rule lines in two groups (* and adsbot-google), starts with Allow: /, and doesn't block /search or /policies/.
Stores with a template (the other 12) printed an older set through the loop: /search and /policies/ blocked, and extra groups for Nutch, AhrefsBot, AhrefsSiteAudit, MJ12bot and Pinterest. Seven of them printed the same default lines, word for word, including recent additions, so this is what robots.default_groups returns today, not stale copies.
Shopify hasn't announced the change that we could find, and the docs haven't caught up. The help page still lists /search and /policies/ among the key default entries4, and the developer docs say the default rules "are mirrored through the Liquid robots object"2. On live stores, they aren't mirrored: adding a template switches a store from the managed file to the older rules.
One more detail explains why the managed file stopped blocking search. Shopify's /search?q= pages now send X-Robots-Tag: noindex, nofollow, on stores with and without a template (checked on four stores). Google can only obey that noindex if it's allowed to fetch the page: "the page or resource must not be blocked by a robots.txt file"8. A Disallow: /search hides the noindex, and blocked URLs can still be indexed from links. The opposite advice exists too: Google's crawl-budget guide prefers robots.txt over noindex for pages you never want crawled, because a noindexed page still gets fetched9. That guide is written for sites with a million-plus pages, or 10,000-plus changing daily. For most stores, letting the noindex work is the cleaner choice. The default rules guide covers the reasoning behind each block.
Show both files side by side (approximation, 2026-09-16)
robots.txtNo template: Shopify's managed file (comment block left out)
[shop-id] stands for your store's numeric ID. Both files change when Shopify changes them.
Do you need a template?
Probably not, if all you want is sensible defaults. The managed file already allows AI crawlers, blocks checkout, cart, account and the filter traps, and lists your sitemap. You need a template when you want a rule it doesn't have:
different rules per domain on Shopify Markets, using request.host1.
If you already have a template that only repeats Shopify's loop, deleting it moves the store to the managed file. Shopify documents the delete steps on the help page4. If you keep one, the generator's "match Shopify's managed file" option skips the three older blocks so your file behaves like the managed one on search and policy pages.
The loop, line by line
This is the loop exactly as Shopify's template reference prints it2:
liquidShopify's documented robots.txt.liquid
{% for group in robots.default_groups %}{{- group.user_agent -}}{% for rule in group.rules %}{{- rule -}}{% endfor %}{%- if group.sitemap != blank -%}{{ group.sitemap }}{%- endif -%}{% endfor %}
Line
Code
What it does
1
{% for group in robots.default_groups %}
Loops over Shopify's rule groups. Each group is one user-agent and its rules.
2
{{- group.user_agent -}}
Prints the group's User-agent: line. The dashes are Liquid whitespace control: they strip the spaces and line breaks around the tag.
4
{% for rule in group.rules %}
Loops over the group's rules. Each rule has a directive (Allow or Disallow) and a value (the path)3.
5
{{- rule -}}
Prints one rule, for example Disallow: /admin.
8
{%- if group.sitemap != blank -%}
Shopify returns a blank sitemap for groups that don't need one, so only the others print it.
9
{{ group.sitemap }}
Prints Sitemap: https://your-store.com/sitemap.xml.
10–11
{%- endif -%}{% endfor %}
Close the sitemap check and the groups loop.
Lines 8 to 10 are the ones people drop when they copy a snippet, and then robots.txt stops telling crawlers where the sitemap is. The validator flags that.
The generator prints the same objects but lays the loop out differently, with one printed item per line and no dash that could strip a line break:
liquidThe generator's loop, with nothing selected
{% for group in robots.default_groups -%}{{ group.user_agent }}{% for rule in group.rules -%}{{ rule }}{% endfor -%}{% if group.sitemap != blank -%}{{ group.sitemap }}{% endif %}{% endfor -%}
The reason is line breaks. Shopify doesn't document where its objects put them3, and on live stores lines run together. A large DTC store's robots.txt currently contains …-remoteDisallow: /collections/*-loop and …-remoteSitemap: https://…/sitemap.xml: a custom rule and a Sitemap line glued to the last default rule, so all three are broken. A 2021 GitHub report describes the same thing with Shopify's own one-line example20. The pattern fits objects that bring a line break before a user-agent or rule line but not before a Sitemap line, which would mean the documented loop above can glue the Sitemap line too. Ending every line with its own break sidesteps the question. If an object also adds one, you get a blank line, which Google and RFC 9309 crawlers ignore.
Four safe customisations
Shopify documents three kinds of change: add a rule to an existing group, remove a default rule, and add rules outside the loop1. Each pattern below is the generator's output for that change, so it keeps the loop and its line breaks.
1. Add a rule to Shopify's * group
Check for the * group inside the loop and print your rule there, which keeps one group per crawler.
liquidAdds Disallow: /apps/old-review-app/ to the * group
{% for group in robots.default_groups -%}{{ group.user_agent }}{% for rule in group.rules -%}{{ rule }}{% endfor -%}{% if group.user_agent.value == '*' -%}Disallow: /apps/old-review-app/{% endif -%}{% if group.sitemap != blank -%}{{ group.sitemap }}{% endif %}{% endfor -%}
2. Remove a default rule
Skip the rule inside the rules loop with unless, Shopify's documented method1. This one drops the loop's Disallow: /search, so Google can fetch search pages and read their noindex header. When a rule isn't there, the unless does nothing.
liquidSkips Disallow: /search in every group
{% for group in robots.default_groups -%}{{ group.user_agent }}{% for rule in group.rules -%}{% unless rule.directive == 'Disallow' and rule.value == '/search' -%}{{ rule }}{% endunless -%}{% endfor -%}{% if group.sitemap != blank -%}{{ group.sitemap }}{% endif %}{% endfor -%}
3. Block a crawler or add a group
Crawlers that aren't in the default set get their own group, written as plain text after the loop. Shopify's example blocks discobot1. The same shape blocks an AI training crawler.
liquidPlain-text groups after the loop
{% for group in robots.default_groups -%}{{ group.user_agent }}{% for rule in group.rules -%}{{ rule }}{% endfor -%}{% if group.sitemap != blank -%}{{ group.sitemap }}{% endif %}{% endfor -%}# AI model training crawlers. Blocking these doesn't remove you from search or AI answers.User-agent: GPTBotDisallow: /User-agent: discobotDisallow: /
Don't do this for Googlebot or Bingbot unless you mean it. A crawler with its own group follows only that group7, so a Googlebot group holding just a crawl-delay would let Googlebot into /checkout and the cart.
4. List another sitemap
Add a Sitemap: line after the loop. It needs the full URL with https:// and the host, and it can point at another host7. Your main /sitemap.xml already comes from {{ group.sitemap }}.
liquidAn extra sitemap after the loop
{% for group in robots.default_groups -%}{{ group.user_agent }}{% for rule in group.rules -%}{{ rule }}{% endfor -%}{% if group.sitemap != blank -%}{{ group.sitemap }}{% endif %}{% endfor -%}# Extra sitemapsSitemap: https://your-store.com/apps/image-sitemap/sitemap.xml
AI crawlers and what blocking costs
Two decisions get mixed up here. Training crawlers feed future models, and blocking them costs no visibility. Search crawlers and user-triggered fetchers put your pages into AI answers, and blocking them takes you out. Shopify adds a third point: if you sell through agentic storefronts such as ChatGPT or Microsoft Copilot, your product data reaches them through Shopify Catalog "independently of /robots.txt", so a robots block affects only open-web discovery4. For the policy side, read AI bots in Shopify's robots.txt and AI crawlers on Shopify.
Model training
Token
What it does
What blocking costs
Follows robots.txt
GPTBot OpenAI
Collects pages that may be used to train OpenAI's foundation models.13
Opts your content out of OpenAI training. ChatGPT search is a separate bot, and OpenAI says each setting is independent.
Yes
ClaudeBot Anthropic
Collects web content for Anthropic's model training.14
Signals that your future content should be left out of Anthropic's training data. Claude-SearchBot and Claude-User are separate.
Yes
Google-Extended Google
A robots.txt token, not a crawler. It controls whether content Google already crawls can be used to train Gemini models and to ground Gemini answers.10
Google says it doesn't affect inclusion or ranking in Google Search. AI Overviews are part of Search and follow Googlebot.
Token only, read by the vendor's main crawler
Applebot-Extended Apple
A token, not a crawler. It controls whether Apple can use your pages to train its foundation models.16
Apple says pages that disallow it can still appear in its search results.
Token only, read by the vendor's main crawler
CCBot Common Crawl
Builds Common Crawl's open web archive, a dataset many AI labs train on.17
Keeps new pages out of future Common Crawl snapshots. No search product depends on it.
Yes
meta-externalagent Meta
Meta says it's used for training foundation AI models or improving products by indexing content directly.18
Opts out of Meta AI training. Meta also uses it for product indexing, so the block reaches past training.
Yes
Amazonbot Amazon
Amazon says it improves Amazon's products and services and may be used to train Amazon AI models.19
Opts out of Amazon AI training. It also feeds Amazon's products, so the block reaches past training.
Yes
AI search and citations
Token
What it does
What blocking costs
Follows robots.txt
OAI-SearchBot OpenAI
Finds pages to show in ChatGPT's search features.13
Your pages stop appearing in ChatGPT search answers.
Yes
Claude-SearchBot Anthropic
Crawls to improve the quality of Claude's search results.14
Anthropic says blocking it stops your content being indexed for search, which can cut your visibility in Claude's answers.
Yes
PerplexityBot Perplexity
Surfaces and links sites in Perplexity's search results. Perplexity says it isn't used to train models.15
Your pages stop being cited as Perplexity sources.
Yes
meta-webindexer Meta
Meta says it improves Meta AI search result quality.18
Less of your store in Meta AI's search answers.
Yes
Amzn-SearchBot Amazon
Improves search in Amazon products. Amazon says it doesn't crawl for model training.19
Less of your store in search experiences inside Amazon products.
Yes
User-triggered fetchers
Token
What it does
What blocking costs
Follows robots.txt
ChatGPT-User OpenAI
Fetches a page for certain user actions in ChatGPT and Custom GPTs.13
OpenAI says robots.txt rules may not apply to it, because a user started the request.
May ignore it
Claude-User Anthropic
Fetches a page when a Claude user asks a question that needs it.14
Claude can't read your page when a shopper asks it about your store.
Yes
Perplexity-User Perplexity
Fetches a page when a Perplexity user asks a question.15
Perplexity says this fetcher generally ignores robots.txt, because a user asked for the page.
Handles user actions, such as answering Alexa questions that need current information.19
Amazon says it may not follow all robots.txt directives, because a user triggered the request.
May ignore it
Three facts trip people up. Google-Extended controls Gemini training and grounding, and Google says it "does not impact a site's inclusion in Google Search"10. AI Overviews are part of Search, so Googlebot's rules and the snippet controls decide those11. Anthropic's current page lists ClaudeBot, Claude-SearchBot and Claude-User; guides that block anthropic-ai or claude-web target tokens that page no longer mentions14. And OpenAI, Perplexity, Meta and Amazon all say their user-triggered fetchers may not follow robots.txt, because a person asked for the page.
What the validator catches
Paste a template and the checker renders it against the loop's current rules, then runs the same checks it runs on a live /robots.txt. Blocking checks use the real matcher, so a wildcard that happens to cover /products/ gets caught too. Paste a live file and it also tells you which of Shopify's two default files it's looking at.
Check
Severity
Why it matters
Default loop removed, or no {{ rule }} inside it
Critical
Shopify's rules for checkout, cart and the filter traps stop printing, and never update again.
{{ group.user_agent }} missing
Critical
The rules print without their User-agent line and attach to the wrong group or none.
Unbalanced Liquid tags
Critical
A missing {% endfor %} or {% endif %} means Liquid can't parse the file.
Disallow: / for *, Googlebot or Bingbot
Critical
The whole store drops out of crawling. This is the "loss of all traffic" edit.
Homepage, /products/, /collections/ or theme CSS/JS under /cdn/ blocked
Critical
Google can't crawl what you sell, or can't render the pages it does crawl.
File over 500 KiB
Critical
Google ignores everything after the first 500 KiB7.
Two directives on one line, or a line the template doesn't end with a break
Warning
"…-remoteSitemap: https://…" breaks both the rule and the sitemap line.
group.sitemap lines dropped, or no Sitemap line
Warning
Crawlers lose the pointer to your sitemap.
A Disallow over /search, which already sends a noindex header
Warning (info when it's the loop's own rule)
Google can't see a noindex on a page it isn't allowed to fetch8. Very large stores may still keep the block for crawl budget.
AI search or user bots blocked
Warning
Named with what each one costs. Training bots are listed as information, not a problem.
noindex, nofollow in robots.txt
Warning
Google reads only user-agent, allow, disallow and sitemap7.
Duplicate groups; a Googlebot or Bingbot group that skips the * rules
Warning
Older crawlers may read only the first group; a crawler with its own group ignores Shopify's defaults.
Rules before any User-agent, paths without a leading /, typos, invisible characters, curly quotes, BOM
Warning
Skipped by crawlers, or accepted by Google and nobody else. Pasted-in characters are invisible in the editor.
A template at all; objects the template doesn't support; outdated tokens; crawl-delay for Google
Info / warning
A template switches the store to the older defaults. Only robots, group, rule, user_agent, sitemap and request work here1.
How Google reads the rules
The path tester follows Google's published rules7. A crawler obeys one group: the one naming its user-agent token, or the * group if none does. Groups that name the same crawler are merged. User-agent matching ignores case; paths don't. Inside the group, the longest matching rule path wins, and when an Allow and a Disallow tie, the Allow wins. Only two characters are special: * matches any run of characters, and $ at the end anchors the match to the end of the URL. A ? is just a character.
Allowed. Only two or more filters together are blocked6.
/search?q=shirt
Managed file / the loop
Allowed (and noindexed by its header) / blocked.
The tool's automated tests run every example in Google's wildcard and precedence tables. Two limits: it reads rules the way Google does, and other crawlers can differ at the edges. For a pasted template it tests the rendered approximation, not your store's exact defaults.
Install and test
From your Shopify admin, go to Online Store. For the theme, click the … menu, then Edit code4. Work on an unpublished copy of the theme first.
Click Add a new template, select robots, then Create template. The developer docs describe the same step as creating robots.txt.liquid in the Templates folder2.
Replace the contents with your generated file and save. Changes are instant.
Open your-store.com/robots.txt, paste it into the checker as live output, and make sure every directive is on its own line.
Test the URLs that matter with the path tester, then with Search Console's URL Inspection tool. Search Console's robots.txt report shows the file Google fetched and lets you request a recrawl12. Google caches robots.txt for up to 24 hours7.
FAQ
Can I edit robots.txt on Shopify?
Yes, through the robots.txt.liquid theme template. Shopify Support won't help with edits, so keep Shopify's loop, change as little as possible, and test before you publish4.
Why can't I find robots.txt.liquid in my theme?
It isn't included in themes by default. Until you add it, Shopify serves its managed robots.txt2.
Why does my robots.txt still block /search and /policies/ when other stores' don't?
Your theme almost certainly has a robots.txt.liquid. On 16 September 2026, stores with a template printed Shopify's older default rules through the loop, and stores without one got the newer managed file. Delete the template if it adds nothing you need, or use the generator's "match Shopify's managed file" option.
Should I block /search?
On most stores, no. Shopify's search result pages send X-Robots-Tag: noindex, nofollow, and Google can only read that if the page isn't blocked8. The managed file leaves /search crawlable. A very large store worried about crawl budget can keep the block, which is what Google's crawl-budget guide suggests for sites of that size9.
Will blocking GPTBot take my store out of ChatGPT?
No. GPTBot is OpenAI's training crawler. ChatGPT search uses OAI-SearchBot, and OpenAI says each setting is independent; blocking OAI-SearchBot is what removes you, and changes take about 24 hours13.
Does blocking Google-Extended remove me from AI Overviews?
No. Google-Extended covers Gemini training and grounding, not Search10. AI Overviews follow Googlebot, and Google points to nosnippet, data-nosnippet, max-snippet or noindex to limit what they show11.
Can I noindex pages with robots.txt?
No. Google doesn't support noindex in robots.txt, and a Disallow stops Google from seeing a noindex tag on the page8.
Does this tool send my file anywhere?
No. The generator, checker and tester run in your browser. Nothing is uploaded or stored.