ShipworkSite inspection
Structured data

Crawlability

PaginationAre paginated pages set up right?Internal searchIs site search eating crawl budget?URL parametersAre parameters creating duplicates?Log analyserWhat does Googlebot actually crawl?Robots builderNeed a robots.txt file?Soft 404sAre pages “not found” but returning 200?JavaScriptCan crawlers see it without running JS?FreshnessIs my site quietly going stale?Robots.txtDoes robots.txt say what I think?

Indexing

Sitemap lastmodAre my sitemap dates valid?SitemapIs my sitemap actually fetchable?IndexingIs Google allowed to index my pages?CanonicalsIs Google indexing the wrong URL?Index signalsDo sitemap and index signals agree?Sitemap generatorNeed a sitemap.xml for my site?Bulk URL statusWhere does each of these URLs really land?Redirect builderNeed the redirect rules?RedirectsAre my URLs answering directly, over HTTPS?

On-page

Keyword ideasWhat are people searching for?SERP previewHow does my page look in Google?Content qualityAre your pages too thin or too alike?Image weightAre images slowing the page?CannibalizationAre pages competing with each other?On-page checkDoes the page use its target phrase?ImagesAre my images accessible and loading?Meta tag builderWhat should my title and share tags say?DuplicatesDo my pages compete for one query?

Links

Orphan pagesWhich pages can no link reach?Link graphHow deep do your pages sit?Anchor textDo links say what they point at?Outbound linksAre external links still alive?Broken linksAre internal links sending visitors nowhere?

Structured data

Rich resultsIs my markup eligible for a rich result?Structured dataIs my product schema valid?Schema coverageDo my key pages carry structured data?Social previewHow does my page look when shared?Schema vs pageDoes markup match the page price?Schema builderNeed valid JSON-LD?

International

Hreflang sitemapDo page and sitemap hreflang agree?HreflangDo my language versions link back?Hreflang builderNeed the hreflang tags?Page DoctorWhy is this page not doing well?Redirect planMy site has dead links — what redirects do I write?Sitemap diffIs anything missing from my sitemap?Robots simulatorWhat does my robots.txt actually block?Can Googlebot?Can Googlebot fetch this URL?
Every error, explainedGuides
Pricing Learn Error guides Run free audit

+1 free check

Welcome to Shipwork

Sign in free and your next check this month is on us.

Continue with GoogleContinue with email

We email you a 6-digit code. No password.

No card needed. Reports and watches follow you to any device.

All errorsNo Product markup found

Why your product page has no Product schema, even on a modern theme

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.

nameimageProduct JSON-LD
The page has everything except machine-readable markup.

How to fix it

  1. View source on the live page — not the inspector, which shows the page after scripts have run — and search for application/ld+json.
  2. If a block is there but broken, validate the JSON. One trailing comma makes the whole block invisible.
  3. If the markup only appears in the inspector, it is injected client-side. Move it into the server-rendered template.
  4. 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

  1. 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.
  2. 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.
  3. 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.
  4. 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

  1. 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.
  2. Check the SEO plugin's schema settings and product template assignment. Confirm it is enabled for products and not limited to posts or pages.
  3. 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.
  4. 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

  1. 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.
  2. For Wix, BigCommerce, or Squarespace, check whether a theme, product app, or SEO integration already emits Product JSON-LD before adding custom markup.
  3. 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.
  4. 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

  1. Open a live product URL and inspect both raw source and rendered HTML. Confirm a valid Product or ProductGroup entity describes that exact product.
  2. 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.
  3. 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.
  4. Run the structured data check on representative product pages to find missing or malformed Product fields in the fetched HTML.
  5. 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?
Use the platform or SEO plugin's product schema output when it accurately describes the visible product. If you add JSON-LD yourself, place a valid Product entity on the product detail page and include an Offer for a product listing. Keep price, currency, availability, and URL consistent with the page and the data sent to Merchant Center.
Why does my product page have no schema even though my theme supports it?
A custom template, theme update, disabled plugin setting, or app conflict can remove or replace the schema. View the raw public page source and search for application/ld+json. If markup appears only after JavaScript, check the initial response too and prefer server-rendered Product data where possible.
Is ProductGroup valid structured data for product variants?
Yes. Google's product variant documentation supports ProductGroup with variants represented as Product entities through hasVariant. Check that the group and each variant have the required identifying properties and that offer details reflect the specific variant URL and selection. Validate the variant relationships with the current Rich Results Test.
Does valid Product schema guarantee rich results?
No. Structured data makes a page eligible for supported search features when it follows Google's technical and content guidelines. Google does not guarantee that a valid page will receive a rich result or merchant listing, and other eligibility or quality signals can affect display.
Should I add Product schema to a collection page?
Google's merchant listing experiences are intended for pages where a shopper can purchase a product, and Product rich results focus on a single product or its variants. A collection listing many unrelated products is not the right page for one combined Product entity; use product detail pages instead.
Find out if this is happening to you

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 found

Go deeper: Product schema, fully explained

See the check: Structured data, inspected

Other errors like this