AI i SEO

Product structured data: what your store needs for Google to show price and availability

ยท Krzysztof Balicki

Open drawers of a card catalogue cabinet

Want Google to show your price and availability in search results? Your product page needs correct product structured data. That means schema Product markup with a nested Offer object that says the same thing the customer sees on the page. According to Google’s documentation on product data, this markup lets Google display price, availability, ratings and shipping details right in the results, including Google Images and Google Lens. I’m writing this for owners and admins of WooCommerce or PrestaShop stores. If your competitors have neat prices and stars in the results and you don’t, this is where you’ll find out what’s missing.

What is product structured data and how does it change Google results?

It’s a machine-readable description of the product (like an llms.txt file), most often in JSON-LD. It tells Google which value is the name, the price, the currency and the stock status. The field vocabulary comes from schema.org (a shared standard used by search engines), and JSON-LD is simply the format you paste into the page code. From this, Google can build an enhanced result, called a rich result, with price, availability, ratings or shipping.

Oh, and Google works out price drops on its own. It watches how the price changes over time and doesn’t promise to show it at all. The same goes for everything else: markup makes you eligible for product results, it doesn’t guarantee them. Don’t expect more than that.

Which schema Product fields do you need to show price and availability?

The minimum? A Product with a name plus a nested Offer with price, currency and availability. In practice, though, I recommend going further, because the fuller the description, the easier it is for Google to match the product to queries and to data from other sources.

  • name, image, description - the basic product description, including one written with AI help,
  • sku or gtin and brand - identifiers and brand,
  • offers.price and offers.priceCurrency - the price as a number and the currency code, e.g. PLN,
  • offers.availability - a schema.org URL, e.g. InStock, OutOfStock, PreOrder,
  • offers.url - the product page URL,
  • optionally priceValidUntil, shippingDetails and hasMerchantReturnPolicy.

Here’s what it looks like in code. The block sits in a script tag of type application/ld+json:

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Aqua electric kettle",
  "image": "https://sklep.example/img/czajnik-aqua.jpg",
  "sku": "CZ-AQUA",
  "brand": { "@type": "Brand", "name": "Aqua" },
  "offers": {
    "@type": "Offer",
    "url": "https://sklep.example/czajnik-aqua",
    "price": "129.00",
    "priceCurrency": "PLN",
    "availability": "https://schema.org/InStock"
  }
}

What about aggregateRating and review? Add them only when the page shows real customer reviews. No reviews, no fields. Simple.

Availability in search results: how to keep it in sync with your stock

Availability in the markup should change along with your stock. Otherwise Google will show outdated information or stop trusting your data altogether. Where do mismatches come from? Usually a few places: the cache serves an old version of the page, products have variants, the sale price only appears after login, or someone once pasted JSON-LD by hand and nobody touched it again (a classic).

The price in the markup must be identical to the one on the page, in the same currency. A promotion gets an expiry date. For variants such as size or colour, it’s better to describe separate offers or use ProductGroup. One price for everything is asking for trouble.

How do you add product structured data in WooCommerce and PrestaShop?

WooCommerce and PrestaShop generate basic markup on their own. The catch is that you usually need to add missing fields and remove duplicates added by the theme or an SEO plugin.

  1. Check what your store already outputs: the product page source code and the Rich Results Test.
  2. Turn off duplicate markup sources, leaving just one.
  3. Add GTIN, brand, shipping and return policy.
  4. Verify how variants are described.
  5. Test several different product pages.

When only a few fields are missing, configuration is enough. It gets harder with custom attributes or an integration with an external warehouse, because then you often need an add-on. You’ll find WooCommerce plugins and PrestaShop modules at K4.pl, including ones built for a specific store. One more thing: watch out for themes that insert their own incomplete Product next to the one from WooCommerce. In my opinion, it’s one of the more common traps.

On-page markup or a Merchant Center feed: which should you choose?

Both. Google combines the two sources, which makes it easier to check that the data matches. The documentation lists three options: on-page markup, a Google Merchant Center feed with free product listings enabled, or both at once. A fun fact: product snippets can pull the price from the feed if it’s missing in the markup.

The roles split like this: Merchant Center decides whether you appear in the Shopping tab, the markup decides how your result looks in regular search. There’s one condition. The same price, availability and identifiers in the feed, in the code and on the page.

The most common mistakes that stop Google from showing the price

It’s rarely that the markup is missing entirely. More often the Offer fields are incomplete or contradict each other.

  • missing priceCurrency,
  • a price with a thousands separator or a currency symbol in the price field,
  • availability as plain text instead of a schema.org URL,
  • ratings without real reviews,
  • two different Product blocks on one page,
  • markup rendered late by a script, invisible to Googlebot.

You’ll catch warnings in the rich result reports in Google Search Console and in the Rich Results Test. After fixing things, request reindexing of a few product pages and keep an eye on the report. Be patient, because Google sometimes reacts quickly and sometimes slowly.

And that’s pretty much it. Product structured data works when it’s complete, matches the page and updates along with your stock. Where to start? With an audit of what you already have. Then fill in the Offer, clean up duplicates and connect your store to Merchant Center.

Frequently asked questions

Will Google definitely show the price after I add structured data?

No. Markup makes you eligible for rich results, and Google decides what gets displayed. Correct fields and consistency with the page content simply improve your chances.

Can I add star ratings if my store doesn’t collect reviews?

No. The aggregateRating field must come from real reviews that are visible on the page. Made-up ratings can cost you rich results altogether.

Does WooCommerce add schema Product automatically?

Yes, at a basic level. Still, check whether the markup includes GTIN, brand, shipping and returns, and whether your theme or SEO plugin duplicates it.