Product schema

Product schema turns product listings in search results from plain text links into rich clickable cards with price, availability, review stars, and shipping info. On competitive SERPs, this is the difference between being noticed and being ignored. This page walks through the required fields, the recommended optional fields that unlock richer displays, and the common mistakes that disqualify your products from rich results entirely.

What product schema unlocks

Required fields

For a product page to qualify for rich results, it needs:

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Product Name",
  "image": "https://example.com/product.jpg",
  "description": "...",
  "sku": "PROD-123",
  "brand": {
    "@type": "Brand",
    "name": "Brand Name"
  },
  "offers": {
    "@type": "Offer",
    "priceCurrency": "USD",
    "price": "99.00",
    "availability": "https://schema.org/InStock",
    "priceValidUntil": "2026-12-31",
    "url": "https://example.com/product-page"
  }
}

Recommended optional fields

aggregateRating

Triggers star rating display:

"aggregateRating": {
  "@type": "AggregateRating",
  "ratingValue": "4.5",
  "reviewCount": "127",
  "bestRating": "5",
  "worstRating": "1"
}

review

Individual reviews (in addition to aggregateRating):

"review": [{
  "@type": "Review",
  "author": { "@type": "Person", "name": "Sarah M." },
  "datePublished": "2026-04-15",
  "reviewBody": "...",
  "reviewRating": { "@type": "Rating", "ratingValue": "5" }
}]

Product identifiers

At least one of GTIN, MPN, or brand is required. Having all increases Merchant Center trust.

Shipping + returns

Rich results increasingly include shipping details + return policies:

"offers": {
  ...
  "shippingDetails": {
    "@type": "OfferShippingDetails",
    "shippingRate": { "@type": "MonetaryAmount", "value": "0", "currency": "USD" },
    "deliveryTime": {
      "@type": "ShippingDeliveryTime",
      "businessDays": { "@type": "OpeningHoursSpecification", "dayOfWeek": [...] },
      "transitTime": { "@type": "QuantitativeValue", "minValue": 2, "maxValue": 5, "unitCode": "DAY" }
    }
  },
  "hasMerchantReturnPolicy": {
    "@type": "MerchantReturnPolicy",
    "applicableCountry": "US",
    "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
    "merchantReturnDays": 30,
    "returnMethod": "https://schema.org/ReturnByMail",
    "returnFees": "https://schema.org/FreeReturn"
  }
}

Availability values

Match what's actually true. Out-of-stock pages should say so in schema, not claim InStock.

Multiple offers (different sellers, prices)

"offers": {
  "@type": "AggregateOffer",
  "offerCount": "4",
  "lowPrice": "89.00",
  "highPrice": "129.00",
  "priceCurrency": "USD",
  "offers": [
    { "@type": "Offer", "seller": { "@type": "Organization", "name": "..." }, "price": "89.00" },
    ...
  ]
}

Testing

Common mistakes

Google Merchant Center integration

If you run paid shopping ads, Google Merchant Center consumes the same schema. Consistent, complete product schema improves both organic rich results and paid shopping campaign quality scores. Double ROI.

What to do with this

Pick your 10 best-selling products. Run each through the Rich Results Test. Note any warnings or missing required fields. Fix those today. Star ratings in SERPs typically boost CTR by 20 to 30%, that's a week of work for permanent lift.

Next: out-of-stock pages, the one ecommerce SEO detail that most sites get dramatically wrong.