On Adobe Commerce you almost always need to add product schema yourself. The default Luma and Blank themes output structured data in the older microdata format (itemscope and itemprop attributes scattered through the HTML) rather than JSON-LD, and that default output typically omits availability, which is the field AI engines lean on most. The one constraint shaping everything on Adobe Commerce is that you have full code control but strict rules about where the code goes: Adobe's own documentation says never to edit Luma or Blank directly, because upgrades overwrite your changes. Customization belongs in a child theme.
Why Adobe Commerce is different
This is the open platform in the set, so the problem is not access, it is choosing the right mechanism. There are three legitimate routes: a structured-data extension from the Adobe Commerce Marketplace installed via Composer, a JSON-LD block added through layout XML in a custom theme, or (on headless builds) markup emitted by the frontend itself. What does not work is injecting the markup through a tag manager: Google may eventually process JavaScript-injected schema, but AI crawlers read the initial HTML response, and a block that only appears after scripts run is invisible to them. The second Adobe-specific wrinkle is configurable products: a configurable parent with per-variant prices and stock needs variant-level offers in the markup, not a single parent price.
Steps
1. Check what already exists. Open a live product page, view the page source, and search for application/ld+json and for itemscope. On a stock Luma build you will find microdata and no JSON-LD. Also check what extensions already emit: some SEO and reviews extensions add their own blocks, and those are your duplicate candidates.
2. Pick one route and commit to it. If you want the fastest path and your catalog is standard, install a structured-data extension from the Adobe Commerce Marketplace via Composer and configure it in the admin. These extensions generate JSON-LD from the product database and are built to pass both Google's Rich Results Test and the Schema Markup Validator. If you have developer resources and want full control, have the developer add a JSON-LD block to the product page layout in your child theme, rendered server side with the product's own data.
3. Enforce the child-theme rule. Whatever is added by hand goes in a custom theme that inherits from Blank or Luma, never in the default theme files themselves. Adobe's frontend documentation is explicit on this: edits to the default files get overwritten during upgrades.
4. Fix availability and variants explicitly. Whether you use an extension or hand-built markup, confirm that the offers block carries a real availability value per product and per variant, and that configurable products expose variant-level prices rather than only the parent price. Missing or parent-only availability is the classic Adobe Commerce failure.
5. Remove the conflicts. If the old microdata is still in the templates alongside your new JSON-LD, or an extension emits a second Product block, reconcile them to a single source of truth. Microdata plus JSON-LD saying the same thing is tolerable; two blocks saying different things is not.
6. Validate on the hard pages. Test a URL such as https://[yourdomain.com]/your-product.html, replacing yourdomain.com with your actual domain, in Google's Rich Results Test and the Schema Markup Validator. Test a configurable product with mixed variant stock, a simple out-of-stock product, and a product with reviews, and confirm the rating markup matches reviews visible on the page.
The fundamentals
- •The complete JSON-LD reference this article builds on, see our product schema guide
- •Whether AI crawlers can reach your pages at all, see our robots.txt guide
- •A readable catalog summary for AI engines, see our llms.txt guide
A hypothetical example
Say you run a cycling parts store on Adobe Commerce with configurable products (frame sizes with different prices and stock). You check the page source and find only microdata, no JSON-LD, and no availability anywhere. Your developer installs a structured-data extension via Composer, configures it in the admin, and you validate a size variant that is out of stock to confirm the markup says OutOfStock while another size says InStock. One extension, one source of truth, variants handled at the data level instead of guessed from the page.
What this guide does not cover
This covers getting valid JSON-LD product markup onto your Adobe Commerce product pages. It does not cover keeping prices and availability accurate as inventory changes (monitoring work), getting AI crawlers to your pages past your WAF and bot management, or letting an agent complete the checkout, which is the transaction layer and a separate job.
Frequently Asked Questions
Where is product structured data rendered in Magento 2?
Should I disable Magento default Microdata when adding JSON-LD?
How do I pass stock status correctly into the offers schema?
Check your own brand now
Run the free scan. It takes seconds, no signup, and shows whether AI crawlers can read your product pages today: aizii.ai/aeo-scan
Run the free scan