Fixes the "Product schema — JSON-LD structured data" signal in angeo/module-aeo-audit. Injects spec-compliant JSON-LD on product pages, CMS pages, and homepage.
| AEO Audit signal | Before | After |
|---|---|---|
| Product schema — JSON-LD structured data | FAIL / WARN | PASS |
| FAQPage schema — AI answer eligibility | WARN | PASS (on FAQ CMS pages) |
| Product schema — AggregateRating | WARN | PASS (when reviews exist) |
| Schema | Pages | Key fields |
|---|---|---|
Product |
All product pages | name, description, image, sku, offers.price, offers.priceCurrency, offers.availability, aggregateRating |
Organization |
All pages | name, url, logo, sameAs, contactPoint |
WebSite |
Homepage only | name, url, potentialAction/SearchAction |
BreadcrumbList |
Product pages | category path |
FAQPage |
CMS pages with FAQ content | auto-detected Q&A pairs |
composer require angeo/module-rich-data
bin/magento setup:upgrade
bin/magento cache:flushStores → Configuration → Angeo → Rich Data (JSON-LD)
- Enable/disable
- Include AggregateRating (from Magento reviews)
- Include BreadcrumbList
- Include SKU
- Include Brand (configurable attribute)
- Item condition (New/Used/Refurbished)
- Organization name (default: store name)
- Logo URL
- sameAs social URLs (comma-separated)
- Contact telephone + type
- Enable/disable
- Include SearchAction (Sitelinks Searchbox)
- Enable/disable — auto-detected from CMS page content
Add data-faq-question / data-faq-answer attributes to your CMS FAQ page for explicit Q&A detection:
<div data-faq-question="What is your return policy?"
data-faq-answer="We offer 30-day returns on all items in original condition.">
</div>Without these attributes the module uses heuristic detection: <h2>/<h3> followed by <p> are treated as question/answer pairs.
Implement Angeo\RichData\Api\Data\SchemaInterface and register via di.xml:
<type name="Angeo\RichData\Model\JsonLd\Renderer\SchemaRenderer">
<arguments>
<argument name="builders" xsi:type="array">
<item name="my_schema" xsi:type="object">Vendor\Module\Model\JsonLd\Builder\MySchemaBuilder</item>
</argument>
</arguments>
</type># Validate on random product
bin/magento angeo:rich-data:validate --store=en_us
# Validate specific product on specific store
bin/magento angeo:rich-data:validate --store=en_us --product-id=42Output example:
Validating JSON-LD for: [42] Alpine Hiking Jacket
Store: default
URL: https://mystore.com/alpine-jacket
Found 3 JSON-LD block(s):
Block 1: @type:Organization — valid JSON ✓
Block 2: @type:Product — valid JSON ✓
PASS aggregateRating present
Block 3: @type:BreadcrumbList — valid JSON ✓
All JSON-LD blocks are valid.
| Module | Purpose |
|---|---|
angeo/module-aeo-audit |
AEO audit — detects missing schema |
angeo/module-rich-data |
This module — fixes missing schema |
angeo/module-llms-txt |
Generates /llms.txt |
angeo/module-openai-product-feed-api |
ACP REST API for ChatGPT Shopping |
MIT — see LICENSE