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:
name,description, andimage- An
offersobject withprice,priceCurrency, andavailability sku, when one is set
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:
| Field | Status | Why it matters |
|---|---|---|
name | Required | The product title shown in results. |
offers (price, currency, availability) | Required* | Powers price and stock in rich results. |
aggregateRating / review | Required* | The star rating. One of offers/review/rating is required. |
image | Recommended | Product thumbnail in rich results and Merchant listings. |
gtin / mpn | Recommended | Global identifier; strongly tied to Shopping eligibility. |
brand | Recommended | Helps Google match and trust the product. |
shippingDetails, hasMerchantReturnPolicy | Recommended | Shipping 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.