Product Schema Checker for Google & AI Shopping (Shopify)
Enter a product page URL, or paste JSON-LD or the page source, and the tool checks the Product, ProductGroup, Offer, shipping and return markup against Google’s merchant listing documentation, labels every finding with an evidence level and a source, and writes fix code for Shopify stores. Pasted code is processed in your browser and never uploaded.
Key takeaways
- The tool checks Product, ProductGroup, Offer, shipping and return markup against Google’s merchant listing documentation; hard requirements get Pass or Fail, recommended properties only get Improve.
- The AI shopping part lists only what each platform has published officially; anything a platform has not said is marked Unpublished.
- Shopify stores can generate Liquid fix code from their real shipping and return policy.
- There is no overall score, because whether a merchant listing shows also depends on Google’s crawling, verification and policy review.
What this tool is for
Google’s shopping results and the AI shopping features all need a product’s price, stock, shipping, returns, brand and GTIN. The data source an independent store controls directly is its product page, so this information should be written as structured data that machines can read directly.
Google documents this data in detail, and each AI shopping surface has said something about where its product data comes from. This tool puts both in one place:
- The Google part follows the merchant listing, product variant and return policy docs rule by rule. Hard requirements get Pass or Fail; recommended properties only get Improve.
- The AI shopping part lists only what each platform has published officially. Anything a platform has not said is marked Unpublished. The tool does not guess and does not score.
Typical uses: checking a Shopify, WooCommerce or custom product page before launch; tracing Search Console merchant listing issues such as “Missing field shippingDetails” or “Missing field hasMerchantReturnPolicy”; and checking for duplicate product nodes after a theme change or after installing a review or SEO app.
How to use it
- Enter the product page URL and click Check URL. This site’s server reads the JSON-LD in the page’s initial HTML. If the site blocks server requests, press Ctrl+U in your browser to view the source, copy everything and paste it into the box.
- Read the Results tab. Findings are grouped into page and nodes, required properties, recommended properties, variants, shipping and returns, ratings and reviews, and AI shopping data sources. Failures are expanded by default, and each finding explains why, how to fix it and gives reference markup.
- Shopify stores can switch to the Shopify fix tab, fill in the real shipping and return policy, copy the Liquid code and follow the steps on that tab.
- Check again after the change, then confirm the live page with Google’s Rich Results Test and click Validate fix on the related issues in Search Console.
No page at hand? Click Load Shopify example. It is a product page from a fictional store with a theme ProductGroup, a separate Product from a review app and an Organization block, and it shows typical problems such as an expired priceValidUntil, a price with a decimal comma and a wrong GTIN check digit.
Checks and evidence
Evidence levels follow this site’s standard: A means official documentation or a public statement, D means a judgment from practice without an official statement. Most checks in the tool are A.
| Check | Requirement | Evidence |
|---|---|---|
| name, image, offers | Required for merchant listings; offers must be an Offer, not an AggregateOffer | A |
| price, priceCurrency | Required; price above zero with no currency symbol or thousands separator; currency as a three-letter ISO 4217 code | A |
| availability, itemCondition | Recommended; schema.org enumeration values only, one value | A |
| brand, gtin, mpn, sku | Recommended; GTINs have 8, 12, 13 or 14 digits and a valid check digit, URL form is not supported; sku has no whitespace | A |
| shippingDetails | Recommended; once present it needs shippingDestination, shippingRate and deliveryTime, with the shipping currency matching the offer | A |
| hasMerchantReturnPolicy | Recommended; offer-level policies need applicableCountry + returnPolicyCategory, plus merchantReturnDays for a finite window; organization-level policies may give just merchantReturnLink; an @id reference to a policy defined elsewhere is also fine | A |
| priceValidUntil | Recommended; a past date may stop the listing from showing (the tool says Improve, because the docs do not state it as a hard requirement) | A |
| ProductGroup variants | productGroupID, variesBy, a unique sku or gtin per variant, distinct URLs | A |
| Duplicate product nodes | When the theme and an app each output one, rating and price end up on separate items | D |
The tool gives no overall score, because whether a merchant listing appears also depends on Google’s crawling, verification and policy review, and structured data is only one of the conditions.
For experts: precedence of shipping and return settings
Google’s merchant listing docs say that when the same information is defined in several places, Google uses this order, strongest first:
- Product-level feeds submitted in Merchant Center
- Settings in the Content API for Shopping
- Account-level settings in Merchant Center or Search Console
- Product-level merchant listing markup
- Organization-level markup
So if shipping and returns are already set in Merchant Center or Search Console, the “missing shippingDetails / hasMerchantReturnPolicy” findings may not matter for you. Organization-level policies (hasMerchantReturnPolicy and hasShippingService on Organization) can live on another page, which the tool cannot see when it checks a single product page. Offer-level shipping and return policies support only a subset of the organization-level properties, and Google recommends them only for products that override the general policy.
What AI shopping surfaces have published
The table includes only what official sources confirm. Platforms update their documentation, so the linked originals take precedence.
| Platform | Official statement | Unpublished |
|---|---|---|
| ChatGPT | The OpenAI Help Center says ChatGPT considers structured metadata from first- and third-party providers (such as price and product description) and other third-party content when choosing products; merchants can submit data under the product feed spec | Whether and how it uses product-page JSON-LD |
| Google AI Mode | Google’s I/O 2025 announcement says shopping in AI Mode is powered by the Shopping Graph; Search Central says providing both on-page structured data and a Merchant Center feed maximizes eligibility | How structured data affects product ranking in AI Mode |
| Perplexity | A free Merchant Program through which merchants share product specs | Whether it reads product-page JSON-LD |
| Microsoft Copilot | The Copilot Merchant Program, with product data through Microsoft Merchant Center | Whether it reads product-page JSON-LD |
| Shopify Catalog | Agentic Storefronts in the Winter ‘26 Edition syndicate admin product data to ChatGPT, Perplexity, Copilot and others | How theme JSON-LD relates to this channel |
Two fairly safe conclusions follow. First, price, stock, brand, GTIN, shipping and returns are needed by Google’s structured data, OpenAI’s product feed and each merchant program alike, so completing them in your admin and on the page helps every channel. Second, AI crawlers need access to product pages; the AI crawler robots.txt checker shows whether OAI-SearchBot, PerplexityBot and Bingbot are blocked.
Common gaps on Shopify stores
Dawn and themes based on it print product JSON-LD with {{ product | structured_data }} in sections/main-product.liquid (see the Dawn source). According to Shopify’s reference, the filter outputs a ProductGroup when the product has variants. These are the problems that come up most when checking Shopify stores; the tool’s result for your own page is what counts:
- No shipping or return policy. The default output usually has no shippingDetails or hasMerchantReturnPolicy, and Search Console flags both. Add them with the Shopify fix code, or set account-level policies in Merchant Center or Search Console.
- Duplicate product nodes. A review or SEO app prints its own Product with a rating but no price. Nothing links the two, so search engines check them as two items (D).
- Barcodes that are not GTINs. The Shopify barcode field often holds an internal code with the wrong length or check digit. The tool checks every variant.
- Older theme patterns. One Product with several Offers, Microdata alongside JSON-LD, prices printed with the money filter so they carry commas or symbols, and a hard-coded priceValidUntil that expired long ago.
- Vendor set to the store name. Shopify’s vendor defaults to the store name. Private-label stores should set it to the brand name, because brand reads from it.
Fix example
This is shipping and return markup on an Offer. The values are examples and must match the real rules on your policy pages:
1 | "offers": { |
Shopify stores do not need to write this by hand. The Shopify fix code loops over every variant and prints its sku, GTIN (only when the barcode is 8, 12, 13 or 14 digits), colour and size, image, price and stock, plus the strikethrough price, shipping and return policy, and it reads the reviews.rating metafields that review apps write to output the rating.
FAQ
The Rich Results Test says my page is valid. Why use this tool?
Google’s Rich Results Test tells you whether a page is eligible for rich results, and missing recommended properties show only as non-critical issues. This tool also checks GTIN check digits, whether the shipping currency matches the offer and whether there are unlinked duplicate product nodes, names the document behind each rule and writes Shopify fix code. Use both: fill the gaps here, then confirm with Google’s test, which has the final word.
Why can a URL check and pasted source give different results?
A URL check reads the initial HTML the server returns and does not run JavaScript. If the product JSON-LD is inserted by a script after load, the URL check reports “No JSON-LD found”. Google recommends that merchants put Product markup in the initial HTML, because JavaScript-generated markup makes Shopping crawls less frequent and less reliable. Some sites also answer server requests with a verification page; paste the source in that case.
What happens without a GTIN? What about private-label products?
GTIN is recommended, not required for merchant listing eligibility. Google’s shopping knowledge panel uses product identifiers to group sellers of the same product, and AI shopping feeds use them for catalogue matching. Do not invent a GTIN for private-label goods; leave it empty and provide brand and mpn. A wrong GTIN causes more trouble than none, so the tool checks each one with the GS1 rule.
Search Console says shippingDetails and hasMerchantReturnPolicy are missing. Must they be on the product page?
No. Google recommends a store-wide policy on Organization, or account-level shipping and return settings in Merchant Center or Search Console. Offer-level markup is only needed for products whose policy differs from the general one. Both are recommended properties and do not affect merchant listing eligibility; if you have set policies in Merchant Center or Search Console you do not need to repeat them on product pages.
Will structured data get my products into ChatGPT shopping results?
There is no guarantee. OpenAI says ChatGPT considers structured metadata, but it has not said whether or how it uses product-page JSON-LD. The dependable steps are to allow OAI-SearchBot, keep product data complete, submit data under OpenAI’s product feed spec if you qualify, and, on Shopify, turn on Agentic Storefronts in the admin.
Does the tool store my code or the URLs I check?
Pasted code is processed in your browser and is not sent to any server. The input box is saved in your own browser’s local storage so it is there next time. A URL check asks this site’s server to read the page; only the JSON-LD is returned, results for the same URL are cached for 10 minutes, and each IP can run 30 checks an hour.
Can I put any number in aggregateRating?
No. Google’s review snippet guidelines require ratings from genuine reviews that users can see on the page, not aggregated from other sites, and not fake or undisclosed incentivized reviews. Leave aggregateRating out when there are no reviews.
Further reading
- Schema Visualizer: draw a page’s JSON-LD as an entity graph and check @id references
- AI crawler robots.txt checker: see whether OAI-SearchBot, PerplexityBot and others can reach product pages
- SERP snippet preview: check whether product titles and descriptions get truncated
- Structured Data: Helping Google and AI Understand Your Pages (Chinese)
- More free SEO and GEO tools