A

Structured data

HIGH

Product 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
  1. Open Online Store → Themes → Edit code → `templates/product.liquid` or `sections/main-product.liquid`.
  2. 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 %}" }`.
  3. Validate at https://validator.schema.org/.

BigCommerce

Developer
  1. In `templates/components/products/product-view.html`, add an `offers` key referencing `{{product.calculated_price}}` and `"priceCurrency": "{{currency_selector.active_currency_code}}"`.
  2. Save and validate.

WooCommerce

A few minutes
  1. Yoast SEO and RankMath both emit Offer schema automatically. Confirm one is installed and active.
  2. If using a custom theme that strips schema, install "Product Structured Data for WooCommerce" (free).

Custom / headless

Developer
  1. Render an `offers` object inside every Product JSON-LD block in the PDP `<head>`.
  2. 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.

schema.org/Offer

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.

Related structured data checks

← All 82 checks