AEO for Magento 2: ChatGPT Visibility Audit Module and AI Engine Optimization Checklist

AEO for Magento 2: ChatGPT Visibility Audit Module and AI Engine Optimization Checklist

posted Originally published at angeo.dev 6 min read

AEO for Magento 2: ChatGPT Visibility Audit Module and AI Engine Optimization Checklist

Tags: #magento #aeo #chatgpt #ecommerce #php


Most Magento store owners focus on Google SEO. But in 2026, a growing share of purchase decisions starts in ChatGPT, Perplexity, or Gemini — not in a search bar. When someone asks ChatGPT "best wireless headphones under $100", your store either appears in the answer or it doesn't. And the reasons it doesn't have almost nothing to do with traditional SEO.

This post covers AEO (AI Engine Optimization) specifically for Magento 2 — what it is, the 9 technical signals that determine your store's AI visibility, and a free open-source audit module that checks all of them in one CLI command.


What is AEO and why Magento stores fail it by default

AEO is the practice of making your store's content accessible and understandable to AI engines — ChatGPT, Perplexity, Gemini, and similar platforms that answer purchase queries directly instead of showing a list of links.

The difference from SEO is fundamental. Google ranks your pages. AI engines decide whether to recommend your store at all. To make that recommendation, they need to:

  • Crawl your store (many Magento stores block AI crawlers in robots.txt)
  • Read structured product data (most Magento stores have incomplete Product schema)
  • Find a machine-readable catalog (most stores have no llms.txt or llms.jsonl)
  • Access a product feed (required specifically for ChatGPT Shopping results)

A default Magento 2 installation fails every single one of these. The good news: all of them are fixable in under two hours with the right modules.


The 9 AEO signals for Magento 2

Running bin/magento angeo:aeo:audit checks these 9 signals and returns a weighted score from 0–100%:

Signal #1 — robots.txt AI bot access (weight: 20%)

The most critical signal. Magento's default robots.txt typically contains Disallow: / for all bots, which blocks OAI-SearchBot (ChatGPT), PerplexityBot, Google-Extended (Gemini), and ClaudeBot.

Check your store right now:

curl https://yourstore.com/robots.txt | grep -E "OAI-SearchBot|PerplexityBot|Google-Extended"

No output means these bots are being blocked. Fix:

composer require angeo/module-robots-txt-aeo
bin/magento setup:upgrade && bin/magento cache:flush

Important distinction: GPTBot is OpenAI's training data crawler — blocking it opts your content out of model training but does NOT affect ChatGPT search or Shopping visibility. OAI-SearchBot is the live search crawler — that one must be allowed.

Signal #2 — llms.txt (weight: 18%)

llms.txt is an emerging standard (similar to robots.txt) that tells AI engines what your store is about, what products you sell, and which URLs are most important to crawl. Perplexity has specifically documented it as a crawl signal.

Check if yours exists:

curl -s -o /dev/null -w "%{http_code}" https://yourstore.com/llms.txt

404 means it doesn't exist. Fix:

composer require angeo/module-llms-txt
bin/magento setup:upgrade && bin/magento cache:flush

The module generates both llms.txt (human-readable summary) and llms.jsonl (machine-readable catalog with one JSON object per product line) via cron.

Signal #3 — Product JSON-LD schema (weight: 15%)

AI engines read your product data from <script type="application/ld+json"> blocks on product pages. Magento's default schema outputs a Product node but omits offers.availability — which is required for ChatGPT Shopping feed validation.

Check what your store outputs:

curl -s https://yourstore.com/sample-product.html | \
  python3 -c "
import sys, json, re
body = sys.stdin.read()
blocks = re.findall(r'<script[^>]+type=\"application/ld\+json\"[^>]*>(.*?)</script>', body, re.DOTALL)
for b in blocks:
    try:
        d = json.loads(b)
        nodes = [d] if isinstance(d, dict) else d
        for n in nodes:
            if n.get('@type') == 'Product':
                offers = n.get('offers', {})
                print('availability:', offers.get('availability', 'MISSING'))
    except: pass
"

If you see availability: MISSING or availability: InStock (wrong format — needs full URI), fix with:

composer require angeo/module-rich-data
bin/magento setup:upgrade && bin/magento cache:flush

The correct format is "availability": "https://schema.org/InStock" — the full URI. AI engines silently reject the short string format.

Signal #4 — AI product feed (weight: 20% combined with Signal #1)

ChatGPT Shopping product cards — the feature that shows prices, availability, and buy links in chat — requires a separate product feed submitted to OpenAI's merchant program. This is not the same as organic crawl visibility.

The feed format is ACP (Agentic Commerce Protocol) — a .jsonl.gz file with one product per line, regenerated every 15 minutes:

composer require angeo/module-openai-product-feed angeo/module-openai-product-feed-api
bin/magento setup:upgrade && bin/magento cache:flush

After installing, apply at chatgpt.com/merchants (currently US-only, waitlisted).

Signals #5–9 — sitemap, Open Graph, FAQPage schema, llms.jsonl, canonical

These are lower-weight signals but collectively add up:

  • sitemap.xml (7%) — must exist, have <loc> tags, and be referenced in robots.txt
  • Open Graph tags (10%) — og:title, og:image, og:description on product pages
  • FAQPage schema (5%) — on CMS pages with Q&A content
  • llms.jsonl (7%) — machine-readable product catalog for AI pipelines
  • Canonical tags (5%) — deduplication signal for AI crawlers

Running the audit

Install the audit module:

composer require angeo/module-aeo-audit
bin/magento setup:upgrade && bin/magento cache:flush

Run it:

bin/magento angeo:aeo:audit

Sample output for a typical store before any fixes:

  AEO Score: [████░░░░░░░░░░░░░░░░] 21% — Needs Improvement

  ✗ Fail  robots.txt — OAI-SearchBot          weight: 20%  → composer require angeo/module-robots-txt-aeo
  ✗ Fail  llms.txt — AI content map           weight: 18%  → composer require angeo/module-llms-txt
  ✗ Fail  Product schema — JSON-LD            weight: 15%  → composer require angeo/module-rich-data
  ✗ Fail  AI product feed                     weight: 20%  → composer require angeo/module-openai-product-feed
  ✓ Pass  sitemap.xml                         weight:  7%
  ⚠ Warn  Open Graph tags                     weight: 10%
  ✗ Fail  llms.jsonl — machine-readable       weight:  8%  → composer require angeo/module-llms-txt
  ✓ Pass  Canonical tags                      weight:  5%
  ⚠ Warn  FAQPage schema                      weight:  5%

After applying the fixes, the same store typically scores 78–87%.

The module also includes:

  • --format=json output for CI pipelines
  • --fail-on=80 to fail builds below a threshold
  • Admin UI under Marketing → Angeo AEO → Score Trend with historical chart
  • Weekly cron audit with score tracking

How each AI engine discovers your products

The three major AI platforms use fundamentally different discovery mechanisms:

Perplexity is entirely crawl-driven. Fix robots.txt, add llms.txt, fix Product schema — Perplexity re-indexes within 1–3 weeks. No merchant registration required.

ChatGPT runs on two tracks: organic crawl via OAI-SearchBot (for general query answers) and the ACP product feed (for Shopping product cards). Both are needed for full visibility.

Gemini primarily reads from Google Merchant Center. If you're already in GMC, Gemini has access almost immediately. The Google-Extended bot affects AI Overviews (non-shopping queries) but not GMC-sourced product results.

This means: Perplexity visibility is the fastest win (weeks), Gemini depends on GMC status, ChatGPT Shopping has the longest timeline (merchant approval) but the highest commercial intent.


Adobe Commerce Cloud — one extra step

On Adobe Commerce Cloud with Fastly CDN, every change to robots.txt or llms.txt requires a Fastly cache purge before AI crawlers see the new content. This is the most common reason fixes "don't work" on ACC:

php bin/magento fastly:purge:url https://yourstore.com/robots.txt
php bin/magento fastly:purge:url https://yourstore.com/llms.txt

Then verify with curl directly — not the admin config — before considering the fix complete.


The full checklist

Quick reference for the complete implementation:

# 1. Diagnostic — run first
composer require angeo/module-aeo-audit
bin/magento setup:upgrade && bin/magento cache:flush
bin/magento angeo:aeo:audit

# 2. Fix robots.txt
composer require angeo/module-robots-txt-aeo

# 3. Generate llms.txt + llms.jsonl
composer require angeo/module-llms-txt

# 4. Fix Product schema
composer require angeo/module-rich-data

# 5. AI product feed (ChatGPT Shopping)
composer require angeo/module-openai-product-feed angeo/module-openai-product-feed-api

# Apply all at once
bin/magento setup:upgrade && bin/magento cache:flush

# Verify
bin/magento angeo:aeo:audit
curl https://yourstore.com/robots.txt | grep OAI-SearchBot
curl https://yourstore.com/llms.txt | head -3

Packagist

All modules are MIT licensed, free, and available on Packagist:

Source: github.com/angeo-dev/module-aeo-audit

Full guide with deeper dives on each signal: angeo.dev/magento-2-aeo-guide


Originally published at angeo.dev

More Posts

The Audit Trail of Things: Using Hashgraph as a Digital Caliper for Provenance

Ken W. Algerverified - Apr 28

React Native Quote Audit - USA

kajolshah - Mar 2

Complete Magento SEO Post Migration Checklist for 2026

elsieraine_x - Feb 24

Optimizing the Clinical Interface: Data Management for Efficient Medical Outcomes

Huifer - Jan 26

I’m a Senior Dev and I’ve Forgotten How to Think Without a Prompt

Karol Modelskiverified - Mar 19
chevron_left

Related Jobs

View all jobs →

Commenters (This Week)

2 comments
1 comment

Contribute meaningful comments to climb the leaderboard and earn badges!