angeo / module-aeo-audit
angeo/module-aeo-audit
Magento 2 AEO (AI Engine Optimization) Audit. v3 covers 15 signals — robots.txt AI bots, llms.txt + llms.jsonl, Product / Organization / FAQ schema, merchant return + shipping policies, sitemap.xml, UCP profile, AI product feed, OG tags, canonical + hreflang, JSON-LD quality, well-known endpoint matrix, Core Web Vitals via CrUX. Score Trend dashboard, Admin UI, cron, dynamic fix commands, dependency-injected extension point for custom checkers.
Angeo AEO Audit — AI Engine Optimization for Magento 2
One CLI command that tells you exactly why ChatGPT, Gemini, and Perplexity aren't recommending your store — and how to fix it.
- 🏠 Project home: angeo.dev
- 📦 Source: github.com/angeo-dev/module-aeo-audit
- 🐛 Issues: github.com/angeo-dev/module-aeo-audit/issues
- 📖 Full guide: Magento 2 AEO Guide 2026
Compatibility
| Component | Version |
|---|---|
| Magento Open Source | 2.4.6, 2.4.7, 2.4.8 |
| Adobe Commerce | 2.4.6, 2.4.7, 2.4.8 |
| Adobe Commerce Cloud | All current versions |
| PHP | 8.2, 8.3, 8.4 |
| Themes | Luma, Hyvä |
Tested with: Magento Open Source 2.4.7-p3 + PHP 8.3 + Hyvä 1.3.
What's new in v2.1.1
Score Trend dashboard — admin page under Marketing → Angeo AEO → Score Trend shows AEO score over time as a line chart. Includes store selector, period selector (7 / 30 / 90 / 365 days), reference lines at 65% and 85%, and per-store score cards.
Dynamic fix commands in CLI output — when a signal fails, the audit output shows the exact composer require command to fix it. Each checker knows its own fix module, so only relevant commands are shown.
llms.jsonl as Signal #2b — new checker validates the machine-readable catalog file at /llms.jsonl. Checks JSON Lines format validity, required fields, eCommerce fields, record count, file freshness via Last-Modified. Weight 0.75.
Deeper llms.txt validation — 12 checks instead of 5: description paragraph after H1, eCommerce section detection, currency/language metadata, duplicate URL detection, file freshness, dead link HEAD-checks, llms-full.txt presence.
Recursive @graph parsing — JSON-LD schemas now parsed recursively at any nesting level. Handles top-level arrays, nested @graph, and mixed structures correctly.
What it checks
| # | Signal | Weight | What it validates |
|---|---|---|---|
| 1 | robots.txt — AI bot access | 1.0 | OAI-SearchBot, GPTBot, ClaudeBot, PerplexityBot, Google-Extended + 5 more; full parser with first-match semantics |
| 2 | llms.txt — AI content map | 1.0 | H1 title, description, H2 sections, markdown links, eCommerce sections, metadata, freshness, dead links |
| 2b | llms.jsonl — machine-readable catalog | 0.75 | JSON Lines validity, required fields, eCommerce fields, record count, freshness |
| 3 | sitemap.xml | 0.8 | XML validity, URL count, lastmod freshness, robots.txt reference |
| 4 | Product schema — JSON-LD | 1.0 | Real product page, offers.availability, Hyvä detection |
| 5 | FAQPage schema | 0.5 | Homepage and CMS pages |
| 6 | AI product feed | 1.0 | Feed file, /.well-known/ai-plugin.json, REST API endpoint |
| 7 | Open Graph tags | 0.7 | All 5 required tags, description length |
| 8 | Canonical tags | 0.6 | Presence and domain mismatch detection |
Installation
composer require angeo/module-aeo-audit
bin/magento setup:upgrade
bin/magento cache:flush
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
# Fail build if score below threshold
bin/magento angeo:aeo:audit --fail-on=80
# Run without saving to DB (CI / read-only environments)
bin/magento angeo:aeo:audit --no-save
Sample output:
AEO Score: [████████████████░░░░] 79% — Good
✓ Pass: 6 ⚠ Warn: 2 ✗ 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
Admin UI
Marketing → Angeo AEO → AEO Audit Results — full history grid with score, pass/warn/fail counts, triggered-by, and date.
Marketing → Angeo AEO → Score Trend — line chart of AEO score over time per store.
Marketing → Angeo AEO → Run Audit Now — trigger an on-demand audit from the browser.
Score interpretation
| Score | Label | Typical situation |
|---|---|---|
| 0–25% | Needs Improvement | Default Magento install. AI crawlers blocked. |
| 26–50% | Needs Improvement | Some fixes applied. Schema or feed missing. |
| 51–75% | Moderate | Core signals in place. Feed not registered. |
| 76–90% | Good | Strong foundation. Minor gaps. |
| 91–100% | Excellent | Full 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
Extending with custom checks
Implement Angeo\AeoAudit\Api\CheckerInterface 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>
Interface:
public function getName(): string; // "My Custom Check"
public function getCode(): string; // "my_check"
public function getWeight(): float; // 0.0–1.0
public function getFixCommand(): string; // "composer require vendor/fix-module" or ""
public function check(string $baseUrl): CheckResult;
Running tests
vendor/bin/phpunit -c app/code/Angeo/AeoAudit/phpunit.xml
Test coverage: 9 of 9 checkers (RobotsTxtChecker, LlmsTxtChecker, LlmsJsonlChecker, SitemapXmlChecker, ProductSchemaChecker, FaqSchemaChecker, ProductFeedChecker, OpenGraphChecker, CanonicalChecker) plus AuditReport unit test.
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
| Module | Signal | Purpose |
|---|---|---|
angeo/module-aeo-audit |
— | This module — audit all 9 signals |
angeo/module-robots-txt-aeo |
#1 | Inject AI bot rules into robots.txt |
angeo/module-llms-txt |
#2, #2b | Generate llms.txt and llms.jsonl |
angeo/module-rich-data |
#4, #5 | Product and FAQPage JSON-LD schema |
angeo/module-openai-product-feed |
#6 | ACP product feed for ChatGPT Shopping |
angeo/module-openai-product-feed-api |
#6 | REST API — 6 ACP endpoints |
angeo/module-openai-instant-checkout |
— | Agentic Commerce Protocol — instant checkout from ChatGPT |
Contributing
Issues and PRs welcome at github.com/angeo-dev/module-aeo-audit.
Before opening a PR:
- Run
vendor/bin/phpunit -c phpunit.xml— all tests must pass - Run
vendor/bin/phpcs --standard=Magento2— no MCS violations - 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.
Changelog
All notable changes to angeo/module-aeo-audit will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[2.1.2] — 2026-05-01
Fixed
- Recursive
@graphparsing in JSON-LD extraction — handles nested@graphand top-level array roots correctly - Bug-report URL in fallback error path now points to the correct repository
- Composer constraint accuracy: explicit
^ranges for Magento dependencies instead of* Test/directory excluded from production classmap
Added
- Unit tests for
ProductSchemaChecker,FaqSchemaChecker,ProductFeedChecker,LlmsJsonlChecker(9 of 9 checkers now have tests) CHANGELOG.mdandCONTRIBUTING.md- GitHub Actions CI workflow (PHPUnit + PHPStan + MCS)
- Magento Coding Standard as a
require-devdependency
Changed
- README updated with explicit Magento version compatibility (2.4.6, 2.4.7, 2.4.8)
- README mentions tested PHP versions (8.2, 8.3, 8.4)
- Removed hardcoded
versionfield fromcomposer.json— Packagist resolves from git tags
[2.1.1] — 2026-04-24
Added
getFixCommand()method onCheckerInterfacefor dynamic CLI fix suggestionsLlmsJsonlCheckerfor/llms.jsonlvalidation- Score Trend dashboard in admin UI
[2.1.0] — 2026-04-15
Added
- Score Trend dashboard
- Dynamic fix commands in CLI output
- Deeper
llms.txtvalidation (12 checks)
[2.0.0] — 2026-03-20
Added
- Deep robots.txt parser with first-match semantics
- Product schema validation including
offers.availability - Hyvä theme detection
- Admin UI with results grid
- Cron scheduling (weekly Monday 03:00)
- Extensible architecture via
CheckerInterface+di.xml
Changed
- Weighted scoring: critical signals weight 1.0, informational lower
[1.0.0] — 2026-02-10
Added
- Initial release with 6 AEO signal checks
- CLI command
bin/magento angeo:aeo:audit - Table, JSON, and Markdown output formats
| Version | Stability | QA Status | Released |
|---|---|---|---|
| 3.0.0 | stable | Fail | 2026-05-28 18:54:28 |
| 2.1.2 | stable | Not tested | 2026-05-15 10:02:00 |
| 2.1.1 | stable | Not tested | 2026-04-24 20:27:14 |
| 2.1.0 | stable | Not tested | 2026-04-24 19:37:35 |
| 2.0.1 | stable | Not tested | 2026-04-19 18:21:18 |
| 2.0.0 | stable | Not tested | 2026-04-16 19:27:52 |
| 1.0.0 | stable | Not tested | 2026-04-02 18:37:34 |
Requires 8
| Package | Constraint |
|---|---|
| magento/framework | ^103.0 |
| magento/module-backend | ^102.0 |
| magento/module-catalog | ^104.0 |
| magento/module-cms | ^104.0 |
| magento/module-config | ^101.2 |
| magento/module-store | ^101.1 |
| magento/module-ui | ^101.2 |
| php | ~8.2.0||~8.3.0||~8.4.0 |
Requires-dev 3
| Package | Constraint |
|---|---|
| magento/magento-coding-standard | ^33.0 |
| phpstan/phpstan | ^1.10 |
| phpunit/phpunit | ^10.0 |
Suggests 5
| Package | Reason |
|---|---|
| angeo/module-llms-txt | Fix Signals #2 and #2b — generate llms.txt and llms.jsonl |
| angeo/module-openai-product-feed | Fix Signal #6 — ACP product feed for ChatGPT Shopping |
| angeo/module-openai-product-feed-api | Fix Signal #6 — REST API endpoints for ACP feed |
| angeo/module-rich-data | Fix Signals #4 and #5 — Product JSON-LD schema and FAQPage schema |
| angeo/module-robots-txt-aeo | Fix Signal #1 — robots.txt AI bot access |
No QA results yet
QA pipelines haven't run for this version. Status appears here once the vendor publishes a tagged release that gets ingested.
Turn an existing module into recurring revenue.
If you already maintain a Magento 2 module on GitHub or GitLab, listing it on Packagento takes about five minutes. We mirror your tags, handle distribution signing, and route paid licenses through Stripe Connect, so you can keep shipping the way you already do.