Shopify

Shopify

Make a Shopify store agent-ready: robots.txt.liquid, product feeds, and AI bot rules.

Shopify is the friendliest platform AIScan grades — most of the work is already done by the platform itself. On a Shopify scan, Commerce gets a 1.2× weight and Content drops to 0.6× (Shopify limits how much HTML you can rewrite, so the scanner doesn't punish you for it).

robots.txt.liquid

Shopify themes can override robots.txt via a template at templates/robots.txt.liquid. To add AI bot rules:

{% for group in robots.default_groups %}
{{- group.user_agent -}}
{% for rule in group.rules -%}
{{ rule }}
{% endfor -%}
{% if group.sitemap != blank %}
{{ group.sitemap }}
{% endif %}
{% endfor %}

User-agent: GPTBot
Allow: /

User-agent: ClaudeBot
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: Google-Extended
Allow: /

Sitemap

Shopify auto-generates /sitemap.xml. Nothing to do — the D2 check should already pass.

Product feed

Shopify exposes a JSON product feed at /products.json by default. Reference it from aLink header or your api-catalog to make it discoverable. If you maintain a Google Merchant Center feed, link that too — many shopping agents read MC-flavoured XML.

Structured product data

Most modern Shopify themes (Dawn and the OS 2.0 family) emit schema.org/Product JSON-LD on product pages. If yours doesn't, add this in sections/product.liquid:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": {{ product.title | json }},
  "image": {{ product.featured_image | image_url: width: 1200 | json }},
  "description": {{ product.description | strip_html | json }},
  "sku": {{ product.selected_or_first_available_variant.sku | json }},
  "offers": {
    "@type": "Offer",
    "price": "{{ product.price | money_without_currency }}",
    "priceCurrency": {{ cart.currency.iso_code | json }},
    "availability": "{% if product.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}"
  }
}
</script>

llms.txt

Shopify doesn't let you serve arbitrary root-level files directly. Two workarounds:

  • Add a redirect from /llms.txt to a published page with the markdown body, served as plain text.
  • Use a Shopify app that ships an llms.txt proxy (a few have appeared in the App Store).