Merchant field guide · 02
Shopify Product JSON-LD: what to check and why
Product structured data should describe the offer a shopper can actually see. Use this checklist to find missing fields, contradictory variants, and stale prices—without mistaking valid syntax for guaranteed search or shopping visibility.
Set the boundary
Markup is a description, not a distribution channel.
JSON-LD is a machine-readable representation embedded in a web page. Accurate Product, ProductGroup, and Offer entities can help systems interpret the item, its variants, and its current commercial facts.
On Shopify, this public-page markup is separate from Shopify Catalog, which is the primary product-data route for Shopify's agentic storefronts. Passing a structured-data test does not establish Catalog access, channel eligibility, indexing, ranking, rich-result display, or an AI recommendation.
Inspect what the live product page renders
Start with the live URL, not a theme setting or an app dashboard. Open the rendered page source and search for scripts with type="application/ld+json". Find the entity whose @type is Product orProductGroup.
Shopify's Liquid structured_data filter can generate a Product for an item without variants and a ProductGroup for an item with variants. Themes and apps can also output markup. If more than one system describes the same product, compare the entities for contradictory prices, availability, identifiers, or URLs before adding another schema block.
Sample more than the bestseller
- A simple, in-stock product at its regular price.
- A multi-variant product with different availability.
- An out-of-stock, preorder, or discontinued product.
- A sale item and a product in each alternate template.
- A localized market URL when the displayed currency or offer changes by market.
Match product identity to the visible page
For Google's current merchant-listing eligibility, the core Product structure includes a name and image plus a nested Offer with the active price and matching currency. Other consumers and result types have their own requirements, so always use the current documentation for the experience you target.
nameIt should identify the same item as the page heading. Avoid stuffing query variants into a hidden markup-only title.
descriptionKeep material facts and limitations consistent with the visible description. Structured data is not a place for claims a shopper cannot verify on the page.
imageUse images that represent the item or selected variant. Confirm the URLs load without authentication and are not a logo, placeholder, or unrelated lifestyle shot alone.
brandDo not substitute a store name when the product has a different brand, and do not invent a brand to silence a warning.
sku / gtinA SKU is merchant-specific. A GTIN should be a genuine assigned global identifier for that exact item or variant—never a generated placeholder.
Requirements differ between product snippets, merchant listings, and other consumers of Schema.org. Treat this as an accuracy checklist, then validate against the current requirements for the experience you want.
Make every Offer agree with the buy box
Offer data changes faster than most product copy. Compare the markup against the page after market selection, variant selection, discounts, and inventory changes.
price
Use the current active price as a number, with a decimal point where needed and without a currency symbol. Do not leave a former sale price active in the markup.
priceCurrency
Use the matching three-letter ISO 4217 currency code, such as USD or EUR. A correct number paired with the wrong currency is still incorrect offer data.
availability
Choose the closest Schema.org status, such as InStock, OutOfStock, BackOrder, PreOrder, or Discontinued. It must follow the selectable variant rather than a stale default.
url
Point to the purchasable product or variant state. If a variant has a stable URL, use it consistently so the offer can be resolved to what the shopper sees.
$39.00 USD, blue / medium selected, in stock, and the same active offer represented in JSON-LD.
€39.00 on the page, USD in JSON-LD, or an InStock offer for the selected variant that cannot be purchased.
For pages offered in multiple currencies, follow the target consumer's current URL and currency guidance. Google currently recommends a distinct URL per currency for product rich results. Do not assume client-side currency conversion updates the JSON-LD correctly.
Represent variants as related offers, not one blurred item
When color, size, material, or another option changes what can be bought, the structured data should preserve that relationship. Google's current variant guidance uses a ProductGroup with productGroupID, variesBy, and hasVariant, or variant Products that point back through isVariantOf.
- Give the group a stable identity and list the properties that actually vary, such as color or size.
- Give each represented variant its own relevant image, identifier, option values, and Offer state.
- Keep variant URLs distinct and resolvable when the storefront supports stable variant selection in the URL.
- Confirm unavailable variants are not summarized as a single blanket InStock offer.
Do not hand-build ProductGroup markup merely to make the graph look larger. First inspect the current theme output and the official requirements. A smaller accurate graph is more useful than duplicated or contradictory entities.
Run a truth test, then a syntax test
- Truth: compare name, selected variant, image, price, currency, availability, and identifiers with what a shopper can see and buy.
- Structure: confirm each Offer belongs to the correct Product or variant and that URLs resolve as expected.
- Syntax: run the live URL through Google's Rich Results Test and review errors separately from optional recommendations.
- Coverage: repeat across alternate product templates and important inventory states, not every SKU blindly.
- Monitoring: watch Search Console and retest after theme, pricing, localization, review, or schema-app changes.
Primary sources
Validate against the current rules
Schema support and search presentation change. Use the official documentation for the result type you are targeting before editing a production theme.
Broader catalog coverage
Find product-data gaps across more than one public sample.
AgentSight Free audits the 25 most recent products using authorized Shopify data and labels the coverage it inspected.