Angeo AEO Audit

June 14, 2026 ยท View on GitHub

Packagist Version Packagist Downloads License PHP Magento

One CLI command that tells you exactly why ChatGPT, Gemini, Claude, and Perplexity aren't recommending your store โ€” and how to fix it.


Compatibility

ComponentVersion
Magento Open Source2.4.6, 2.4.7, 2.4.8
Adobe Commerce2.4.6, 2.4.7, 2.4.8
Adobe Commerce CloudAll current versions
PHP8.2, 8.3, 8.4
ThemesLuma, Hyvรค

Tested with: Magento Open Source 2.4.7-p3 + PHP 8.3 + Hyvรค 1.3.


What's new in v3.0.0

Major release โ€” see CHANGELOG.md for the breaking-change migration guide if you have custom checkers.

15 signals (up from 9), reflecting the actual AEO landscape of 2026: AI shopping integrations, merchant policies, agentic commerce, and structured-data quality.

6 new checkers:

  • merchant_policies โ€” MerchantReturnPolicy + OfferShippingDetails โ€” required by Google AI Mode and ChatGPT Shopping since Jan 2026
  • organization_schema โ€” brand entity in AI knowledge graphs
  • ucp_profile โ€” Universal Commerce Protocol (/.well-known/ucp), with built-in security check that detects leaked JWK private keys
  • jsonld_quality โ€” three-page schema breadth audit (homepage / category / product), WebSite+SearchAction, BreadcrumbList, ItemList
  • well_known โ€” discovery matrix for /.well-known/{ucp,ai-plugin.json,security.txt,mcp}
  • core_web_vitals โ€” LCP / INP / CLS via Google CrUX API (free, opt-in with API key)

Refactored architecture (this is the BC-break):

  • Shared Service\HttpCache โ€” eliminates duplicate fetches across checkers (hundreds of redundant HTTP requests on multi-store audits before, dozens now)
  • Service\StoreUrlSampler โ€” single source of truth for product / category / CMS URL sampling
  • New --category and --fail-on-severity CLI flags for CI workflows
  • Per-checker exception isolation โ€” slow or failing checkers no longer halt the audit run

Note on access-log monitoring: an ai_bot_traffic checker was prototyped during v3 development and excluded from the release after security review โ€” it encouraged broad read access on /var/log/nginx/, didn't work on Cloud/containerised hosting, and was dominated by false positives behind edge caches. AI-bot traffic is better measured at the edge (Fastly/Cloudflare Analytics) or via APM (New Relic, Datadog) than inside a PHP module. See CHANGELOG.md "Considered and rejected" for the full rationale. The live_signal category remains in CheckerInterface for third-party modules with secure live-signal sources โ€” notably angeo/module-aeo-brand-visibility.


What it checks โ€” 15 signals

#SignalCodeWeightCategoryWhat it validates
1robots.txt โ€” AI botsrobots_txt1.0technical12 AI bots, syntax errors, versioned UAs, conflicting rules
2llms.txt โ€” content mapllms_txt1.0technicalSpec compliance + store-locale + currency match + cross-host links
3llms.jsonl โ€” catalogllms_jsonl0.75technicalJSON Lines validity, required fields, eCommerce fields
4sitemap.xmlsitemap0.8technicalXML, lastmod, .gz, catalog disproportion
5Product schemaproduct_schema1.0technicalJSON-LD on real product, offers, Hyvรค detection
6Merchant policies โ˜… NEWmerchant_policies0.9technicalhasMerchantReturnPolicy, OfferShippingDetails, priceValidUntil, itemCondition
7Organization schema โ˜… NEWorganization_schema0.8technicalOrganization / OnlineStore on homepage, sameAs, logo
8UCP profile โ˜… NEWucp_profile0.9technical/.well-known/ucp, signing keys, leaked-private-key detection
9AI product feedai_product_feed1.0feedFeed file, /.well-known/ai-plugin.json, REST endpoint
10JSON-LD quality โ˜… NEWjsonld_quality0.7technicalBreadcrumb, ItemList, WebSite+SearchAction, duplicate schemas
11Canonical + hreflangcanonical0.7technicalCanonical agrees with og:url + JSON-LD url; hreflang on multi-store
12Open Graphopen_graph0.7technicalAll 5 OG tags, description length
13FAQ schemafaq_schema0.5technicalFAQPage JSON-LD on homepage or sampled CMS page
14Well-known matrix โ˜… NEWwell_known0.5technicalucp / ai-plugin.json / security.txt / mcp inventory
15Core Web Vitals โ˜… NEWcore_web_vitals0.5external_apiLCP / INP / CLS via Google CrUX (API key required)

โ˜… NEW = added in v3.0.0.


Installation

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

For full coverage, install the companion modules:

composer require \
  angeo/module-llms-txt \
  angeo/module-rich-data \
  angeo/module-openai-product-feed \
  angeo/module-openai-product-feed-api \
  angeo/module-ucp \
  angeo/module-aeo-brand-visibility

CLI usage

# Audit all stores
bin/magento angeo:aeo:audit

# Specific store
bin/magento angeo:aeo:audit --store=en_us

# JSON output (for dashboards / CI)
bin/magento angeo:aeo:audit --format=json

# Markdown report to file
bin/magento angeo:aeo:audit --format=markdown --output=/var/www/html/aeo-report.md

# Fast technical-only checks (skip external APIs)
bin/magento angeo:aeo:audit --category=technical

# Run only external-API checks (Core Web Vitals + any third-party live signals)
bin/magento angeo:aeo:audit --category=external_api,live_signal

# Fail build if score below threshold
bin/magento angeo:aeo:audit --fail-on=80

# Fail build if any critical-severity check fails
bin/magento angeo:aeo:audit --fail-on-severity=critical

# Run without saving to DB (CI / read-only environments)
bin/magento angeo:aeo:audit --no-save

Sample output:

  AEO Score: [โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘] 81% โ€” Good
  โœ“ Pass: 12  โš  Warn: 3  โœ— Fail: 1

  Critical fixes needed:
  โ†’ Install angeo/module-openai-product-feed and register at chatgpt.com/merchants

  ๐Ÿ’ก Fix with angeo modules:
     composer require angeo/module-openai-product-feed angeo/module-openai-product-feed-api
     composer require angeo/module-ucp

Configuration

Some checkers need configuration. All are accessed via: Stores โ†’ Configuration โ†’ Angeo AEO.

SettingPurpose
CrUX API KeyRequired by core_web_vitals checker. Free key from console.cloud.google.com โ€” enable the Chrome UX Report API. Stored encrypted.

Admin UI

  • Marketing โ†’ Angeo AEO โ†’ AEO Audit Results โ€” full history grid
  • Marketing โ†’ Angeo AEO โ†’ Score Trend โ€” line chart of AEO score over time
  • โ–ถ Run Audit Now button (on the Audit Results grid, Score Trend, and result view pages) โ€” triggers an on-demand audit. Since 3.1.0 this is a POST action protected by the admin form key and the dedicated Angeo_AeoAudit::run_audit ACL permission; the old GET menu entry was removed.

Score interpretation

ScoreLabelTypical situation
0โ€“25%CriticalDefault Magento install. AI crawlers blocked. No schema.
26โ€“50%Needs ImprovementSome fixes applied. Feed or merchant policies missing.
51โ€“75%Needs ImprovementCore signals in place. UCP, ai-plugin.json, or hreflang missing.
76โ€“90%GoodStrong foundation. Minor gaps in well-known or CWV.
91โ€“100%ExcellentFull 2026 AEO compliance.

Cron

Weekly audit every Monday at 03:00 server time. Results saved to DB, last 50 per store retained.

bin/magento cron:run --group=default

For fast daily checks (without external APIs or log scans), schedule an additional cron job calling the audit with --category=technical.


Extending with custom checks

Implement Angeo\AeoAudit\Api\CheckerInterface (or extend Angeo\AeoAudit\Model\Checker\AbstractChecker, which provides HTTP cache, URL sampling and JSON-LD parsing), and register via di.xml:

<type name="Angeo\AeoAudit\Model\AuditRunner">
    <arguments>
        <argument name="checkers" xsi:type="array">
            <item name="my_check" xsi:type="object">Vendor\Module\Model\Checker\MyChecker</item>
        </argument>
    </arguments>
</type>

v3 interface:

public function getName(): string;       // "My Custom Check"
public function getCode(): string;       // "my_check"
public function getWeight(): float;      // 0.0โ€“1.0
public function getCategory(): string;   // CheckerInterface::CATEGORY_*
public function getSeverity(): string;   // CheckerInterface::SEVERITY_*
public function getFixCommand(): string; // "composer require vendor/fix-module" or ""
public function check(\Magento\Store\Api\Data\StoreInterface $store): CheckResult;

Migrating from v2? See CHANGELOG.md for the migration guide.


Running tests

vendor/bin/phpunit -c app/code/Angeo/AeoAudit/phpunit.xml

v3 ships with unit tests covering all 15 checkers, both services (HttpCache, StoreUrlSampler), the AuditRunner, and the report value objects.


Code quality

# Magento Coding Standard
vendor/bin/phpcs --standard=Magento2 \
    --extensions=php,phtml --severity=10 \
    app/code/Angeo/AeoAudit/

# PHPStan static analysis
vendor/bin/phpstan analyse -l 5 app/code/Angeo/AeoAudit/

The Angeo AI Visibility Suite

ModuleSignalPurpose
angeo/module-aeo-auditโ€”This module โ€” audit all 15 signals
angeo/module-robots-txt-aeo#1Inject AI bot rules into robots.txt
angeo/module-llms-txt#2, #3Generate llms.txt and llms.jsonl
angeo/module-rich-data#5, #6, #7, #13Product, Organization, FAQ JSON-LD + merchant policies
angeo/module-openai-product-feed#9ACP product feed for ChatGPT Shopping
angeo/module-openai-product-feed-api#9REST API โ€” 6 ACP endpoints
angeo/module-openai-instant-checkoutโ€”Agentic Commerce Protocol โ€” instant checkout from ChatGPT
angeo/module-ucp#8Universal Commerce Protocol โ€” /.well-known/ucp
angeo/module-aeo-brand-visibility(extends)Live AI visibility across ChatGPT, Claude, Perplexity, Gemini, Groq

Contributing

Issues and PRs welcome at github.com/angeo-dev/module-aeo-audit.

Before opening a PR:

  1. Run vendor/bin/phpunit -c phpunit.xml โ€” all tests must pass
  2. Run vendor/bin/phpcs --standard=Magento2 โ€” no MCS violations
  3. Add tests for any new checker

License

MIT โ€” see LICENSE


Made with care by Ievgenii Gryshkun โ€” open-source contributions to the Magento + AI commerce ecosystem.