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.

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.