SEO · AEO · TECHNICAL · 27 JANUARY 2026 · 7 MIN READ
Schema markup audit: what is on your site and what is wrong
Most stores emit structured data from three places at once and have never read any of it. The audit starts with an inventory of what is producing markup, not with a validator.
Audit structured data in four passes, in this order. First, inventory what is emitting it — a Shopify theme, an SEO app and a reviews app will all inject their own JSON-LD, and the usual finding is two or three copies of Product on the same page. Second, validate: the Rich Results Test tells you what Google can use, the Schema Markup Validator tells you whether the markup is valid at all, and they disagree by design. Third, compare the markup against what the page visibly says, because Google's policy is that you must not "mark up content that is not visible to readers of the page" and no validator can check that. Fourth, decide what is worth keeping — several types people still install apps for no longer produce a rich result in Google at all.
IN SHORT
- The most common ecommerce structured data fault is duplication: a theme, an SEO app and a reviews app each emitting their own `Product` block on the same URL.
- The Rich Results Test and the Schema Markup Validator answer different questions — one checks Google feature eligibility, the other checks schema.org validity — so a clean result in one says nothing about the other.
- Google removed the How-to rich result in September 2023 and it is "no longer shown in search results, on both desktop and mobile devices"; FAQ rich results are restricted to "well-known, authoritative government and health websites".
- Merchant listing `Product` markup requires only `name`, `image`, `offers`, a price and a currency — most of the value is in the recommended properties, especially `gtin`, `sku`, `brand.name` and the variant properties.
- Google recommends shipping and return policies be published once under `Organization` markup rather than repeated on every `Offer`.
- A structured data manual action costs you rich result eligibility and nothing else: "it doesn't affect how the page ranks in Google web search."
- Markup that disagrees with the visible page is a policy breach that validates perfectly, which is why the audit cannot be run entirely by tooling.
Inventory the emitters before you validate anything
Almost every schema audit starts in the wrong place: someone pastes a product URL into a validator, reads a list of warnings, and starts fixing them. That finds property-level faults and misses the structural one, which on a Shopify store is nearly always the same. Something is emitting a second copy of the same entity.
Work out what is producing markup before you read any of it. On a typical store, the candidates are the theme (product, collection, breadcrumb and organisation markup written into the Liquid templates), an SEO app that offers "one-click structured data", a reviews app that adds aggregateRating and review, and occasionally a third-party search or merchandising app that renders its own product cards. Each is doing a reasonable thing in isolation. Together, they publish two or three answers to the question "what is this page about", and you do not control which one is believed.
The mechanical version of the check: fetch the rendered HTML of one product page, one collection page, one blog post and the home page, and count the application/ld+json blocks. Then read each one far enough to identify its @type and where it came from. Half an hour of this is worth more than any report, because it tells you which switch to turn off — and turning one off is almost always the fix, rather than reconciling two sources of truth.
Two tools, two different questions
Both are free, both are worth running, and treating them as interchangeable is how audits reach a false conclusion.
The Rich Results Test answers "can Google use this for a feature it supports?" It only knows about the types Google has a search feature for, so valid, useful markup can produce the message that no rich results were detected. That is not an error.
The Schema Markup Validator answers "is this valid schema.org?" It does not care whether Google has a feature for it, which makes it the right tool for anything you are publishing for extraction rather than for a rich result — and for machine readers that are not Google at all.
Search Console is the third input and the only one that reports at site scale rather than per URL. Its enhancement reports are the place a fault that affects four thousand pages becomes visible; a spot check on one URL will never find the one template variant that is broken.
What actually has to be there on a product page
Google's merchant listing documentation is short on requirements and long on recommendations, which is the opposite of how most stores treat it. The required properties are name, image, offers, and within the offer either offers.price or offers.priceSpecification.price plus offers.priceCurrency or offers.priceSpecification.priceCurrency. That is the whole list.
The recommended set is where the work is, and it is the part that a theme rarely fills in: aggregateRating, brand.name, category, color, description, gtin (or gtin8/gtin12/gtin13/gtin14/isbn), material, mpn, pattern, review, size, sku, audience, hasCertification, and the two that matter most for stores with variants — isVariantOf and inProductGroupWithID.
Two practical readings of that list. First, identifiers are the highest-value gap: gtin, mpn and sku are the properties that let a machine reconcile your product with the same product elsewhere, and they are usually already in Shopify as barcode and SKU fields, unmapped. Second, if you sell variants, the variant properties decide whether Google sees one product or forty unrelated ones. Most themes emit a single Product for the default variant and stop.
On shipping and returns, Google's own guidance is to publish the policy once rather than everywhere: provide "a global shipping policy for your business under Organization markup instead", and override it on an individual Offer only where a specific product genuinely differs. Stores that inject a shipping policy into every product page have taken on maintenance they were not asked for.
The types that no longer buy what people think they buy
This is the part of the audit that saves money, because it removes work rather than adding it.
How-to markup does not produce a rich result. Google removed the documentation on 14 September 2023 with the note that the rich result "is no longer shown in search results, on both desktop and mobile devices". If a HowTo block is on your site because someone promised a stepped rich result in the SERP, that promise expired.
FAQ rich results are effectively closed. Google's own guidance is that "the feature is only shown for well-known, authoritative government and health websites". A commerce site will not get FAQ rich results, and an app subscription sold on the basis that it will is being mis-sold.
Neither of those is an argument for deleting the markup, and this is where honest advice diverges from the usual audit. A FAQPage or HowTo block is a machine-readable statement that this page contains a question with a direct answer, and the readers that matter have multiplied since 2023. Keeping it costs nothing if the content exists anyway. What has to change is the justification: it is structure for extraction, not a route to a bigger search result, and nobody should be buying an app or building a template around it on the old basis.
The rule that follows is the one worth enforcing: the answer must exist in the visible page, not only in the markup. Structured data that describes content a reader cannot see is a policy breach — "don't mark up content that is not visible to readers of the page" — and it is also useless to any reader arriving from an answer engine, who wants the paragraph, not the JSON.
The faults a validator will never find
Five failures we find repeatedly, none of which produces a warning anywhere.
- Markup that disagrees with the page. A price in JSON-LD that is not the price on screen, a rating that appears nowhere visibly, an availability value cached from a previous state. Valid, and against policy.
- Two copies of `Product`. Usually theme plus app. Neither is wrong on its own; together they are a coin toss over which price and which rating are read.
- A rating with nothing behind it. Google's policies warn against markup of "fake reviews or content unrelated to the focus of a page", and note that reviews or ratings not by actual users may result in a manual action. A company-wide star rating assembled from testimonials is the version of this that gets shipped by accident.
- Markup on the wrong template.
Producton a collection page,Articleon a category landing page, anOrganizationblock repeated on all fifty-eight routes with a different logo URL on two of them. - Stale identifiers after a catalogue change. A
skuorgtinmapped from a metafield that a bulk edit repurposed six months ago. Nothing breaks visibly; the product simply stops reconciling with itself elsewhere.
Calibrate the panic correctly
Worth knowing before anyone proposes an emergency sprint: a structured data manual action, in Google's own words, "means that a page loses eligibility for appearance as a rich result; it doesn't affect how the page ranks in Google web search."
That is a meaningful cost and a bounded one. It also means the failure mode of bad markup is losing an enhancement, not losing the page — so the rational response to a messy schema estate is a deliberate clean-up, not stripping every block out of the theme on a Friday afternoon. The teams that do the latter usually remove working Product markup along with the broken aggregateRating that caused the problem.
The audit, in order
A day's work for one person on a typical store, and most of it is reading.
- Fetch the rendered HTML of one URL per template and count the JSON-LD blocks. Name the source of each.
- Turn off every emitter except one per entity type. Decide which one owns
Product, and make it the theme unless there is a reason. - Run the Rich Results Test and the Schema Markup Validator on the same URLs and read the difference between them rather than either in isolation.
- Open Search Console's enhancement reports and look for faults that scale — one broken template variant beats any single-URL check.
- Read one product page's markup against the page itself, line by line, once. Every mismatch you find on that page exists on all of them.
- Map
sku,gtin/barcode,brand.nameand the variant properties, which is where the remaining value is. - Write down which types you keep for extraction rather than for a rich result, and why, so the next person does not delete them or re-buy an app for them.
Where this breaks again, and how to stop it
Schema estates do not decay randomly. They decay when someone builds a new page type — a landing page, a campaign template, a new collection layout — and the markup is not part of the template. The audit finds the mess; template ownership is what stops it coming back.
That is the practical argument for composing pages from a small set of maintained blocks rather than hand-building each new layout: the structured data is written once, in the block, and every page built from it inherits the correct markup without anyone remembering. It is the same reason a [Shopify section library](/services/build/shopify-section-library) keeps a marketing team fast — the thing that scales is not the page, it is the component behind it.
And keep one rule above all the others. If the markup says something, the page should say it too, in words a person can read. Everything else in this audit is maintenance; that one is the difference between structured data and a liability.
Questions this raises
How do you audit structured data on an ecommerce site?
Inventory the emitters first — theme, SEO app, reviews app — and count the JSON-LD blocks on one URL per template. Then validate with both the Rich Results Test and the Schema Markup Validator, check Search Console's enhancement reports for faults that affect whole templates, and finally read one page's markup against the visible page. The structural fault is usually duplication, and no validator reports it as an error.
Is duplicate Product schema actually a problem?
Yes, because it removes your control over which values are read. When a theme and an app each emit a `Product` block with different prices, ratings or availability, you are relying on a tie-break you do not own. Pick one owner per entity type and switch the other off rather than trying to keep two copies in agreement.
What properties does Google require on product markup?
For merchant listings, only `name`, `image`, `offers`, and within the offer a price (`offers.price` or `offers.priceSpecification.price`) and a currency. Everything else — `gtin`, `sku`, `brand.name`, `review`, `aggregateRating`, `isVariantOf`, `inProductGroupWithID` and the rest — is recommended, and the recommended set is where the remaining value sits for most stores.
Should we remove FAQ and HowTo schema?
Not automatically, but change why you keep it. Google removed the How-to rich result in September 2023 and restricts FAQ rich results to well-known, authoritative government and health sites, so neither will produce a richer search result for a shop. They remain a clean machine-readable statement of a question and its answer, which is worth keeping when the content is genuinely on the page — and worth deleting when it is not.
Can bad schema markup get a site penalised?
It can trigger a structured data manual action, which Google describes as losing eligibility for rich results while not affecting how the page ranks in web search. That is worth avoiding and not worth panicking about. The markup most likely to cause one is a rating or review that no real user produced.
Where should shipping and return policies be marked up?
Once, at organisation level. Google recommends a global shipping policy and a global return policy under `Organization` markup, with an override on an individual `Offer` only where a specific product genuinely differs. Injecting both into every product page creates maintenance nobody asked for and a second place for the policy to go stale.
NEXT STEP
Free store audit
A senior Shopify engineer reviews your storefront, theme performance and checkout, then sends a prioritised list of fixes.
