requestdesk / magento-aeo
RequestDesk AEO Extension - Scores Magento product pages for answer-engine optimization and ranks the highest-earning pages that need supporting content. Pluggable scoring backends: free local heuristic, direct Claude, or RequestDesk (coming soon).
Package info
github.com/brentwpeterson/requestdesk-magento-aeo
Type:magento2-module
pkg:composer/requestdesk/magento-aeo
Requires
- php: ^8.1
- magento/framework: ^103.0
- magento/module-backend: ^103.0
- magento/module-catalog: ^104.0
- magento/module-sales: ^103.0
- magento/module-store: ^101.0
- magento/module-ui: ^101.0
- requestdesk/magento-qa: ^0.1
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Scores Magento product pages for Answer Engine Optimization (AEO) and ranks the highest-earning pages that need supporting content.
requestdesk/magento-aeo · v0.1.0 · OSL-3.0 · PHP ^8.1 · Magento framework ^103.0
Requires the shared requestdesk/magento-qa
library — a product's FAQ schema is built from Q&A pairs attached through it.
No dependency on RequestDesk_Blog, so this installs and runs without the blog.
What it does
Every product gets a 0–100 AEO score across five dimensions —
qa_pairs, product_schema, citation_potential, freshness,
content_analysis. The admin grid ranks products by revenue alongside their
score, so the highest-earning, lowest-scoring pages surface as the best content
targets. Product pages are short by nature, so most score low: that low score
is the signal to develop supporting content.
Scoring backends (pluggable)
The backend is chosen in config. All three return the same normalized result, so switching backends never changes the grid or the stored shape.
| Backend | Status | Cost | Needs |
|---|---|---|---|
| Local Heuristic | shipping | free, offline | nothing |
| Claude (direct) | shipping | your Anthropic usage | an Anthropic API key |
| RequestDesk | coming soon | bundled in a paid RequestDesk plan | a RequestDesk key |
- Local Heuristic ports the RequestDesk WordPress AEO rubric to product pages (description, short description, and spec attributes). Pure PHP.
- Claude (direct) calls the Anthropic Messages API with the store's own key, defaulting to the cheapest current model (Haiku 4.5).
- RequestDesk will route scoring through the RequestDesk platform, which picks the model and gates the feature behind a paid plan. Not built yet.
Install
Composer resolves the required requestdesk/magento-qa dependency automatically.
composer require requestdesk/magento-aeo bin/magento module:enable RequestDesk_Qa RequestDesk_Aeo bin/magento setup:upgrade bin/magento setup:di:compile bin/magento cache:flush
Configure
Stores → Configuration → RequestDesk → AEO Scoring
- General → Enable AEO Scoring
- Scoring Backend → Score Source — Local Heuristic | Claude (direct) | RequestDesk
- Anthropic API Key — required only for the Claude backend (encrypted at rest)
- Claude Model — defaults to
claude-haiku-4-5-20251001
Use
The module grades the whole store, not just the catalog: products, category pages, CMS pages and blog posts are all scored on the same rubric, and a site-level layer scores the things that belong to the store rather than to any one page.
-
Seed every scorable entity (products carry a revenue snapshot; nothing else does):
bin/magento requestdesk:aeo:sync
-
Score content. Products are the default and come highest-revenue-unscored first, which is the ordering that matters when you cannot score everything:
bin/magento requestdesk:aeo:score # top 50 products bin/magento requestdesk:aeo:score --id=42 # one entity, prints breakdown bin/magento requestdesk:aeo:score --type=blog_post # or category, cms_page bin/magento requestdesk:aeo:score --limit=200 --rescore
-
Score a real catalog asynchronously. Inline scoring is fine for tens of entities and will not finish for thousands, because every entity is a full extract-and-score round trip.
--asyncpublishes the same selection to a queue instead:bin/magento requestdesk:aeo:score --type=product --limit=5000 --async bin/magento queue:consumers:start requestdesk.aeo.score
The queue runs on the
dbconnection, so it needs MySQL and nothing else — no RabbitMQ.--limitand--rescoreselect exactly the same entities in both modes, so switching to--asyncchanges when the work happens and not which work happens.One entity per message, deliberately. A batch message is all-or-nothing: a single entity that cannot be loaded would take its whole batch down and a retry would re-score everything that had already succeeded.
-
Run the store-level checks — sitemap freshness,
robots.txt(including whether GPTBot and ClaudeBot are blocked),llms.txt, organization identity, and content-to-product linking:bin/magento requestdesk:aeo:site-check
-
Read the grade — one 0–100 for the store:
bin/magento requestdesk:aeo:grade # calculate and print bin/magento requestdesk:aeo:grade --record # also write a history row
Recording is opt-in and nothing schedules it yet, so the grade only has a trend if something runs
--recordon a cadence. Until a cron ships, that is a cron entry you add yourself. -
In the admin — Content → RequestDesk AEO → AEO Scores. Sort by revenue or score, select rows, and use Score Selected. The row View link opens the full category breakdown and recommendations.
How the store grade is composed
Content is 70% of the grade and the site layer 30%. A store with a perfect sitemap and nothing worth citing is not discoverable, it is merely crawlable.
Within the content share: products 40, blog posts 25, categories 20, CMS pages 15. These are not weighted by row count on purpose. A catalog of 10,000 products and 20 blog posts would otherwise have its grade decided almost entirely by PDPs, which score low by nature because they are short, and every store would land in the low thirties. The weights are renormalized over the types that actually have scored rows, so a store with no blog is graded on what it has rather than docked for a feature it never bought.
Scoring rubric (Local Heuristic)
Max 100. Ported from the WordPress plugin, with its two known bugs left out (the HTML-vs-Markdown heading mismatch and the bulk action that ignored its dropdown).
| Bucket | Max | How |
|---|---|---|
qa_pairs |
25 | 5 pts per Q&A pair (question headings, Q: markers) |
product_schema |
20 | FAQ readiness (10) + spec-attribute richness (10) |
citation_potential |
20 | 4 pts per distinct statistic (numbers, measures, %, money) |
freshness |
15 | scaled by how recently the product was updated |
content_analysis |
20 | question headings (8) + clear structure (7) + >500 words (5) |
Not in this version
- Product-edit page block. v1 surfaces the per-product breakdown on a grid detail page (row → View), not inside the product edit form. The form-modifier injection is deliberately deferred to build against a running store.
- Content generation. Turning a low score into a drafted supporting blog post is the next phase, not this one.
- RequestDesk backend. Needs a thin scoring wrapper on the RequestDesk side first (a Magento-facing endpoint over the existing discoverability engine, plus the paid-tier gate).