Search by

requestdesk / magento-aeo

brentwpeterson

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

Statistics

Installs: 0

Dependents: 0

Suggesters: 1

Stars: 0

Open Issues: 0

0.1.0 2026-07-17 14:40 UTC

This package is auto-updated.

Last update: 2026-08-25 03:44:10 UTC


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.

  1. Seed every scorable entity (products carry a revenue snapshot; nothing else does):

    bin/magento requestdesk:aeo:sync
  2. 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
  3. 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. --async publishes 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 db connection, so it needs MySQL and nothing else — no RabbitMQ. --limit and --rescore select exactly the same entities in both modes, so switching to --async changes 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.

  4. 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
  5. 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 --record on a cadence. Until a cron ships, that is a cron entry you add yourself.

  6. In the adminContent → 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).