angeo / module-rich-data

angeo/module-rich-data

Magento 2 JSON-LD Rich Data for AI Engine Optimization. Injects spec-compliant Product, Organization, BreadcrumbList, FAQPage, and WebSite schema. Fixes the 'Product schema — JSON-LD structured data' signal in angeo/module-aeo-audit.

magento2-module Compatibility: 2.4.7-2.4.9 Code Quality: Fail Tests: Fail Security: Pass MIT

Are you the maintainer of angeo?

Packagento pulls angeo's Composer packages from the public registry so buyers can find them here.

Claim the namespace to take ownership, publish new releases directly, and start charging for premium versions.

Claim this namespace →

Angeo Rich Data — Magento 2

Packagist
License
PHP

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.


What this module fixes

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)
Merchant policies — return & shipping schema FAIL PASS (when enabled & configured)
Product schema — AggregateRating WARN PASS (when reviews exist)
JSON-LD quality — BreadcrumbList WARN PASS (now rendered on product pages)

Schema types injected

Schema Pages Key fields
Product All product pages name, description, image, sku, gtin/mpn, offers.price, offers.priceCurrency, offers.availability, offers.hasMerchantReturnPolicy, offers.shippingDetails, 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

Installation

composer require angeo/module-rich-data
bin/magento setup:upgrade
bin/magento cache:flush

Configuration

Stores → Configuration → Angeo → Rich Data (JSON-LD)

Product schema

  • Enable/disable
  • Include AggregateRating (from Magento reviews)
  • Include BreadcrumbList
  • Include SKU
  • Include Brand (configurable attribute)
  • Include GTIN / MPN (configurable attributes)
  • Item condition (New/Used/Refurbished)
  • In-stock / out-of-stock availability URLs

Merchant policies (return & shipping)

Injects offers.hasMerchantReturnPolicy and offers.shippingDetails — required by Google & ChatGPT Shopping since Jan 2026. Disabled by default; enable and fill in your real values.

  • Return policy: enable, return window (days), applicable country, return fee
  • Shipping details: enable, flat shipping rate, destination country, handling time (min/max days), transit time (min/max days)

Organization schema

  • Organization name (default: store name)
  • Logo URL
  • sameAs social URLs (comma-separated)
  • Contact telephone + type

WebSite schema

  • Enable/disable
  • Include SearchAction (Sitelinks Searchbox)

FAQPage schema

  • Enable/disable — auto-detected from CMS page content

FAQ page markup (recommended)

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.


Extending with custom schemas

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>

CLI validation

# 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=42

Output 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.

The Angeo AI Suite

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

License

MIT — see LICENSE

Changelog

All notable changes to angeo/module-rich-data are documented here.
This project adheres to Semantic Versioning.

[1.2.0] - 2026-06-13

Added

  • CollectionPage + ItemList on category pages (CollectionPageBuilder).
    Emits a CollectionPage whose mainEntity is an ItemList of the category's
    enabled, catalog-visible products (capped at 50). Read by the Gemini Shopping
    Graph, which previously had no machine-readable product listing on category
    pages. Toggle under Angeo Rich Data → CollectionPage schema (on by default).
  • Organization description. The Organization schema now includes a
    description field (configurable under Angeo Rich Data → Organization →
    Organization description). AI engines read it as the brand entity summary;
    its absence was previously flagged by the AEO audit.

Changed

  • ViewModel\JsonLd now builds context for catalog_category_view (current
    category + a lightweight product list) so the new CollectionPage builder has
    data to render.

[1.1.0] - 2026-06-08

Added

  • Merchant return policy (offers.hasMerchantReturnPolicy). Emits a
    spec-compliant MerchantReturnPolicy (applicableCountry, merchantReturnDays,
    returnPolicyCategory, returnMethod, returnFees). Required by Google &
    ChatGPT Shopping since January 2026. Configurable under
    Stores → Configuration → Angeo → Rich Data → Merchant policies.
  • Shipping details (offers.shippingDetails). Emits OfferShippingDetails
    with shippingRate (MonetaryAmount), shippingDestination (DefinedRegion)
    and optional deliveryTime (handling + transit QuantitativeValue).
  • GTIN / MPN identifiers on Product schema, read from configurable product
    attributes. Improves AI/Google product matching. Off by default.
  • New admin config group Merchant policies (return & shipping) and new
    Product fields: Include GTIN/MPN, GTIN attribute, MPN attribute, In-stock
    availability URL, Out-of-stock availability URL.
  • Model/Config/Source/ReturnFee source model for the return-fee dropdown.
  • Unit coverage for the merchant return policy and shipping details output.

Fixed

  • BreadcrumbList now actually renders on product pages. The
    BreadcrumbBuilder expected a breadcrumbs context key that the ViewModel
    never supplied, so the breadcrumb schema silently never appeared even with
    the toggle enabled. The ViewModel now builds the full trail
    (Home → category path → product) from the product's deepest active category
    and passes it into the render context. This resolves the persistent
    "BreadcrumbList missing" finding in angeo/module-aeo-audit.
  • availability_in_stock / availability_out_of_stock are now exposed in the
    admin (previously only present as config.xml defaults and not editable). The
    builder also falls back to sane schema.org defaults if either value is blank.

Changed

  • ViewModel now logs render failures via LoggerInterface instead of silently
    swallowing them, matching the error handling already used in SchemaRenderer.

Migration notes

  • No schema or data migration required. After upgrading, run:
    bin/magento setup:upgrade
    bin/magento cache:flush
    
  • Merchant return policy and shipping details are disabled by default to
    avoid publishing inaccurate policy data. Enable and fill them in under
    Stores → Configuration → Angeo → Rich Data → Merchant policies once your
    real return window, shipping rate and delivery times are known. Publishing
    incorrect policy values can hurt eligibility, so opt in deliberately.

[1.0.2] - 2026-04-18

Added

  • Initial public release: Product, Organization, WebSite, BreadcrumbList and
    FAQPage JSON-LD builders, admin configuration, angeo:rich-data:validate
    CLI command, and unit tests.
Versions
Version Stability QA Status Compatibility Released
1.2.0 stable Fail Magento 2.4.7-2.4.9 Details 2026-06-14 18:54:30
1.0.2 stable Not tested Not yet tested Details 2026-04-24 20:02:53
1.0.1 stable Not tested Not yet tested Details 2026-04-18 20:45:32
1.0.0 stable Not tested Not yet tested Details 2026-04-18 19:58:31

Requires 8

Package Constraint
magento/framework *
magento/module-backend *
magento/module-catalog *
magento/module-cms *
magento/module-config *
magento/module-review *
magento/module-store *
php >=8.2

Suggests 1

Package Reason
angeo/module-aeo-audit Verify JSON-LD injection with the AEO audit tool.

Compatibility

Each Magento release line is installed on its supported PHP versions, then the module is built (DI compilation + static-content deploy) and its unit and integration suites are run. The matrix shows the lines and PHP versions the module is confirmed to install and run on. Code-quality results further down (phpstan, phpcs, …) are reported separately and never affect compatibility.

Compatibility matrix (Magento × PHP)
Magento PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5
2.4.7 Pass Pass
2.4.8 Pass Pass
2.4.9 Pass Pass

Code Quality

Advisory checks against the module's source. Static analysis runs once across the whole module; PHPStan re-runs per Magento + PHP version because resolvable symbols differ between releases. These NEVER affect the Compatibility badge. A phpcs finding can't make a module incompatible.

Static analysis

Coding standards (phpcs), mess detection (phpmd), copy-pasted code (cpd), PHP cross-version compatibility, composer.json validity. Each runs once for the whole module.

Static analysis results
Tool Status Findings Summary
PHPCS Warning 57 57 warnings (ruleset: Magento2) — 33 auto-fixable with phpcbf
PHPMD Warning 12 12 rule violations (NPathComplexity:3, CyclomaticComplexity:3, UnusedFormalParameter:2, EmptyCatchBlock:1, ExcessiveClassComplexity:1)
Cpd Pass 0
Composer validate Info 8 valid; 8 advisory notes (composer validate --strict)

PHPStan

Type-checks the module's PHP against a real Magento install at the configured gate level. Re-runs per Magento and PHP version because resolvable symbols differ between releases.

PHPStan results by Magento and PHP version
Magento PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5
2.4.7 6 6
2.4.8 6 6
2.4.9 6 6

Tests

Unit and integration suites, run for each applicable Magento and PHP version. A test failure speaks to the module's behaviour, not its compatibility with a Magento line, so it is reported here separately and never reddens the compatibility matrix.

Unit tests

Unit tests results by Magento and PHP version
Magento PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5
2.4.7 13 13
2.4.8 13 not tested
2.4.9 13 not tested

Integration tests

Integration tests results by Magento and PHP version
Magento PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5
2.4.7 N/A N/A
2.4.8 N/A N/A
2.4.9 N/A N/A

Security

Security checks run directly against the module: an audit of its declared dependencies for known vulnerabilities (composer audit) and a scan of its source for malware and web-shell signatures. Each runs once. A malware detection fails the version outright.

Security results
Tool Status Findings Summary
Composer audit Pass 0
Malware scan Pass 0
License
MIT
Homepage
https://angeo.dev
Authors

More from angeo

View vendor
angeo/module-llms-txt Free
magento2-module

Magento 2 module for AI Engine Optimization (AEO). Generates spec-compliant llms.txt and llms-full.txt per llmstxt.org standard, plus streaming JSONL for vector indexing. Multi-store, multi-website, CLI, cron, async admin UI, Page Builder-aware sanitization, customer-group pricing, atomic writes, ETag/Cache-Control, .md mirrors.

v3.2.0 18d ago
0
angeo/module-robots-txt-aeo Free
magento2-module

Magento 2 module for AI Engine Optimization (AEO). Injects AI crawler rules (OAI-SearchBot, GPTBot, ChatGPT-User, PerplexityBot, Perplexity-User, Google-Extended, ClaudeBot, anthropic-ai, Claude-User, Applebot, cohere-ai, Amazonbot, Meta-ExternalAgent) into robots.txt — without overwriting your existing configuration. Supports per-bot Allow/Disallow lists, Crawl-delay, Sitemap directives, multi-store, and a public Api\RobotsStatusInterface for cross-module integration with angeo/module-aeo-audit.

v3.0.0 18d ago
0
angeo/module-aeo-brand-visibility Free
magento2-module

Live AI brand visibility audit for Magento 2. Queries ChatGPT, Claude, Perplexity, Gemini and Groq with brand-probing prompts and scores real-world AI recall, citation rate and recommendation presence. Extends angeo/module-aeo-audit v3 via CheckerInterface as the 16th signal, alongside the 15 built-in technical checks.

v1.2.0 18d ago
0
angeo/module-aeo-audit Free
magento2-module

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.

v3.1.0 18d ago
0
Make it pay

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.