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.

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).

LevelRecommended properties
ProductaggregateRating, audience, brand.name, category, color, description, gtin (or gtin8, gtin12, gtin13, gtin14, isbn), hasCertification, inProductGroupWithID, isVariantOf, material, mpn, pattern, review, size, sku
Offeravailability (one value), hasMerchantReturnPolicy, itemCondition, priceValidUntil, shippingDetails, url, validFrom, validThrough
  • GTIN values must be numeric.
  • category can use a CategoryCode for the Google product category.
  • If priceValidUntil is 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 typeHow to mark it up
Active priceoffers.price, or priceSpecification.price; if both are present for the active price, offers.price is used
Strikethrough priceA price specification with priceType StrikethroughPrice (ListPrice is also allowed during a transition period)
Member priceA 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 attributeSchema.org property
idProduct.sku
titleProduct.name
descriptionProduct.description
image_linkProduct.image
item_group_idProduct.inProductGroupWithID or ProductGroup.productGroupId
priceOffer price and priceCurrency
availabilityOffer availability
conditionOffer 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 valueSchema.org values that map to it
in_stockInStock, LimitedAvailability, OnlineOnly
out_of_stockDiscontinued, InStoreOnly, OutOfStock, SoldOut
preorderPreOrder, PreSale
backorderBackOrder

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

  1. Run a product URL through the Rich Results Test and fix errors in required properties.
  2. Use URL Inspection in Search Console to see how Google fetched the page.
  3. Compare the markup values with the visible page and with the product in Merchant Center (price, currency, availability, condition, GTIN).
  4. Include product pages in your sitemap.
  5. 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

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.

Similar Posts