ShipworkSite inspection
Schema vs page

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.

Does your markup match what the page shows?

Google compares your structured data to the page. When the Offer price disagrees with the price element, it can be treated as misleading and the product disapproved, and nothing on the page looks wrong.

Compares the Offer price in your JSON-LD with the price element on a set of product pages. Saved to your account if you are signed in to a paid plan.

How this check works

Shipwork reads a set of your product pages, extracts the price from the Product or ProductGroup JSON-LD, and compares it with the machine-readable price element on the page. It reports a mismatch, a price that is only in the markup, or a price element with no matching Offer.

What the schema vs page check compares

For each product page in the sample, the check reads two machine-readable prices. The first is the price in the page's structured data, taken from the Offer, including the low price when a single price is absent. The second is the price in the page's price element, the value marked with the itemprop price attribute. It compares only those two numbers, never a loose text scan.

When both are present and differ by more than a small rounding tolerance, the check reports a mismatch. It also notes when a price exists in one place but not the other. The free run reads up to 20 pages. It does not compare a price to a merchant feed, and it does not judge whether a price is correct.

How to read a price-match result

An error means the structured-data price and the visible price element disagree. Because a search engine compares markup with the page, a disagreement is a documented misrepresentation and can lead to disapproval, not just a warning. An info finding is softer: the price lives only in the markup or only in the price element, so one side lacks a value to check against.

A clean result means the two machine-readable values matched on every product page checked. It does not prove that a shopper sees the same number in the layout, that a variant price is handled, or that the price is current. It compares the two values a machine can read, which is exactly what is verified.

Why markup and page must agree

A page states a price in its structured data so a search engine can show it, and states a price in its visible content for the shopper. If the two differ, the page is saying two things at once. A cached markup value, a hardcoded schema price or a theme that rounds differently will drift from the product record and produce exactly this mismatch.

The failure is common on stores that update prices often or run promotions. A sale price in the layout with an old price in the markup is the classic case. It matters because the check is automated and runs before a person reads the page, so a mismatch can trigger a rejection with no warning.

Make both prices come from one field

The reliable fix is to render the visible price and the structured-data price from the same product field, so they cannot disagree. In the Offer, set "price" and "priceCurrency" from that field, and make sure the visible element carries the same number. Do not hardcode a promotional value in the markup.

If a sale price changes often, render it dynamically rather than editing the JSON-LD by hand. On Shopify and WooCommerce, edit the theme or app that emits the markup so both values update together. The guide price mismatch covers the fix, and misrepresentation in a merchant account explains the consequence.

When to use related checks

Use price check when the question is whether a price exists at all, and schema coverage when a page may have no product markup. Use structured data check to inspect one page's full product markup and its required fields.

If a rich product result is not appearing, rich results check shows which required properties are missing, and product page check reviews the page's catalogue signals together. This check is the price comparison; the others cover presence and completeness.

Questions

Why does a price mismatch matter?
Google verifies the markup against the landing page. A price that disagrees is a documented misrepresentation cause, and it can trigger a preemptive disapproval rather than a simple warning.
What does the check compare?
The Offer price in your JSON-LD against the price element (itemprop="price") on the page. It only compares machine-readable values, so it does not guess from a text scan.
I update prices often: how do I keep them in sync?
The theme should render both from the same product field. If the markup is hardcoded or cached it drifts; the watch re-checks daily and flags the day it changes.
How do I check if my structured-data price matches the page?
Run this check on your store. For each product page it reads the Offer price in the structured data and the price element on the page, then reports when the two differ by more than a small rounding tolerance. It also notes when a price appears in only one of the two places.
What exactly does the check compare?
The Offer price in your JSON-LD against the price element marked with the itemprop price attribute. It reads only machine-readable values, so it does not guess a price from surrounding text. That keeps it from flagging a page where a number happens to appear in body copy.
Does it compare my merchant feed price?
No. The feed you send to a merchant platform is not public and is not read here. The check compares the two prices on your own page: the one in the markup and the one in the price element. A feed that carries a third value is a separate mismatch this check cannot see.
I update prices often, how do I keep them in sync?
Render both prices from the same product field so one edit updates both. A theme that caches or hardcodes the markup will drift as the product price changes. If promotions change the price often, pull the value dynamically instead of editing the structured data by hand, then re-run the check.

Keep reading

What this reads

  • Reads public pages from outside your network, the way a crawler does.
  • No signup, and nothing is stored on the free checks.
  • One of 83 checks across discovery, content, markup, trust and catalogue data.
83checks
0signups needed
0stored on free checks
Cool, just ran an audit and got some insights! Let’s see if I can fix them :)
Tenta Dev, @DevTenta
Whoah! this site is crazy, nothing to roast at all
Ainreek, @AinreekAI
cool as heck, tried it on my blog and the insights it gave are helpful and not bluff.
Refaat 🍉 (Mouse), @1Mouse__