← Insights

Shopify llms.txt: what your store already serves, and what to put in yours

Every Shopify store has served one since May 2026, and it says nothing about what you sell. What it is and is not, how to write yours, and a five-minute check.

12 min read

Contents — 7 sections

Your store is already serving one

Fetch yourstore.com/llms.txt. Unless the store is headless, you will get a 200, a content-type of text/markdown, and about four and a half kilobytes of Markdown that opens # Agent Instructions — Your Store Name. You did not write it.

Shopify's developer changelog for 28 May 2026 is the announcement: every store includes a default agents.md at /agents.md, and /llms.txt and /llms-full.txt "point to this content by default". The file says the same about itself, near the bottom: the canonical description of the store is /agents.md, and the copy at /llms.txt "mirrors that content".

What the managed file contains is a description of how software should transact with a Shopify store, not a description of what you sell. Read top to bottom it is: an instruction to personal shopping agents to install Shopify's Shop skill rather than scrape the storefront; the store's Universal Commerce Protocol discovery and MCP endpoints, with a six-step flow from catalogue search to buyer-approved payment; the read-only URLs — /collections/all, the .json twin of every product and collection, the search endpoint, the sitemap; links to the three policy pages; and a closing section about Shopify. Your store's name appears in the heading and the first sentence. Your products, your collections and your delivery terms appear nowhere. It is the same document on every store with the name dropped in — dropped in as a possessive, so a store whose name ends in an s reads as "s's" in its own opening line.

Seven Shopify storefronts checked on 17 September 2026: all seven returned a 200 at /llms.txt. Six served the managed file. One served a file of its own, a categorised list of its collections, which is what the second half of this post is about. Three of the six managed files were on stores still serving the older robots.txt default, so this is not the rollout described in what your Shopify robots.txt tells the AI crawlers. A store can have the old robots file and the new agent files at the same time.

Two lines tell you which you have:

curl -sIL yourstore.com/llms.txt | grep -i 'content-type\|pageType'
curl -sL yourstore.com/llms.txt | head -3

The managed file answers text/markdown, carries pageType;desc="llms_txt" inside its server-timing header, and its third line begins "This document describes how AI agents can interact with". A file that opens with a blockquote under the heading is one that somebody wrote.

What the file is: a reading list for a machine, in Markdown

The proposal lives at llmstxt.org, published by Jeremy Howard in September 2024 and revised to a second version in August 2026. The idea is narrow and is worth stating narrowly. An HTML page wraps its facts in navigation, scripts and layout, and an agent that lands on it has to strip all of that away before it can use any of it. A /llms.txt is a short Markdown document at the root that tells the agent what the site is and where the clean versions of the important pages live, so it fetches those instead of crawling.

The format is fixed, in this order, and only the first item is required:

  • An H1 with the name of the site.
  • A blockquote with a short summary: the facts needed to understand everything below it.
  • Any number of paragraphs or lists with more detail, but no further headings.
  • Any number of H2 sections, each holding a list of links in the form - [name](url): optional note.

An H2 named Optional holds, by convention, the links an agent can skip when it is short on context. The file is meant to fit in a context window whole; the detail lives behind the links, and the spec expects those links to point at content a model can read directly — Markdown, not HTML pages. It also proposes that each page serve a Markdown twin at its own URL with .md appended, and — new in the second version — that pages declare the file covering them with a <link rel="describedby"> element pointing at the file, or the equivalent HTTP Link header.

Hold Shopify's managed file against that and it is not an llms.txt in the spec's sense. There is no blockquote. The H2 sections are instructions and endpoint lists rather than link lists. It is an agents.md, a document for a transacting agent, served under a second name so that anything requesting the llms.txt path gets something rather than nothing. Shopify's documentation for the template says so: the two paths are alternate URLs for /agents.md, "so agents and crawlers that request it still find a usable, agent-facing description of the store". The spec does not define llms-full.txt at all; enough tools request it that Shopify answers it with the same document.

What it is not: a crawl control, a ranking signal, or proof that anyone read it

Three things get attached to this file that do not belong to it.

It does not control access. The spec draws the line itself: robots.txt "lets automated tools know what access to a site is considered acceptable", and llms.txt information "is instead used on demand, when an agent needs information about a topic while assisting a user". Nothing in /llms.txt lets a crawler in or keeps one out. If your question is which AI crawlers can read your store, it is answered in full in the robots.txt post above.

No engine documents reading it. OpenAI's page on its crawlers mentions llms.txt once, to say that OpenAI's own developer documentation has one. Anthropic's article on its crawlers does not mention the file. Google's list of its crawlers does not mention it. All three describe robots.txt at length. Google Search Central's guidance on AI Overviews and AI Mode goes further than silence: "You don't need to create new machine readable files, AI text files, or markup to appear in these features." That is the sentence to have ready when someone tells you this file is why a competitor is being named.

Chrome is the one place at Google that does check for it, and it is worth being exact about what that means. Lighthouse has an experimental Agentic Browsing category, Chrome 150 or later, with no weighted score — only a pass ratio across a handful of checks — and one of the checks is whether "a machine-readable summary" exists at the domain root. The audit's documentation says a 404 is marked not applicable "as providing the file is optional at the moment", and its source is short enough to read in a minute: a fetch error or a 5xx fails; a file that is served must contain an H1, at least one Markdown link, and more than fifty characters. Shopify's managed file passes all three. Shopify's own documentation example for a custom llms.txt.liquid — a heading, a blockquote and three bare URLs — would fail the link check, because a bare URL is not a Markdown link. A Lighthouse audit is a Lighthouse audit. It is not a Search ranking input, and the Search documentation says so in the sentence above.

It is not evidence. OpenAI and Anthropic each publish an llms.txt for their own developer documentation, at platform.openai.com/docs/llms.txt and docs.claude.com/llms.txt, and coding agents read those to find API references. That is the use the file was designed for and the use it demonstrably has. A shopping assistant deciding which merino base layer to name is doing a different job, and the honest position is that nobody outside those companies knows how often, if ever, it opens a store's /llms.txt on the way. Unless something you control sits in front of the store and keeps request logs, you have no record of whether an agent has ever asked for the file — and neither has anyone selling you a tool that writes one.

None of that makes the file worthless. It makes it cheap, optional and unmeasured, which is a reason to spend an hour on it and not a quarter.

How to serve your own on Shopify

Shopify resolves the three URLs through the theme, in a fixed order per path. From the agents.md.liquid documentation:

URLTemplate lookup order
/agents.mdagents.md.liquid → Shopify-generated default
/llms.txtllms.txt.liquid → agents.md.liquid → Shopify-generated default
/llms-full.txtllms-full.txt.liquid → agents.md.liquid → Shopify-generated default

None of the three templates ships in any theme. You create the one you want: Online Store → Themes, the theme, … → Edit code, right-click the Templates folder, New File, name it llms.txt.liquid. It cannot be a JSON template.

Add llms.txt.liquid and nothing else. The managed agents.md is the file Shopify's newer robots.txt default points agents at, and Shopify keeps it current as the protocol versions change; an agents.md.liquid in your theme replaces it, and unless you override the other two paths as well, replaces them too. A dedicated llms.txt.liquid changes /llms.txt only and leaves the other two on the managed content.

Three properties of this template decide what you can put in it.

The Liquid context is restricted. Only two objects exist inside it: request, and an agents object with seven auto-populated fields — store_name, store_url, ucp_discovery_url, mcp_endpoint_url, ucp_versions, currency and sitemap_url. The global objects every other template has are not injected. shop, collections, pages, blogs and linklists all render blank. So there is no loop over your collections; every collection, policy and guide in the file is typed in by hand, and when a collection is renamed or retired the file goes stale without a warning anywhere.

It is served at the bare primary domain. No locale, no Shopify Markets subfolder, and no localised counterpart, so a store selling in French from /fr/ and in English from the root has one file. Write it in the language of the primary market and say which markets you ship to in the summary.

It is broadly cached and served to every agent that asks. Shopify's documentation tells you not to output contact details in it for that reason, and the managed file deliberately omits them.

Then the two habits that apply to every root-level theme template, and that catch real stores on robots.txt.liquid today. It is per theme, so a duplicated theme published without the file drops it. And it follows deploys, so a developer publishing from a branch that predates it removes it, weeks later, without a symptom anyone connects to a theme push.

What to put in it

A store's file has one job: give an agent the facts a product page hides in atmosphere, and a short map of where the rest lives. This is the shape we use, for a made-up base-layer store, with the agents object doing the work it can. The first line is the H1, # {{ agents.store_name }}, and the rest follows:

> Merino base layers and socks for cold-weather running. Ships to the EU,
> Switzerland and the UAE from one warehouse. Prices in {{ agents.currency }};
> returns accepted within thirty days of delivery.

Sizing follows European body measurements; the size guide below lists them.

## Collections

- [Base layers]({{ agents.store_url }}/collections/base-layers): long- and short-sleeve tops in three weights
- [Socks]({{ agents.store_url }}/collections/socks): ankle and crew, one weight
- [Archive]({{ agents.store_url }}/collections/archive): last season's colours, same products

## Product data

- [All products]({{ agents.store_url }}/collections/all): every live product
- [Products as JSON]({{ agents.store_url }}/collections/all/products.json): live price and stock, no HTML

## Policies

- [Shipping]({{ agents.store_url }}/policies/shipping-policy): rates, carriers and delivery estimates by country
- [Returns]({{ agents.store_url }}/policies/refund-policy): the window, the condition, who pays the label
- [Privacy]({{ agents.store_url }}/policies/privacy-policy)
- [Terms]({{ agents.store_url }}/policies/terms-of-service)

## Guides

- [Size guide]({{ agents.store_url }}/pages/size-guide): body measurements per size
- [Care]({{ agents.store_url }}/pages/care): washing and drying merino

## Optional

- [About]({{ agents.store_url }}/pages/about)
- [Agent instructions]({{ agents.store_url }}/agents.md): commerce endpoints; discovery at {{ agents.ucp_discovery_url }}

What the shape is doing, line by line:

  • The blockquote carries the extractable facts. What it is, who it is for, where it ships, what currency, what the return window is. These are the same facts how to get your store recommended by ChatGPT asks you to put in the first hundred words of a product page, and they belong here for the same reason: an agent should be able to answer a buyer's question by quoting one line.
  • Collections are a curated map, not a sitemap. Five to ten, with a note each. The spec is explicit that a sitemap is not a substitute for this file, and the reverse holds: a file that lists every collection is a sitemap with worse formatting.
  • Anything that changes is a link, never a value. Price and stock live in the JSON endpoints Shopify's managed file already lists under read-only browsing. A price typed into this file is wrong within a month and cached for longer.
  • Every URL is absolute, built from agents.store_url. The file is read out of context, on a machine that may never have loaded your homepage.
  • Every entry is a Markdown link. That is what the spec asks for, what Lighthouse tests for, and what Shopify's own example forgets.
  • Nothing private, nothing that expires. No email, no phone, no discount, no launch date.

Keep it under a few kilobytes. The managed file is about four and a half, and the whole point is a document that fits in context beside the question being asked. If you also want pages to announce it, the spec's <link rel="describedby" href="{{ shop.url }}/llms.txt"> goes in the <head> of theme.liquid; it is optional, and nothing yet is documented as reading it.

Check it in five minutes

Six checks, in order, none needing a tool beyond a terminal and a browser.

  1. Fetch the live file, not the template. curl -sL yourstore.com/llms.txt | head -3. Line one is your H1. If line three still begins "This document describes how AI agents", the managed file is being served: the template is not in the published theme, or is misnamed.
  2. Count the links. curl -sL yourstore.com/llms.txt | grep -c '](http'. Zero means Lighthouse will fail it and an agent has nowhere to go.
  3. Read the blockquote as a stranger. Could someone answer "what does this store sell, to whom, shipped where" from those three lines alone? If not, the file has links and no facts.
  4. Run Lighthouse. Chrome 150 or later, the Agentic Browsing category. The llms.txt audit passes, or names which of the three requirements is missing.
  5. Run the spec's own test. Paste the file into an assistant, tell it this is the only context it has, and ask the three buyer questions from the AI-visibility post. Where it cannot answer, the file is missing a fact, not a link.
  6. Fetch it again after every theme publish. Two seconds, and the check that actually catches the failure.

What to fix first, and how long it takes

If you have never looked, ten minutes: confirm the managed file is there, then open /robots.txt and confirm the crawlers are still allowed in, because a reading list is worthless to an agent that has been turned away at the door.

Then the order that pays, which this file does not change. Crawler access first. Product schema second, so that one Product node carries the price and availability an agent will trust — the theme's part of that is in Shopify product schema: what your theme emits. The first hundred words of the top ten product pages third, which is the copy task that actually moves whether you get named.

The llms.txt comes fourth. An hour to write, using the shape above and your own collections; a note to re-read it each quarter; one line in the post-deploy checklist. It costs nothing to serve and there is nothing to buy for it.

If you would rather have the whole AI-visibility section read for you — the live robots file, the schema, the first hundred words, and now this file — that is section five of the Store Teardown, €750, and this file is one line of it.

Own your growth.Start with the teardown.

Start with a Teardown. Read it, then decide whether you want us to fix what it finds.