Answer Engine Optimisation (AEO) for Shopify is not a buzzword yet — most stores have never thought about it. We scanned five well-known Shopify brands through our live AEO engine on June 14, 2026. Every single one scores below 60/100. Every single one scores zero on answer-readiness — the sub-score that decides whether ChatGPT will quote you. Here is a concrete, honest guide to fixing that.
Before telling you what to fix, it is worth establishing what the baseline actually looks like. These are not tiny stores. They have large marketing budgets. They still fail on AI-visibility.
Scores were produced by running our AEO engine live against each store's public surface on 2026-06-14. No scores were fabricated. Raw engine JSON is cited in our brand teardown post.
| Store | Score | Grade | Answer-readiness | Schema coverage |
|---|---|---|---|---|
| allbirds.com | 47 | D | 0 / 100 | 0 / 100 |
| gymshark.com | 55 | C | 0 / 100 | 0 / 100 |
| mejuri.com | 10 | F | 30 / 100 | 0 / 100 |
| brooklinen.com | 31 | F | 0 / 100 | 0 / 100 |
| deathwishcoffee.com | 56 | C | 0 / 100 | 17 / 100 |
Death Wish Coffee is the highest scorer at 56 and they have only two JSON-LD types live: Organization and WebSite. No Product. No Offer. No FAQPage. Gymshark's discoverability is perfect (100/100 — they have llms.txt, agents.md, agentic sitemap, and an AI-friendly robots.txt) but their schema coverage is zero, so ChatGPT has nothing structured to quote.
When a shopper asks ChatGPT "what are the best running shoes under $150", ChatGPT does not search the web in real time (unless browsing is enabled). It draws on training data and, when browsing is enabled, it fetches pages that are structurally easy to parse. Both pathways reward the same five things:
llms.txt) that tells AI crawlers what your store sells and where to look/products.json) with rich descriptions, real variant names, and image alt textOur engine scores each of these as a sub-dimension. Here is how Gymshark's 55/C score breaks down — they are strong on the infrastructure levers but have done nothing on the content and schema levers:
They could reach ~88/A by fixing three things (Product JSON-LD, FAQPage schema, and answer content). None of those require a developer — they are content and markup changes.
Shopify auto-generates a minimal /llms.txt for most stores — usually just a product count. The enriched version is what actually moves the needle: your brand story in 2–3 sentences, your top product categories described in plain language, a table mapping target queries to key URLs, and (if you sell in multiple countries) per-market currency and language declarations.
Check what yours looks like by visiting yourdomain.com/llms.txt in a browser right now. If it is less than 30 lines, it needs work. The llms.txt file is not a ranking signal in the traditional sense — it is an instruction document for AI crawlers that tells them what to index and how to describe you to their users.
Mejuri's problem in one number: they serve 20 locale variants (en-us, en-ca, fr-ca, en-au, en-gb, de-de and more) but their llms.txt declares zero per-market currency or language context. Our engine flags this as a +60 pt opportunity. AI assistants citing Mejuri for a Canadian shopper may quote the wrong currency.
Schema markup is the single highest-impact lever for AI search visibility. Without it, AI engines are guessing at your product's name, price, and stock status from raw HTML. With it, they can cite you precisely.
The most valuable types for Shopify stores, in priority order:
Product — name, description, image, SKU or GTINOffer — price, priceCurrency, availability (InStock / OutOfStock), urlAggregateRating — ratingValue and reviewCount (requires you to have reviews)FAQPage — your Q&A content marked up as machine-readable pairsOrganization — brand name, URL, sameAs (social profiles)BreadcrumbList — helps AI engines understand your site structureHere is a minimal Product + Offer block you can add to a Shopify product page theme file. Replace the Liquid variables with your own:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "{{ product.title | escape }}",
"description": "{{ product.description | strip_html | escape | truncatewords: 100 }}",
"image": "{{ product.featured_image | img_url: 'grande' }}",
"sku": "{{ product.selected_or_first_available_variant.sku }}",
"brand": {
"@type": "Brand",
"name": "{{ shop.name | escape }}"
},
"offers": {
"@type": "Offer",
"url": "{{ canonical_url }}",
"priceCurrency": "{{ cart.currency.iso_code }}",
"price": "{{ product.selected_or_first_available_variant.price | money_without_currency | remove: ',' }}",
"availability": "{% if product.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}"
}
}
</script>
Add this inside the <head> of your product.liquid (or product.json template in Dawn/OS 2.0). Validate with Google's Rich Results Test before pushing to production.
This is the lever every brand in our scan misses completely — including the C-grades. AI answer engines quote prose, not product pages. When someone asks "what are the best sustainable running shoes", ChatGPT does not show a product card — it writes a paragraph citing a page that answered that question directly.
The formula: one question per H2 or H3 heading, direct answer in the first sentence of that section, FAQPage JSON-LD wrapping the whole block. Topics that work well for Shopify stores:
Here is the FAQPage JSON-LD wrapper structure. Add this alongside the content on any page that has Q&A sections:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How long do your running shoes last?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Our running shoes are designed to last 400–600 miles of active use. Rotation with a second pair extends lifespan significantly. The midsole typically shows wear before the outsole, so replace when cushioning feels flat rather than waiting for visible sole wear."
}
},
{
"@type": "Question",
"name": "Are your shoes machine washable?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Machine wash on cold, gentle cycle, inside a mesh laundry bag. Air dry only — heat damages the foam. Do not put them in a dryer."
}
}
]
}
</script>
The visible H2/H3 question headings and the JSON-LD must match. Cloaking (different content in schema vs. what users see) will get you penalised by Google and is not how you earn AI trust either.
AI shopping agents (including the ones embedded in ChatGPT with browsing or plugins) parse /products.json to understand your catalog. If your feed is locked, broken, or thin, you are invisible to those agents.
Mejuri's feed problem: /products.json returns HTTP 404. They blocked the public catalog API, likely for competitive reasons. But the unintended consequence is that AI shopping agents cannot read their catalog at all. Our engine assigns them a feed score of 0 as a result.
Four feed quality checks to run right now:
yourdomain.com/products.json?limit=5 in an incognito browser. If you get a 404 or empty result, your feed is blocked.ChatGPT's training data is dominated by publisher content — articles, review sites, comparison pages, listicles. When a shopper asks "best sustainable sneakers", ChatGPT quotes from the pages that ranked for that topic, not from the brand's own store.
This means your on-site AEO work (levers 1–4) gets you ready to be cited when browsing is enabled or when your store is in training data. But to win against established brands in generative answers, you also need coverage in the external sources AI engines trust.
Practical actions:
Allbirds scores 90/100 on discoverability overall (they have llms.txt, agents.md, and an agentic sitemap) but their robots.txt blocks AI crawlers. Our engine flags this as a discoverability penalty. If your robots.txt does not explicitly allow major AI crawlers — GPTBot, ClaudeBot, PerplexityBot, Google-Extended — you are blocking your own AI indexing.
Check your robots.txt at yourdomain.com/robots.txt. Look for any Disallow: / rules under AI crawler user-agent strings. The correct default is to allow all crawlers unless you have a specific reason not to.
Disallow rules to robots.txt. If you have recently installed a security app, re-check your robots.txt to confirm it has not blocked AI crawlers you want to allow.
We built the same engine that produced the brand scores above into a free tool. Run your store through it at hatchloop.dev/tools/aeo-check/. It checks your store's public surface across the same five sub-dimensions — discoverability, feed completeness, schema coverage, answer-readiness, and multi-market hygiene — and returns a 0–100 score with your top gaps ranked by score impact.
It is a public-surface scan (the same view an AI crawler has). It does not require login. It takes under 60 seconds. Given that the best-scoring brand in our dataset is 56/C, there is a reasonable chance your store is in that range or below — and worth checking.
The same engine that scored Allbirds (47/D), Gymshark (55/C), and Mejuri (10/F) is available for your store. Enter your domain and get a 0–100 score with your top gaps ranked by impact. No login required.
Run free AEO scanTakes under 60 seconds — public-surface scan only, no store credentials needed