Google Shopping
How Product Structured Data Supports Google Shopping
Product markup on your pages and your Merchant Center feed describe the same product. Here’s how they work together and what Google’s documentation requires.
Product structured data (schema.org markup on your product pages) does two jobs for Shopping. It can make pages eligible for merchant listing experiences in Google Search, and it gives Google a machine-readable version of your price, availability and condition that Merchant Center can compare with, and update from.
This guide explains what Google Search Central requires for merchant listing structured data, how it relates to your product feed, why the markup should be in the initial HTML, and how to declare shipping and return policies at the Organization level.
Short answer: Product structured data describes a product’s name, image, price, currency and availability in schema.org markup on the page. Google uses it for merchant listing experiences in Search, compares it with your Merchant Center data, and can use it for automatic item updates. Put it in the initial HTML and keep it identical to your feed and visible page.
Key Takeaways
- Merchant listing markup requires name, image and offers, with price (above zero) and priceCurrency.
- Use it only on pages where the shopper can buy the product, focused on one product or its variants.
- Put Product markup in the initial HTML; JavaScript-generated markup can make Shopping crawls less frequent and less reliable.
- Merchant Center compares feed prices with the page or structured data, and automatic item updates can use the markup.
- Google recommends declaring shipping and return policies once under Organization markup.
What merchant listing structured data is
Google Search Central’s merchant listing structured data documentation explains that Product markup can make pages eligible for merchant listing experiences: the shopping knowledge panel, Google Images, popular products and product snippets. These experiences can show price, availability, shipping and returns information.
This is separate from a Merchant Center feed, but closely related. A feed sends Google your product data directly. Structured data publishes the same facts on the page itself, where Googlebot reads them when it crawls.
Google also notes that it may show product content crawled from your store even without schema.org markup or Merchant Center. Structured data makes that information explicit rather than leaving Google to infer it.
Which pages should have it
Google limits merchant listing markup to:
- Pages where the shopper can purchase the product from you. Pages that link out to other sellers don’t qualify.
- Pages focused on a single product or its variants (not category pages).
- A distinct URL per currency if you sell in more than one.
This matches Merchant Center’s own rule that only product pages are eligible for free listings, so in practice the same pages need both.
Required and recommended properties
Google’s required properties are short. On Product: name, image and offers. The Offer must be from you as the seller and needs price (greater than zero) or priceSpecification.price, plus priceCurrency in ISO 4217 format (for example, USD).
| Level | Recommended properties |
|---|---|
| Product | aggregateRating, audience, brand.name, category, color, description, gtin (or gtin8, gtin12, gtin13, gtin14, isbn), hasCertification, inProductGroupWithID, isVariantOf, material, mpn, pattern, review, size, sku |
| Offer | availability (one value), hasMerchantReturnPolicy, itemCondition, priceValidUntil, shippingDetails, url, validFrom, validThrough |
- GTIN values must be numeric.
categorycan use a CategoryCode for the Google product category.- If
priceValidUntilis a past date, Google says the listing may not display. Check for stale dates left over from old sales. - Images must be crawlable and indexable. Google recommends multiple high-resolution images (at least 50K pixels when width and height are multiplied) in 16×9, 4×3 and 1×1 ratios.
Prices: active, strikethrough and member prices
Google’s documentation describes three kinds of price in merchant listing markup:
| Price type | How to mark it up |
|---|---|
| Active price | offers.price, or priceSpecification.price; if both are present for the active price, offers.price is used |
| Strikethrough price | A price specification with priceType StrikethroughPrice (ListPrice is also allowed during a transition period) |
| Member price | A price specification with validForMemberTier |
Specifications that contain both priceType and validForMemberTier are ignored. For sales, mark the duration with validFrom and validThrough or priceValidUntil, using ISO 8601 dates with a time zone.
On the feed side, sales use sale_price with sale_price_effective_date, and loyalty prices use loyalty_program rather than sale_price. See how to handle sale prices.
How structured data relates to your feed
Most feed attributes have a direct schema.org equivalent, and Google’s attribute documentation names them. Keeping each pair identical is the core of the job.
| Feed attribute | Schema.org property |
|---|---|
| id | Product.sku |
| title | Product.name |
| description | Product.description |
| image_link | Product.image |
| item_group_id | Product.inProductGroupWithID or ProductGroup.productGroupId |
| price | Offer price and priceCurrency |
| availability | Offer availability |
| condition | Offer itemCondition |
Price checks
Google says Googlebot crawls landing pages and compares the price in your data source with the price on the landing page or in structured data. A mismatch may disapprove the product, and repeated mismatches may lead to account suspension. Stale markup (for example, a theme that caches the old price in JSON-LD) can cause a mismatch even when the visible price is right.
Availability values
Google’s availability documentation maps schema.org values to feed values:
| Feed value | Schema.org values that map to it |
|---|---|
| in_stock | InStock, LimitedAvailability, OnlineOnly |
| out_of_stock | Discontinued, InStoreOnly, OutOfStock, SoldOut |
| preorder | PreOrder, PreSale |
| backorder | BackOrder |
Google requires availability to be consistent across the landing page, structured data, checkout and data source. See how to align website data and product feeds for a full matching process.
Structured data and automatic item updates
Google’s automatic item updates use landing page data, including structured data, to update price, sale_price, availability and condition in Merchant Center. They’re enabled by default, under Products > Automations, and map to the schema.org properties price, priceCurrency, availability and itemCondition.
- They’re not a replacement for regular data updates. Google designed them to fix sporadic problems on a small share of products.
- If prices change more than once a day, products may be disapproved instead, and Google may stop updates if there are too many mismatches. Google suggests the Merchant API for frequent changes.
- Price automation can also update strikethrough prices. If your pages show multiple strikethrough prices, Google says not to enable price automation.
- Availability matching is relaxed: in_stock, preorder and backorder are treated as compatible with in_stock.
- For condition, use “new”, “used” or “refurbished” in the title or description so Google can cross-check.
Accurate markup makes this safety net work. Wrong or stale markup can push wrong values into Merchant Center, which is why the markup and the feed should come from the same product record.
Put Product markup in the initial HTML
Google Search Central recommends putting Product structured data in the initial HTML. JavaScript-generated markup can make Shopping crawls less frequent and less reliable, which matters most for fast-changing data like price and availability.
Merchant Center documentation says the same about visible prices: Googlebot crawls the HTML returned by the server, and if the price is injected with JavaScript after load, this can trigger a mismatch error.
- View the page source (not the rendered DOM) and confirm the JSON-LD and the price are present.
- Watch for apps or tag managers that add Product markup client-side.
- Check variant pages: the markup should reflect the selected variant’s price and availability on that variant’s URL.
On WordPress and WooCommerce, check whether your theme, WooCommerce and an SEO plugin are each outputting Product markup; duplicates with different values are a practical risk. A quick check is to search the page source for each Product block (@type Product) and compare their values.
Shipping and returns at the Organization level
Google recommends declaring global return and shipping policies once under Organization markup, and using offer-level shippingDetails and hasMerchantReturnPolicy only to override them for specific products.
This mirrors how Merchant Center works: an account-level shipping or return policy covers all products, and labels (shipping_label, return_policy_label) handle exceptions. Google also notes that shipping and return policies can be set up in Search Console. Keep all of them consistent with your website. See shipping settings and return policies.
How to test your markup
- Run a product URL through the Rich Results Test and fix errors in required properties.
- Use URL Inspection in Search Console to see how Google fetched the page.
- Compare the markup values with the visible page and with the product in Merchant Center (price, currency, availability, condition, GTIN).
- Include product pages in your sitemap.
- Recheck after theme, app or plugin changes, since these often change markup output.
Practitioner tip: test a sample from each template type (simple product, variant product, sale item, out-of-stock item) rather than one page. Problems often only appear in one template.
When to get help
Structured data issues usually sit between the theme, the platform and the feed, which makes them hard to trace. Our e-commerce SEO service covers product markup, and the Merchant Center service covers the feed side. See also how to improve product visibility.
Frequently asked questions
Do I need structured data if I have a Merchant Center feed?
It isn’t required for the feed, but Google uses page data, including structured data, for price checks and automatic item updates, and markup can make pages eligible for merchant listing experiences in Search.
What properties are required for merchant listing structured data?
Product name, image and offers. The offer needs a price above zero (or priceSpecification.price) and priceCurrency in ISO 4217 format.
Can I add Product structured data with JavaScript?
Google recommends the initial HTML. JavaScript-generated markup can make Shopping crawls less frequent and less reliable for fast-changing price and availability.
Can structured data cause a price mismatch?
Yes. Google compares your feed price with the landing page or structured data, so stale or wrong markup can lead to a mismatch.
Where should shipping and return policies go in structured data?
Google recommends global policies under Organization markup, with offer-level shippingDetails or hasMerchantReturnPolicy only to override them.
What happens if priceValidUntil is in the past?
Google says the listing may not display. Remove or update old dates after a sale ends.
Need help with product markup?
We audit product structured data against your feed and visible pages, and fix the template issues that cause mismatches.
Sources
- Google Search Central — Merchant listing structured data
- Google Merchant Center Help — Automatic item updates
- Google Merchant Center Help — How to fix: Mismatched product price
- Google Merchant Center Help — Availability [availability]
- Google Merchant Center Help — Free listings for products
- Google Merchant Center Help — ID [id]
- Google Merchant Center Help — Title [title] and structured title
- Google Merchant Center Help — Description [description]
- Google Merchant Center Help — Image link [image_link]
- Google Merchant Center Help — Item group ID [item_group_id]
- Google Merchant Center Help — Sale price [sale_price]
- Google Merchant Center Help — Set up shipping settings for an entire account
Last reviewed October 10, 2026 against the official documentation listed above. Google changes Merchant Center features and policies regularly — always confirm details in your own account.
