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.

Is your structured data actually valid?

Structured data is how Google and AI assistants read a product page. A theme update or a custom template can strip it without anything visibly breaking, and you find out weeks later when listings vanish.

On a store it fetches a real product page and parses its JSON-LD, including ProductGroup markup where variants carry the offer. On any other site it reads your own pages and reports the JSON-LD that is there. Nothing is stored.

How this check works

Shipwork fetches pages from outside your network and parses every JSON-LD block. On a Shopify store it goes further, reading the real product page and reporting missing fields: name, image, price, priceCurrency, availability, shippingDetails and hasMerchantReturnPolicy, including ProductGroup markup with nested hasVariant offers that simpler checkers miss. On any other site it reports the types present and the ones a page of that kind should carry.

What the structured data check reads

Shipwork fetches public pages and parses their JSON-LD blocks. On a Shopify store it reads a real product page and checks Product or ProductGroup markup, including variants nested under hasVariant. It checks whether expected product fields are present: name, image, description, offer, price, currency, availability and brand, plus shipping details and return policy on offers. On other sites it reports the structured data types it finds and whether expected types are present for the page kind.

The check reads raw HTML returned by the public page. It does not promise that Google has indexed the markup or that a result will be eligible for a particular rich feature. Eligibility depends on the current search feature requirements and other signals, and Google may choose not to show enhanced results even when structured data is valid.

  • Whether JSON-LD is present and valid JSON.
  • Product/ProductGroup types, including nested variant objects.
  • Presence of relevant name, image, description, offer, price, currency, availability and brand data.
  • Offer shippingDetails and hasMerchantReturnPolicy fields.

How to read schema findings

An invalid JSON-LD block cannot be parsed as structured data. A missing Product or ProductGroup on a product page means the check did not find the product type it expects. Missing offer, price or currency is a core completeness problem; missing availability, brand, shipping or return details can limit how much useful listing information is available. Read the finding’s page URL and message before editing: the issue may be on one template or product rather than the whole store.

ProductGroup is not an error simply because variants exist. Shopify themes may put Product objects under hasVariant, with offer data on a variant. Shipwork traverses nested data and reads fields from variants when needed. If another validator reports no Product while this check sees ProductGroup, compare what each tool expects before replacing valid variant markup.

  • Fix JSON syntax errors first, because parsers ignore invalid blocks.
  • Check the named product page’s rendered HTML and identify which app or template emits the block.
  • Compare markup values with the price, inventory and product facts customers actually see.

Fix missing or invalid Product JSON-LD

Edit the theme or the app that owns the product markup; avoid adding a second competing Product block without first checking what already renders. Keep the structured data synchronized with the visible product page. For example, do not publish a price in JSON-LD that differs from the price the customer can select. Use valid JSON with quoted keys and strings, and make sure the block is inside a script element with the JSON-LD type.

  • A minimal shape is <script type="application/ld+json">{"@context":"https://schema.org","@type":"Product","name":"Blue shirt","image":["https://example.com/blue-shirt.jpg"],"offers":{"@type":"Offer","price":"29.00","priceCurrency":"USD","availability":"https://schema.org/InStock"}}</script>.
  • Use the correct currency and current availability; do not copy this example’s values unless they describe the actual product.
  • On a variant product, confirm each selectable variant’s own price and availability are represented consistently.
  • After updating the source, rerun the check and inspect the affected page’s returned HTML.

Use schema checks alongside product checks

Structured data describes page content in a machine-readable format. It is separate from a Merchant Center product feed and separate from whether Google can fetch the URL. A complete JSON-LD block cannot repair a broken destination or make inaccurate product data correct. Likewise, a clean feed report does not establish that the page emits valid schema.

Use this checker after theme updates, when rich results disappear, or when a product template has been customized. Then compare with Google’s current structured data documentation and Search Console enhancement reports for feature-specific validation. Those reports reflect Google’s processing; this tool only checks the markup and fields it fetches.

Errors this check finds, and their fixes

Questions

What is product structured data?
JSON-LD markup on your product page that names the product, price, currency, availability, image and shipping/returns. Google and AI assistants read it to build listings.
Why does markup disappear after a theme update?
Custom templates often drop the schema snippet, apps rewrite the head, or markup is injected by JavaScript that crawlers never run. Shipwork reads raw HTML the way a crawler does.
What is ProductGroup vs Product?
Modern Shopify themes emit ProductGroup with each variant nested under hasVariant. That is valid, but naive validators report it as missing. Shipwork parses both.
How do I check if my product schema is valid?
Fetch the public product page, inspect its JSON-LD, and validate both JSON syntax and the fields required for the structured data type. Shipwork checks JSON-LD on public pages and, for Shopify products, examines Product and ProductGroup markup with nested variants. Use Google’s current structured data documentation or validation tools for feature-specific eligibility; valid markup does not guarantee a rich result.
What is the difference between Product and ProductGroup schema?
Product describes one product. ProductGroup can describe a family of related variants, with individual Product objects nested under hasVariant. A variant may carry details such as its own offer. A checker that only inspects the top level can miss valid nested data, so inspect the full JSON-LD structure before changing a theme that uses ProductGroup.
Why is my product not showing rich results when schema is valid?
Valid structured data is only one eligibility condition. Google may choose not to display a rich result, may not have processed the latest page, or may find that other eligibility requirements are unmet. Confirm the page is crawlable, values match visible content, and Search Console reports no current enhancement issue. Search appearance is not guaranteed by adding JSON-LD.
Does product schema need a price and availability?
An Offer commonly describes price, price currency and availability for an item being sold. The exact required and recommended properties depend on the search feature and current documentation. Keep the values accurate and synchronized with the visible offer, including variant-specific values where relevant. This checker flags missing fields it expects, but its result is not a substitute for Google’s feature-specific requirements.
Can Shopify ProductGroup schema include variants?
Yes. ProductGroup can contain variant products under hasVariant, and offer details may be on those nested variants rather than on the group itself. A validator that only reads the outer object can report missing data incorrectly. Inspect the entire JSON-LD block and make sure each variant’s name, image and offer information matches what shoppers can select.