What the error means
The page carries no Product JSON-LD that a parser can read, so search engines and assistants have no structured price, availability or name to work from.
Why Google rejects it
Most themes ship Product markup. It disappears for three reasons: a custom product template that dropped the schema snippet, an app that rewrote the head, or markup emitted only after JavaScript runs — which a crawler fetching raw HTML never sees. A fourth case looks identical but is not: the theme emits ProductGroup with the real products nested under hasVariant, which naïve validators report as missing.
How to fix it
- View source on the live page — not the inspector, which shows the page after scripts have run — and search for application/ld+json.
- If a block is there but broken, validate the JSON. One trailing comma makes the whole block invisible.
- If the markup only appears in the inspector, it is injected client-side. Move it into the server-rendered template.
- If you see ProductGroup, that is valid — check that each entry under hasVariant carries its own offer.
Common causes
Custom product template dropped the schema
A theme update or custom product template may omit the snippet that emits JSON-LD. The page still looks complete to shoppers, but crawlers see no machine-readable Product entity in the initial HTML. Compare a working product template with the affected one and search the live source for application/ld+json.
Markup only appears after JavaScript runs
An app can inject Product data after the browser executes scripts. Google can render JavaScript, but Google's product documentation recommends putting Product structured data in the initial HTML because dynamically generated markup can make Shopping crawls less frequent and reliable. Check View Source as well as the rendered DOM to identify this pattern.
JSON-LD is invalid or truncated
A missing brace, invalid escape, or trailing comma can make a whole JSON-LD block unparsable. Search for the script element, then test the JSON itself and the page with a rich result testing tool. If the script contains several graph entities, validate the entire block rather than only the Product object.
Markup is nested as product variants
A variant-focused page may use ProductGroup with Product entities nested through hasVariant, rather than one flat Product object. A simple checker that searches only for a top-level Product can miss valid variant modeling. Confirm the page and markup describe the same product or variant, and inspect each variant's offer.
Markup app emits the wrong entity or URL
A review app, theme, or SEO plugin may output Organization, WebPage, or Offer without a connected Product node. It may also attach markup to a collection page rather than the single-product page. Inspect @type, offers, URL, and product name in the graph, then remove duplicate or contradictory emitters.
Fix it on your platform
On Shopify
- Open a public product URL and use View Page Source, then search for application/ld+json and Product. Inspect a representative product from each custom template, not only the default product page.
- In Online Store > Themes > Edit code, inspect the published product template and snippets that render structured data. Common theme implementations use Liquid snippets; avoid adding a second Product block before you know what the theme already emits.
- Review product SEO or review apps that add JSON-LD. If two apps emit overlapping Product entities with different price, availability, or URL values, choose one source and remove the duplicate output.
- For products with variants, check whether the theme outputs ProductGroup and hasVariant. Make sure variant URLs and offers correspond to the selected variant rather than adding a flat object with generic data.
On WooCommerce
- Inspect source on a published product page and identify which component emits Product JSON-LD: the active SEO plugin, WooCommerce, the theme, or a schema extension.
- Check the SEO plugin's schema settings and product template assignment. Confirm it is enabled for products and not limited to posts or pages.
- Look for duplicated schema from both the theme and a plugin. Disable one emitter through its setting or supported hook, then test that the remaining entity has the correct product URL and offer.
- If the product page uses custom fields or variable products, verify the chosen variant has a matching offer, price, currency, and availability in the rendered markup.
On other platforms
- Use the platform's product SEO or structured data settings to confirm schema is enabled for product detail pages, not only category pages. Preview and publish the change before testing the public URL.
- For Wix, BigCommerce, or Squarespace, check whether a theme, product app, or SEO integration already emits Product JSON-LD before adding custom markup.
- On a custom site, render JSON-LD in the initial HTML response and use Product markup on pages focused on one product or its variants. Ensure every referenced property matches visible page content.
- If the storefront is headless, inspect the actual deployed product route and its server response. Testing the CMS preview does not confirm the public crawler response includes the markup.
How to confirm it is fixed
- Open a live product URL and inspect both raw source and rendered HTML. Confirm a valid Product or ProductGroup entity describes that exact product.
- Run Google's Rich Results Test and review its detected items and errors. A valid result does not guarantee a search feature will appear; eligibility depends on Google's guidelines and systems.
- In Search Console, check the Merchant listings report for purchasable product pages and the Product snippets report where relevant. Allow time for recrawling after deployment.
- Run the structured data check on representative product pages to find missing or malformed Product fields in the fetched HTML.
- Check a variable product at more than one variant URL or selection. Confirm the displayed price and availability match the selected offer.
A worked example
Hypothetical case: a WooCommerce store switches to a custom block theme. Product pages still show images, prices, and working add-to-cart controls, but Search Console's Merchant listings report begins flagging missing Product data. The active SEO plugin is configured only for posts, while the old theme's schema output disappeared with the theme switch. The owner enables product schema in the plugin, checks that its Product entity contains an Offer, and removes a legacy snippet that was outputting a second incomplete entity. They test two simple products and a variable product in Rich Results Test, then monitor the report after recrawling.
Questions
How do I add Product schema to my product page?
Why does my product page have no schema even though my theme supports it?
Is ProductGroup valid structured data for product variants?
Does valid Product schema guarantee rich results?
Should I add Product schema to a collection page?
Shipwork fetches the raw HTML, parses every JSON-LD block including nested ProductGroup and hasVariant, and names each missing field. Free, no account, no signup. Paste your store address.
Check my store for No Product markup foundGo deeper: Product schema, fully explained
See the check: Structured data, inspected
Other errors like this