AgentReady Scan your site

Product schema: hand agents your name, price, and stock

Updated 2026-07-13 · 3 min read · comprehension pillar

JSON-LD is a script block of machine-readable facts about the page, written in the schema.org vocabulary. For a product page that means Product and its nested Offer: name, price, currency, and availability in a format an agent parses in one step instead of guessing from your layout. It must be in the server-rendered HTML; a tag injected by client-side JavaScript does not exist for most agents.

Search engines have read this markup for years. What changed is who else reads it: shopping and research agents now use the same fields to compare offers, verify terms, and decide which vendor to recommend or buy from. The markup you added for rich results is now your product's API for agents.

Why incomplete schema loses the sale

A shopping agent's loop is parse, compare, verify, act. A price scraped from page text is a guess: is $49 the price, the sale badge, or the shipping threshold? Offer.price is an answer. Missing availability means the agent cannot promise the item ships, so it recommends the competitor whose schema says InStock. Missing return terms leaves a trust question open at the exact moment commitment happens.

Wrong schema is worse than none: a price that disagrees with the page or availability that lies erodes the confidence the markup exists to create. Generate it from the same source of truth as the visible page, and it stays honest by construction.

The same block also feeds classic search rich results, so the work pays twice: price and stock shown in search listings for humans, and parseable offers for agents. Few line items in a store's backlog have that ratio of effort to surface area.

The complete snippet (copy, then edit values)

This is a full Product with Offer, shipping, and returns: the fields buying agents check before committing. Place one block per product page, in the head or body of the initial HTML.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Trailhead 2 Ultralight Tent",
  "description": "Two-person, three-season tent. 1.1 kg packed weight.",
  "sku": "TH2-2026",
  "image": "https://acme.example/img/trailhead-2.jpg",
  "brand": { "@type": "Brand", "name": "Acme" },
  "offers": {
    "@type": "Offer",
    "url": "https://acme.example/products/trailhead-2",
    "price": "349.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition",
    "shippingDetails": {
      "@type": "OfferShippingDetails",
      "shippingRate": {
        "@type": "MonetaryAmount", "value": "0.00", "currency": "USD"
      },
      "shippingDestination": {
        "@type": "DefinedRegion", "addressCountry": "US"
      }
    },
    "hasMerchantReturnPolicy": {
      "@type": "MerchantReturnPolicy",
      "applicableCountry": "US",
      "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
      "merchantReturnDays": 60,
      "returnMethod": "https://schema.org/ReturnByMail",
      "returnFees": "https://schema.org/FreeReturn"
    }
  }
}
</script>

price is a plain number string with no currency symbol; priceCurrency is the ISO 4217 code; availability is a schema.org URL (InStock, OutOfStock, PreOrder).

Not selling physical goods?

The same check applies to every site: non-commerce sites pass with a complete Organization (or WebSite) block instead. It tells agents who you are, where you are, and how to reach you, which is the identity layer citations and trust decisions rest on. Validate either flavor with validator.schema.org or Google's Rich Results test before shipping.

If products come in variants, give each variant page its own Product block, or use AggregateOffer with lowPrice and highPrice on listing pages. Precision beats coverage: one complete, accurate block per page outperforms a sitewide template full of empty fields.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Acme Software",
  "url": "https://acme.example",
  "logo": "https://acme.example/logo.png",
  "sameAs": [
    "https://github.com/acme",
    "https://www.linkedin.com/company/acme"
  ],
  "contactPoint": {
    "@type": "ContactPoint",
    "email": "support@acme.example",
    "contactType": "customer support"
  }
}
</script>

How AgentReady checks it

The scanner asks: is there complete Product or Organization schema? Commerce sites need a valid Product with an Offer carrying name, price, priceCurrency, and availability. Non-commerce sites need Organization or WebSite JSON-LD. The check is worth 4 points in the Comprehension pillar, and its trust-pillar siblings (offer completeness, return and shipping schema) grade the same block's depth.

The methodology's reasoning: Product and Offer schema hands agents your name, price, and availability directly. Missing it means shopping agents cannot confirm what you sell or for how much.

Frequently asked questions

Where exactly does the JSON-LD go?

Inside a script tag with type application/ld+json, in the head or body of the initial HTML response, one block per page. It must be server-rendered: markup injected after load by JavaScript is invisible to agents that do not execute scripts.

JSON-LD or microdata?

JSON-LD. It lives in one block instead of being scattered across attributes, which makes it easier to generate correctly and keep valid. Scanners and parsers treat it as the primary format; microdata is a partial credit at best.

Does Product schema matter for AI shopping agents specifically?

Yes. Agents compare offers on the parsed fields, and as of mid-2026 the emerging agent checkout integrations are built on the same structured product data. Complete schema is the prerequisite for all of them.

Does your site pass this check?

The scanner runs it, plus 29 more, and hands you the exact fix for each. Free, under a minute, no signup.

Scan your site