Creating llms.txt on Shopify: The Limitation, Workarounds, App Solutions, and Templates
The llms.txt standard is the robots.txt of the AI era — a structured, machine-readable file at your domain's root that tells AI systems what your store is, what you sell, and where to find your most important content. Proposed by Jeremy Howard (co-founder of Answer.AI) in September 2024, it has grown from a niche proposal to a standard adopted by over 844,000 websites. AI agents visit llms-full.txt files over twice as frequently as the base llms.txt, and server log analysis shows that AI crawlers actively look for and consume these files when they exist.
For Shopify merchants, there is a fundamental problem: Shopify does not let you upload files to your root directory. You cannot simply place a file at yourstore.com/llms.txt the way you would on WordPress, a custom-built site, or any platform where you control the server. This single platform limitation has spawned an entire ecosystem of workarounds, apps, and proxy solutions.
This guide covers the limitation in detail, every viable workaround, the best app solutions, and a complete template for your llms.txt content.
The Shopify Limitation: Why This Is Hard
The Technical Problem
Shopify is a hosted platform. You do not have filesystem access. The server that responds to requests for yourstore.com/* is Shopify's server, and it only serves responses for routes it knows about: products, collections, pages, blogs, cart, account, and a handful of system files like robots.txt and sitemap.xml.
When an AI crawler requests yourstore.com/llms.txt, Shopify returns a 404 because there is no route registered for that path. You cannot create a Shopify Page at /llms.txt because Shopify Page URLs follow the pattern /pages/page-handle. You cannot upload a file to the root because there is no mechanism to do so.
This is a problem Shopify has not solved natively. Unlike robots.txt (which Shopify generates from a Liquid template) and sitemap.xml (which Shopify generates automatically), there is no built-in llms.txt support.
What Redirect-Based Solutions Get Wrong
Some guides suggest creating a Shopify Page at /pages/llms-txt and setting up a URL redirect from /llms.txt to /pages/llms-txt. This technically works for browsers but has three problems:
- Redirect headers. The response is a 301 or 302, not a 200. Some AI crawlers follow redirects; others do not. You are gambling on crawler behavior.
- Content-Type. The llms.txt specification expects
text/plainortext/markdown. A Shopify Page servestext/htmlwith a full HTML wrapper — navigation, footer, CSS, JavaScript. The llms.txt content is buried inside an HTML page, which is the opposite of what the standard intends. - Page template overhead. The AI crawler receives your entire theme template surrounding the llms.txt content. This wastes the crawler's token budget and may cause it to misinterpret the content.
Redirects are a fallback, not a solution.
Proxy Approaches: Serving llms.txt at the Root
Cloudflare Workers (Recommended for Technical Teams)
If your domain routes through Cloudflare (which it should for performance and security reasons regardless), Cloudflare Workers provide the cleanest solution. A Worker intercepts requests to /llms.txt before they reach Shopify's servers and returns your custom content with the correct headers.
Step 1: Set up Cloudflare for your domain
If you are not already using Cloudflare, add your domain, create proxied CNAME records for both the apex domain and www, and ensure traffic routes through Cloudflare's edge network.
Step 2: Create a Worker
In the Cloudflare dashboard, go to Workers & Pages > Create Worker. Use this code:
export default {
async fetch(request) {
const url = new URL(request.url);
// Serve llms.txt
if (url.pathname === '/llms.txt') {
return new Response(LLMS_TXT, {
headers: {
'Content-Type': 'text/plain; charset=utf-8',
'Cache-Control': 'public, max-age=86400',
},
});
}
// Serve llms-full.txt if you have one
if (url.pathname === '/llms-full.txt') {
return new Response(LLMS_FULL_TXT, {
headers: {
'Content-Type': 'text/plain; charset=utf-8',
'Cache-Control': 'public, max-age=86400',
},
});
}
// Pass everything else through to Shopify
return fetch(request);
},
};
const LLMS_TXT = `# Your Store Name
> Brief description of your store, what you sell, and your unique value proposition.
## Products
- [Collection Name](https://yourstore.com/collections/handle): Description of this collection
- [Collection Name](https://yourstore.com/collections/handle): Description of this collection
## Guides
- [Buying Guide](https://yourstore.com/blogs/guides/article-handle): Description
- [Comparison Guide](https://yourstore.com/blogs/guides/article-handle): Description
## About
- [About Us](https://yourstore.com/pages/about): Brand story and mission
- [Contact](https://yourstore.com/pages/contact): Customer service information
`;
const LLMS_FULL_TXT = `# Your Store Name — Complete Guide
> Full description of your store...
(Your comprehensive content here)
`;
Step 3: Create a route
In Cloudflare, create a Worker Route that matches yourstore.com/llms.txt and yourstore.com/llms-full.txt, pointing to your Worker.
This approach serves your llms.txt with a clean 200 response, correct text/plain content type, proper caching headers, and zero Shopify template overhead. The response is pure text — exactly what the specification requires.
Vercel Edge Functions
If you use Vercel for other services (or run a headless Shopify frontend on Vercel), Edge Functions provide the same capability:
export const config = { matcher: '/llms.txt' };
export default function handler() {
return new Response(llmsTxtContent, {
headers: { 'Content-Type': 'text/plain; charset=utf-8' },
});
}
Nginx or Reverse Proxy
If your domain routes through a reverse proxy (Nginx, HAProxy, Caddy), you can intercept the /llms.txt request and serve a static file directly:
location = /llms.txt {
alias /var/www/static/llms.txt;
default_type text/plain;
}
App Solutions: No Code Required
For merchants who do not want to set up Cloudflare Workers or manage proxy configurations, several Shopify apps solve this problem entirely within the Shopify admin.
How Shopify Apps Serve llms.txt
Shopify apps can create App Proxy routes — custom URL paths that are handled by the app's server rather than Shopify's. When an AI crawler requests yourstore.com/llms.txt, the app proxy intercepts the request and returns the llms.txt content from the app's server with the correct headers.
This is the cleanest app-based solution because it avoids redirects and serves the file with proper content types.
Arc: llms.txt
Arc auto-generates your llms.txt content from your product catalog, collections, and pages. Key features:
- Automatic content generation from your Shopify data
- Regular recrawling to keep content current
- Customization options for which products and collections to include
- Serves the file at the root URL via App Proxy
LLMs.txt Generator
Similar core functionality with more manual control:
- Template-based content generation
- Manual editing of the generated output
- Custom section support
- Configurable update frequency
LLMs.txt Optimizer
Goes beyond basic generation:
- AI-powered content optimization for the llms.txt file itself
- Analysis of your catalog to determine what to prioritize
- Competitive benchmarking against other stores' llms.txt files
Choosing Between Apps
All three solve the core problem. Differentiate on:
- Update frequency: How often does the app regenerate your content? Daily updates are ideal for stores with frequently changing catalogs.
- Customization level: Can you manually edit the output? Add custom sections? Control the order of content?
- Content quality: Does the app generate a thoughtful, curated summary or a mechanical catalog dump? AI systems respond better to curated content.
Template: What Your llms.txt Should Contain
Whether you use a proxy, an app, or a manual approach, the content of your llms.txt matters. A poorly structured file is barely better than no file at all.
The Specification Format
An llms.txt file follows this structure:
- H1 heading (required): Your store name
- Blockquote (recommended): A brief summary of your store
- Paragraphs (optional): Additional context about your store
- H2 sections: Curated lists of links organized by topic
- Links: Each following the pattern
[Name](URL): description - "Optional" section: Secondary content that can be skipped when context windows are limited
Complete Template for a Shopify Store
# [Your Store Name]
> [One-sentence description of what you sell and who you serve. Example: "Premium outdoor gear for hikers, climbers, and trail runners who value performance and sustainability."]
[Your store name] has been [brief history/positioning]. We specialize in [product categories] with a focus on [differentiators — quality, sustainability, price, expertise, etc.].
## Featured Collections
- [Best Sellers](https://yourstore.com/collections/best-sellers): Our most popular products based on sales and customer reviews
- [New Arrivals](https://yourstore.com/collections/new-arrivals): Products added in the last 30 days
- [Category 1](https://yourstore.com/collections/category-1): Description of this category and who it serves
- [Category 2](https://yourstore.com/collections/category-2): Description of this category and who it serves
- [Category 3](https://yourstore.com/collections/category-3): Description of this category and who it serves
## Buying Guides
- [How to Choose [Product Category]](https://yourstore.com/blogs/guides/article): Comprehensive guide covering selection criteria, price ranges, and recommendations
- [Product X vs Product Y](https://yourstore.com/blogs/guides/article): Detailed comparison with honest pros and cons
- [Beginner's Guide to [Topic]](https://yourstore.com/blogs/guides/article): Entry-level guide for new buyers
## About
- [About Us](https://yourstore.com/pages/about): Our story, mission, and what makes us different
- [Contact](https://yourstore.com/pages/contact): Customer service hours, email, phone, and live chat
- [Shipping & Returns](https://yourstore.com/pages/shipping-returns): Shipping times, costs, and return policy
- [FAQ](https://yourstore.com/pages/faq): Answers to common customer questions
## Optional
- [Category 4](https://yourstore.com/collections/category-4): Secondary category
- [Category 5](https://yourstore.com/collections/category-5): Secondary category
- [Blog](https://yourstore.com/blogs/news): Latest articles and updates
Template Guidelines
Keep it under 2,000 tokens. AI systems truncate longer files. Prioritize your most important content.
Lead with your best content. Put your highest-traffic collections and most authoritative content first. AI systems may not process the entire file.
Write descriptions that answer questions. Not "Shop our shoes" but "Running shoes for road and trail, tested and reviewed by competitive runners, ranging from $80 to $200." The description should tell an AI system why this link is relevant.
Update regularly. A stale llms.txt with discontinued products or broken links is worse than no llms.txt. Set a monthly calendar reminder to review and update the content, or use an app that auto-updates.
Include your differentiators. What makes your store different from every other store selling similar products? Sustainability certifications? Expert curation? Exclusive brands? Price guarantees? This differentiation context helps AI systems decide when to recommend you over competitors.
Testing Your llms.txt
Verify It Is Accessible
After implementation, verify your file is live:
curl -I https://yourstore.com/llms.txt
You should see a 200 OK status and a Content-Type: text/plain header. If you see a 301 redirect or text/html content type, your implementation needs adjustment.
Verify the Content
curl https://yourstore.com/llms.txt
Verify the output is clean markdown with no HTML tags, no JavaScript, no CSS, and no navigation elements. It should be pure text that a human can read and an AI can parse.
Test With AI Systems
Ask ChatGPT or Perplexity about your store by name. While you cannot directly confirm they are reading your llms.txt, you can check whether the information in their response aligns with what your llms.txt describes. If the AI accurately describes your product categories and store positioning, the file is likely being consumed.
Monitor Access Logs
If you are using a Cloudflare Worker, check the Worker's analytics to see how often the endpoint is hit. If you are using an app, check the app's dashboard for access statistics. Knowing which AI crawlers access your llms.txt and how often helps you understand which platforms are actively indexing your store.
The Bottom Line
For Shopify merchants, llms.txt requires a workaround — there is no getting around that. But the workarounds are well-established and reliable. A Cloudflare Worker takes 15 minutes to set up. A Shopify app takes 5 minutes. The content itself takes an hour to write well.
The return is a structured, AI-readable summary of your store that helps ChatGPT, Perplexity, Claude, and other AI systems understand what you sell, who you serve, and where to find your best content. In a world where AI traffic is growing at 1,079% annually for the stores where it appears, that 15 minutes of setup is one of the highest-ROI investments you can make.