Guides / Product schema

How to Add Rich Product Schema to WooCommerce

Product structured data is what turns a plain blue link into a rich result with price, stars, and availability — and it’s the same data Google Merchant listings and AI answer engines read. WooCommerce ships some of it. This guide covers what’s missing and how to complete it.

What WooCommerce outputs by default

Out of the box, WooCommerce (and most themes) emit a basic Product JSON-LD block on single product pages. It typically includes:

That is enough to be valid, but not enough to be competitive. The fields that unlock richer results — product identifiers, brand, and ratings — are usually absent.

The fields Google actually reads

Google splits Product structured data into required and recommended properties. Here is the practical version for an ecommerce catalog:

FieldStatusWhy it matters
nameRequiredThe product title shown in results.
offers (price, currency, availability)Required*Powers price and stock in rich results.
aggregateRating / reviewRequired*The star rating. One of offers/review/rating is required.
imageRecommendedProduct thumbnail in rich results and Merchant listings.
gtin / mpnRecommendedGlobal identifier; strongly tied to Shopping eligibility.
brandRecommendedHelps Google match and trust the product.
shippingDetails, hasMerchantReturnPolicyRecommendedShipping and returns annotations in results.

*At least one of review, aggregateRating, or offers is required for product rich results.

What good Product JSON-LD looks like

Here is a complete, Merchant-friendly Product block. Note the identifier, brand, rating, and a fully specified offer:

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "TrailMaster Waterproof Backpack",
  "image": ["https://yourstore.com/wp-content/uploads/backpack-1.jpg"],
  "description": "30L waterproof hiking backpack with laptop sleeve.",
  "sku": "ABC-123",
  "gtin13": "0012345678905",
  "brand": { "@type": "Brand", "name": "TrailMaster" },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.7",
    "reviewCount": "218"
  },
  "offers": {
    "@type": "Offer",
    "url": "https://yourstore.com/product/trailmaster-backpack/",
    "priceCurrency": "USD",
    "price": "89.00",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition"
  }
}

Three ways to add the missing fields

1. Edit your theme’s schema output

If you are comfortable with PHP, you can filter WooCommerce’s structured data with woocommerce_structured_data_product and inject brand, gtin13, and aggregateRating. This is the most control, but you own the code forever and have to keep it current with Google’s guidance.

2. Use an SEO/schema plugin

General SEO plugins can output Product schema, but coverage of identifiers and brand varies, and you often end up with two plugins emitting conflicting Product blocks. If you go this route, validate that only one Product block is present per page.

3. Serve clean schema from a dedicated endpoint

Easy Woo API takes the third approach: it publishes complete, validated Product schema (GTIN, brand, availability, pricing) and exposes the same data through public, read-only JSON endpoints — so crawlers, feeds, and AI agents all read one consistent source of truth. See how it works.

Always validate before you ship

Whatever method you choose, test a few real product URLs with Google’s Rich Results Test and the Schema.org validator. Watch for two common problems: duplicate Product blocks from competing plugins, and an availability value that doesn’t match the live stock status.

Next: once your schema is solid, make sure answer engines can find it too — read How to make your WooCommerce store visible to ChatGPT & AI search.