Structured data
HIGHProduct JSON-LD includes `offers`
Each Product JSON-LD node has a resolvable Offer (or AggregateOffer) block. Without an Offer, agents can't see that the product is for sale.
What this check looks for
Agentic-commerce surfaces treat Products without an `offers` block as non-purchasable. We accept either a single Offer or an AggregateOffer (which itself contains nested Offers). v2 relaxes the legacy 1.0 threshold to 0.95 — a single archived or test PDP shouldn't tank an otherwise compliant catalog. Coverage ≥ 95% passes; ≥ 50% partial; otherwise fail.
Which AI surfaces it affects
- Google AI Mode (UCP)100
- ChatGPT (ACP)90
- Microsoft Copilot70
- Meta AI70
- Perplexity60
Weighted against the live specs — ACP 2026-04-17, UCP 2026-04-08.
How to fix it
Add an `offers` object to every Product node
Shopify
Developer- Open Online Store → Themes → Edit code → `templates/product.liquid` or `sections/main-product.liquid`.
- In the JSON-LD block, add `"offers": { "@type": "Offer", "price": {{product.price | money_without_currency | json}}, "priceCurrency": "{{shop.currency}}", "availability": "https://schema.org/{% if product.available %}InStock{% else %}OutOfStock{% endif %}" }`.
- Validate at https://validator.schema.org/.
BigCommerce
Developer- In `templates/components/products/product-view.html`, add an `offers` key referencing `{{product.calculated_price}}` and `"priceCurrency": "{{currency_selector.active_currency_code}}"`.
- Save and validate.
WooCommerce
A few minutes- Yoast SEO and RankMath both emit Offer schema automatically. Confirm one is installed and active.
- If using a custom theme that strips schema, install "Product Structured Data for WooCommerce" (free).
Custom / headless
Developer- Render an `offers` object inside every Product JSON-LD block in the PDP `<head>`.
- Bind price + priceCurrency + availability from your product model.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Example Hat",
"offers": {
"@type": "Offer",
"price": "49.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://example.com/products/hat"
}
}
</script>The spec it's pinned to
schema.org/Offer
schema.org/Product carries an `offers` property — either an Offer or AggregateOffer. Without it, the surface cannot resolve price / availability.
Google merchant listing — offers required
Google's merchant listing rich result requires `offers` on the Product node with at minimum price + priceCurrency + availability.
Does your store pass this check?
Run the full audit — 82 checks across five AI shopping surfaces. Most tools only check whether you get mentioned; we check whether an agent can buy from you.