JSON-LD for product pages

The Product structured-data fields that matter — name, image, and offers with price, currency, and availability — plus how to validate before you ship.

Why Product schema

Structured data tells search engines what a page is about in unambiguous terms. For product pages, a valid Product schema can qualify the page for rich results in Google Search — price, availability, and rating displayed directly in the search listing.

The key word is "can." Rich results are not guaranteed. What is guaranteed is that a missing or invalid schema removes the eligibility entirely. A page with no Product schema will never show rich result features, regardless of how well it ranks.

Check your structured data

Run the free JSON-LD Validator to catch missing required fields and rich-result issues.

JSON-LD Validator

The fields that matter

Google's Product schema has two required properties and several that are practically required for rich results:

  • name — the product name; required
  • image — a URL (or array of URLs) for product images; required for rich results
  • offers — the pricing and availability block; required for price-related rich results

Optional but useful: description, sku, brand, review, and aggregateRating.

A missing required field drops the page from rich-result eligibility immediately. Google's documentation lists name and image as the baseline — without them, nothing else matters.

The offers block

offers is where price and availability live. These three properties are expected for price-related rich results:

  • price — the numeric price (e.g., "29.99")
  • priceCurrency — the ISO 4217 currency code (e.g., "USD", "EUR")
  • availability — a schema.org URL indicating stock status (e.g., "https://schema.org/InStock")

Common availability values:

  • https://schema.org/InStock
  • https://schema.org/OutOfStock
  • https://schema.org/PreOrder

Here is a minimal valid Product JSON-LD block:

JSON
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Ceramic Pour-Over Coffee Dripper",
  "image": "https://example.com/images/pour-over-dripper.jpg",
  "offers": {
    "@type": "Offer",
    "price": "34.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock"
  }
}

Place this inside a <script type="application/ld+json"> tag in the page's <head> or <body>. It does not affect page rendering.

Validating before you ship

Google's Rich Results Test and the Schema.org validator both check for structural errors. The JSON-LD Validator flags missing required fields and malformed values before you deploy.

Run validation on the deployed URL, not just the raw JSON — some frameworks inject structured data dynamically, and the live page is what Google's crawler actually reads.

Common errors

Price as a number, not a string. The price field should be a quoted string ("29.99"), not a bare number (29.99). Both parse correctly, but string form avoids floating-point edge cases in some validators.

Missing priceCurrency. A price without a currency code fails validation. Always pair them.

Relative image URL. The image field must be an absolute URL. A relative path like /images/product.jpg will not resolve correctly from the schema context.

Stale availability. If a product goes out of stock and the schema still says InStock, Google may penalize the page for inaccurate data. Keep the availability field in sync with your inventory system.

Schema embedded in client-side JavaScript. Google's crawler reads server-rendered markup. If your JSON-LD is injected after page load via a framework, verify it appears in the initial HTML response — not just in the browser.

Want to maintain this across every route?

Linkraft is coming soon. Use the free tools today, and join the waitlist for route-level fixes, monitoring, and reports.

By joining the waitlist, you agree to receive launch updates from Linkraft. You can unsubscribe at any time.

No spam. Just launch updates and useful resources about metadata, schema, and link previews.