Three steps to make Shopify legible to every AI engine
A Liquid snippet ships Organization + Product schema. robots.txt.liquid and /llms.txt stay in sync with the AI-bot allowlist. End-to-end in about 18 minutes.
3-step setup
- 1
Generate an API key and register your store domain
Sign into AEO Pro → /dashboard/settings/api-keys → Generate new key. Then add both your shop's primary domain (my-shop.com) and the myshopify.com alias in Dashboard → Sites → Add Site so GoogleBot and GPTBot traffic both map back to your workspace.
- 2
Create snippets/aeo-pro.liquid and include it from theme.liquid
In Shopify admin → Online Store → Themes → Edit code, create aeo-pro.liquid under Snippets and paste the code below (swap in your aeopro_ key). Then include {%- render 'aeo-pro' -%} once in layout/theme.liquid, just before </head>.
Code sampleliquid · snippets/aeo-pro.liquid{%- comment -%} AEO Pro · Schema + llms.txt injector Drop in snippets/aeo-pro.liquid, then include once from theme.liquid: {%- render 'aeo-pro' -%} Replace the api_key constant with your aeopro_ key. {%- endcomment -%} {%- assign api_key = 'aeopro_xxxxxxxxxxxxxxxxxxxxxxxxxxxx' -%} {%- assign endpoint = 'https://www.aeo-pro.app/api/v1/schema/generate' -%} <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Organization", "name": "{{ shop.name | escape }}", "url": "{{ shop.url }}", "logo": "{{ shop.brand.logo | image_url: width: 512 | default: 'https://www.aeo-pro.app/icon' }}" } </script> {%- if template contains 'product' and product -%} <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 | truncate: 600 | json }}, "sku": {{ product.selected_or_first_available_variant.sku | json }}, "brand": { "@type": "Brand", "name": {{ shop.name | json }} }, "offers": { "@type": "Offer", "url": "{{ shop.url }}{{ product.url }}", "priceCurrency": {{ shop.currency | json }}, "price": {{ product.selected_or_first_available_variant.price | money_without_currency | json }}, "availability": "{% if product.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}" } } </script> {%- endif -%} <link rel="aeopro-citation-stream" href="https://www.aeo-pro.app/api/v1/citations/stream?shop={{ shop.permanent_domain }}" data-api-key="{{ api_key }}"> - 3
Ship the AI-bot allowlist via robots.txt.liquid + llms.txt redirect
OS 2.0 stores edit robots.txt via robots.txt.liquid. Copy the suggested block from AEO Pro Dashboard → Sites → your shop → robots tab. For llms.txt, add a 301 from /llms.txt to https://www.aeo-pro.app/llms/{shop-handle}.txt at your CDN or DNS host so we can refresh it without redeploys.
Code sampleliquid · layout/theme.liquid{%- comment -%} Add this once in layout/theme.liquid, just before </head>: {%- endcomment -%} {%- render 'aeo-pro' -%}
FAQ
- What about Hydrogen / Headless?
- Skip the Liquid snippet on Headless. Call /api/v1/schema/generate from your SSR layer and inject the resulting JSON-LD into <Head>. Same API key, same workspace, billed per shop.
- Does this violate Shopify App rules?
- No. The integration is a Liquid snippet plus an external REST call — no Shopify App API, no Customer Data. The native AEO Pro Shopify App is in review and lands Q3 2026.
- Does OS 1.0 (legacy themes) work?
- Yes, with two caveats: place the snippet under templates/ instead of sections/, and paste the robots.txt suggestions directly into the legacy robots.txt (OS 1.0 has no .liquid variant).
- Can I inject Product schema only on specific products?
- Yes — wrap the Product block with an if check, e.g. {% if product.metafields.aeo.enabled == true %}…{% endif %}. Use the Metafields editor to toggle per product.
Want to see how your store scores first?
30-second scan, three-dimensional score, top 5 fixable issues. No sign-up, no card.