Skip to content
WP Visibility

WooCommerce SEO guide

Check WooCommerce Product Schema Against the Actual Product Page

Compare a product's JSON-LD with the price, stock, identifiers, and reviews a shopper sees, find which plugin printed it, and validate it without expecting a guaranteed rich result.

Published

On this page

To check WooCommerce product schema, capture the HTML your server sends for one product, pull out every Product node in it, and compare each commercial field (price, currency, availability, identifiers, rating) with what a shopper sees on the same page. Then run a validator. A validator confirms syntax and required properties; only the side-by-side comparison tells you whether the markup is true.

Know what each check can prove

Three different questions get mixed together when people say “my schema is valid”:

Check Question it answers Tool
Syntax Is the JSON-LD parseable, with known types and properties? Schema Markup Validator
Google requirements Are the properties Google requires for a feature present? Rich Results Test
Accuracy Does each value match the visible page? Your own comparison

Google’s structured data guidelines, checked September 27, 2026, state that structured data “must be a true representation of the page content” and say: “Don’t mark up content that is not visible to readers of the page.” The same page says Google “does not guarantee that your structured data will show up in search results, even if your page is marked up correctly according to the Rich Results Test.”

For a page where customers can buy, Google’s merchant listing documentation, checked September 27, 2026, lists name, image, and offers with price and priceCurrency as required, and notes that merchant listing experiences “require a price greater than zero.” It recommends properties such as availability, itemCondition, priceValidUntil, shippingDetails, and hasMerchantReturnPolicy. The product structured data overview, checked the same day, explains that pages where people cannot buy directly use product snippets instead.

Three checks for product markup. Syntax: The JSON-LD parses with known types. Google requirements: Required properties for the feature exist. Accuracy: Every value matches the visible page.
Validators cover the first two checks. Only a side by side comparison with the page covers accuracy, and none of the three guarantees a rich result.

Capture the page and the product graph

Pick one simple (non-variable) product first. Variable products have their own guide: variable-product schema.

  1. Log out, or use a private window, so you see what a visitor and a crawler see.
  2. Save the server’s HTML, not the page after scripts run:
curl -sL https://garden.example/product/brass-hose-nozzle/ -o product.html
grep -o 'application/ld+json' product.html | wc -l
grep -oE '"@type": ?"Product(Group)?"' product.html

The URL is illustrative. The second command counts JSON-LD blocks; the third lists Product nodes. Markup that a script adds after the page loads will not appear in this capture. Google can read it, but its guide to JavaScript-generated structured data, checked September 27, 2026, warns that such Product markup “can make Shopping crawls less frequent and less reliable.” If the Rich Results Test later finds a Product item your capture lacks, a script probably added it.

Google’s Merchant Center help on mismatched product prices, checked September 27, 2026, says Googlebot compares the price in your Merchant Center data source with the prices on your landing page “or in your structured data markup (if implemented),” so if you use Merchant Center, the price in the markup has to match too, not only the price a shopper sees.

  1. Take a screenshot of the product page above the fold, with the price, stock message, and rating visible. Save it with the HTML and the date.
  2. Copy each JSON-LD block into a file of its own. Pretty-print it (any JSON formatter works) so fields are easy to compare.

If you find more than one Product node, identify each emitter before comparing values. Two sources that disagree make test results confusing. Look at the surrounding HTML comments, the position in the page, and the plugins you have active. Deactivating a suspected plugin on a staging copy and recapturing is the reliable way to confirm.

Compare each commercial field with visible facts

Build a table like this for the product. Fill in the middle column from the screenshot and the right column from the JSON-LD.

Field Visible page Structured data Match?
Product name Brass hose nozzle name
Price shown 24.00, including tax offers.price
Currency USD offers.priceCurrency
Stock message In stock offers.availability
Sale end date Sale ends October 31 offers.priceValidUntil
SKU GN-104 sku
Barcode Shown in the specifications tab gtin
Brand Garden Example Tools brand.name
Rating 4.5 from 12 reviews aggregateRating
Main image The product photo image

All values are illustrative. Mark each row as a match, a mismatch, or “present in markup, not visible.” The third result is the one Google’s guidelines rule out, so treat it as a defect even if every validator passes.

Common mismatches to look for:

  • Tax. WooCommerce has one setting for whether prices are entered inclusive or exclusive of tax and another for whether the shop displays them including or excluding tax, according to its tax setup documentation, checked September 27, 2026. When the two settings differ, a schema price taken from the stored value can differ from the shown price. The price mismatch guide traces this in detail.
  • Stale availability. The page says out of stock while the markup says in stock, for example because a cached page was captured before a stock change.
  • Ratings with no visible reviews. A rating in the markup should correspond to reviews a visitor can read.
  • Placeholder images. If a product has no image of its own, check whether the markup falls back to a logo or a default social image.

Know what WP Visibility 2.10.3 prints

If WP Visibility’s Schema and WooCommerce modules are on (both are on by default, and the WooCommerce module only loads when WooCommerce is active), WP Visibility removes WooCommerce’s own footer JSON-LD, its product markup included, and adds a Product node to its single schema graph in the page head instead. Checked against the 2.10.3 release, the fields come from WooCommerce as follows:

Property Source in WooCommerce Notes
name Product name
description Short description, else full description Tags removed, trimmed to about 300 characters
image Social image override, else product image, else the site’s default social image Check products without their own image
sku SKU Omitted when empty
gtin The GTIN, UPC, EAN, or ISBN field Omitted when empty
brand A pa_brand product attribute Developers can change it with the wpvis_woo_brand filter
offers.price The product’s active price as stored Not adjusted for tax display
offers.availability Stock status In stock, out of stock, or backorder
offers.priceValidUntil Scheduled sale end date Only when a sale end date is set
offers.itemCondition Fixed value Always NewCondition
aggregateRating Average rating and review count Only when the product allows reviews and at least one exists

It does not print shippingDetails or hasMerchantReturnPolicy, and a product with no numeric price gets no offer rather than an empty one. The barcode field arrived in WooCommerce 9.2, according to WooCommerce’s 9.2 release post, checked September 27, 2026, which states the field “is available both for main products and variations.”

If a value in the markup is wrong, fix it at the source the table names: the product’s price, stock status, attribute, image, or social image override. Editing SEO settings will not correct a wrong stock record.

Validate and document the responsible emitter

  1. Paste the product URL into the Rich Results Test. Note which items it detects and any errors or warnings.
  2. Paste the same URL into the Schema Markup Validator for a full syntax view, including non-Google properties.
  3. In Search Console, use the URL Inspection tool for the product URL to see whether Google can fetch the page; Google’s structured data guidelines name the Rich Results Test and the URL Inspection tool for testing technical compliance.
  4. Write a short record for the product: date, product URL, active theme and plugin versions, number of Product nodes found, which plugin printed each, the comparison table, and validator results.

A warning about a missing recommended property is not the same as an error. Decide from the table whether the missing value exists on your page. If your store does not show shipping costs on the product page, that page has no visible shipping value for shippingDetails to describe.

Repeat the capture after a WooCommerce, theme, or SEO plugin update, and after any change to tax settings. Keep the earlier record so you can see what changed.

Checklist

  • Server HTML saved, with a screenshot and date.
  • Exactly one Product node, or every extra emitter identified.
  • Every commercial field compared with the visible page.
  • No marked-up value that a visitor cannot see.
  • Rich Results Test and Schema Markup Validator results recorded.
  • Wrong values corrected at their source, then recaptured.

Read next

WordPress SEO with your own assistant.

WP Visibility is $99 a year for unlimited sites, client sites included, with a 30-day refund. Use its SEO tools in WordPress or connect a supported assistant. Read how proposal review and permissions work.