Product Schema Markup: How to Add It to Your Store

Add product schema markup so Google and AI tools read your price, stock and reviews correctly. Includes Shopify product schema checks and common fixes.

To add product schema, use your store’s product template or schema extension to output structured product data, then test a product URL in Google’s Rich Results Test. Start by inspecting the markup your theme already generates. Adding a second block can leave Google with conflicting prices or stock information.

You’ll need access to your product records and permission to edit the theme or extension settings. Keep a copy of the existing configuration before changing it. For URL testing, choose a published product page that Google can reach without signing in.

What Product Schema Does

Product schema labels product information so software can distinguish a product’s name from its price or availability. A common format is JavaScript Object Notation for Linked Data (JSON-LD), embedded in the page’s HTML.

Google uses eligible product markup for richer search results, including prices and stock status. Valid markup doesn’t guarantee that Google will display those details. Google’s product structured data guide explains the supported search features.

Structured data also makes product facts explicit for software that reads it. Google says its AI search features require no special schema. Keep useful product information visible on the page as well as in the markup.

The Properties That Matter

A product page’s markup needs to identify the item and describe the offer customers can buy. Use the following fields to inspect your existing output.

PropertyWhat to supplyWhat to check
nameThe product’s nameIt identifies the item shown on the page.
imageA product image URLThe image loads publicly and shows that item.
offers.priceThe active selling priceIt matches the selected variant’s displayed price.
offers.priceCurrencyThe currency code, such as AUDIt matches the currency customers see.
offers.availabilityA supported stock value, such as https://schema.org/InStockIt reflects the item customers can order.
gtin13 or another applicable GTIN propertyThe assigned Global Trade Item Number (GTIN)It identifies the exact item or variant.
brand.nameThe product’s brandIt is the actual brand, not automatically your store name.
aggregateRating and reviewProduct ratings and individual reviewsThey describe genuine reviews visible on that product page.

Keep your internal stock keeping unit (SKU) separate from the manufacturer’s GTIN. Use the guide to product identifiers when choosing the correct number. Don’t invent an identifier for an item that has none.

Review schema uses aggregateRating for the combined rating and Review for an individual review. The combined rating needs its rating value and rating or review count. An individual review identifies its author and rating.

Customer ratings must come from genuine product experiences and appear on the page. Don’t copy ratings from another website or insert a five-star value when a product has no reviews. Google’s review guidelines explain these restrictions.

Merchant Listing Markup

Merchant listing markup applies to pages where customers can buy the product from your store. Google requires a product name and image, plus a nested Offer with an active positive price and currency. An AggregateOffer alone doesn’t meet merchant listing requirements.

Product snippets also suit editorial review pages where the reader can’t buy directly. Their requirements differ: a name plus at least one of offers, review or aggregateRating. A store’s eligible merchant markup can also support product snippets.

Shipping information uses shippingDetails under the offer. It describes the destination, shipping cost and delivery time through an OfferShippingDetails object. Use AU for an Australian destination and AUD for Australian-dollar shipping charges.

Returns use hasMerchantReturnPolicy with a MerchantReturnPolicy object. Supply the applicable country and policy category. A finite return window also needs merchantReturnDays.

Google recommends organisation-level policies for standard store-wide shipping and returns. Product-level policies handle exceptions, such as an item with different delivery arrangements. Follow the merchant listing property definitions before adding these nested objects.

Shopify Product Schema

Shopify themes can generate product schema from the product record using the structured_data Liquid filter. Shopify documents output as Product or ProductGroup, depending on variants. The installed theme and any apps decide what your page actually contains.

Follow this order when checking Shopify product schema.

  1. Open a published product page and view its source. Search for application/ld+json, then find the product or product-group block.
  2. Compare the generated offer with the product’s selected variant. Check its price and currency, then its availability and identifier.
  3. Identify the theme or app that generates each product block. Choose one owner for the main product markup so changes don’t create conflicting copies.
  4. Correct missing product data in Shopify first. If the theme lacks product markup, have the theme developer add Shopify’s native filter inside an application/ld+json script element in the product template.
  5. Add supported review or policy fields through the component that owns that data. Run the URL test described below before applying the change across every product.

Common gaps to inspect are missing variant identifiers, review-app ratings that never reach the product markup and shipping policies absent from the generated offer. A theme’s valid base markup doesn’t confirm that a separate review app has supplied eligible ratings.

WooCommerce and Other Platforms

WooCommerce generates product structured data automatically, so inspect its output before installing another schema plugin. A schema extension or developer filter can add missing fields to the existing product data.

Variable products need particular attention. WooCommerce’s Google Product Feed documentation describes aggregated core output and an expanded option that adds variation-specific records. The expanded option is experimental. Contact the extension’s support team about a variant mismatch before enabling it, and activate it only on their recommendation. Test a variant URL after changing the setting.

BigCommerce’s Cornerstone theme includes a product schema template. Inspect the output from your installed theme, since customised storefronts can change it. A theme developer can update that template, or a schema app can own the output. Check for an existing product block before enabling app-generated markup.

For a custom storefront, generate JSON-LD from the same product records that render the page. Treat catalogue data as the input, rather than typing a separate copy of every price into the template.

Testing and Fixing Errors

Google’s Rich Results Test shows whether a product URL contains supported markup and which items have errors or warnings. Test one product before extending a template change to the rest of the store.

  1. Open Google’s Rich Results Test. Choose URL and enter the full published product URL.
  2. Run the test with the default smartphone crawler. Resolve a failed fetch before inspecting schema fields.
  3. Expand Merchant listings and Product snippets when both appear. Open each detected item and select an issue to locate it in the rendered source.
  4. Fix parsing errors first. Then correct missing required properties, followed by recommended-property warnings that apply to your product.
  5. Retest the same URL. Confirm the product name and offer match the visible page, with no invalid product items.

A warning about missing reviews doesn’t justify inventing reviews. Google can warn when an offer has no review or aggregateRating, even though the product snippet meets its required fields. Leave those properties absent until genuine reviews exist.

Use this order for common corrections.

Test resultDiagnostic checkCorrection
No product item detectedDoes the rendered source contain product markup?Restore output in the product template or its schema extension.
JSON parsing errorWhich character or field does the tool identify?Correct syntax in the generator, then rerun the test.
Missing price or currencyDoes the selected variant have an offer?Populate the offer from that variant’s selling data.
Missing shipping or returns detailsDoes the store have applicable policies?Add complete supported policy objects through their schema owner.
Valid item with wrong stockDoes the output use an old cached record?Refresh the data or cache that generated the stale offer.

In Search Console, look under Shopping for the Merchant listings or Product snippets report available for your site. Open an issue and inspect an affected URL. After fixing the shared cause across affected pages, use Validate fix to request validation. Reports reflect Google’s crawled data, so a live test can show a correction before the report changes. Google’s report guide explains valid and invalid items.

Keeping Schema in Sync With the Feed

Schema, visible product information and feed data must describe the same item on the same selling terms. A matching product name alone won’t resolve a price mismatch between two variants.

For a hypothetical navy jacket, compare the navy variant’s landing URL with its feed row and generated offer. All must use that variant’s identifier and active price. If the navy variant sells out while black remains available, its markup must reflect the navy stock state.

Make the catalogue record the source for page rendering and schema generation. Update the feed through the same product-change process, with cache refreshes included. Review the guide to improving your product feed for the broader feed workflow.

After a price or stock change, inspect the affected variant’s page and feed row, then rerun the URL test. Finish when the visible offer, generated markup and exported record agree.