SEO Guide · 2026
E-commerce Structured Data Errors: How to Find and Fix Them
Google Search Console's Structured Data report lists errors, but it doesn't always explain what the right fix is or why the error matters for AI shopping agent inclusion specifically. This guide covers the 7 most common Product JSON-LD errors in e-commerce — what's wrong, why it matters for AI agents, and the exact fix.
availability shorthand strings instead of full https://schema.org/ URLs — silent failure in AI agents; (2) price as a formatted string with currency symbol instead of a plain decimal; (3) GTIN values with hyphens or wrong digit count. These three affect the most products and are all one-line fixes.
Validation tools: where to start
Before diving into specific errors, know which tool to use for which type of check:
| Tool | Best for | URL |
|---|---|---|
| Google Search Console → Shopping | Finding errors across all indexed pages; see which products are affected at scale | search.google.com/search-console → Enhancements |
| Google Rich Results Test | Testing individual product pages; confirms whether a page qualifies for rich results | search.google.com/test/rich-results |
| Schema Markup Validator | Strict spec-level validation; catches errors Google's tool is lenient about | validator.schema.org |
| CatalogScan | Store-wide structured data audit covering Shopify-specific patterns and AI agent requirements | catalogscan.com |
The 7 most common errors and their fixes
The offers.availability field uses a shorthand string instead of the required full namespace URL.
// WRONG — these all fail in Bing's Shopping Graph and AI agents: "availability": "InStock" "availability": "in stock" "availability": "available" "availability": "In Stock" // CORRECT — full https://schema.org/ namespace URL: "availability": "https://schema.org/InStock" "availability": "https://schema.org/OutOfStock" "availability": "https://schema.org/PreOrder" "availability": "https://schema.org/Discontinued"
{% if product.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %} in the JSON-LD block. Shopify's default themes already use the correct format — this error usually appears in custom or third-party themes.The offers.price field contains a formatted string instead of a plain decimal number.
// WRONG: "price": "$89.95" "price": "89,95" "price": "89.95 USD" // CORRECT — plain decimal string: "price": "89.95" // Always pair with priceCurrency: "priceCurrency": "USD"
{{ variant.price | money_without_currency }} rather than {{ variant.price | money }}. The money filter adds the currency symbol and formatting that breaks structured data parsing. Set priceCurrency separately as a hardcoded ISO 4217 code (e.g., "USD", "GBP").GTIN values contain formatting characters or have the wrong number of digits.
// WRONG: "gtin": "4-007819-015008" // hyphens not allowed "gtin": "978-0-306-40615-7" // ISBN with hyphens — remove them "gtin": "4007819" // 7 digits — not a valid GTIN length // CORRECT: "gtin13": "4007819015008" // 13 pure digits, no hyphens "gtin12": "012345678905" // 12 pure digits (UPC) "gtin8": "01234565" // 8 pure digits
{{ variant.barcode | remove: "-" | remove: " " }}. Also verify digit count — 8, 12, 13, or 14 are the only valid lengths.The Product.image field is missing or the image URL returns a 404.
// WRONG — no image field:
{ "@type": "Product", "name": "Widget", "offers": {...} }
// WRONG — relative URL:
"image": "/cdn/shop/products/widget.jpg"
// CORRECT — absolute URL:
"image": "https://cdn.shopify.com/s/files/1/0123/widget.jpg"
{{ product.featured_image | img_url: '1000x' | prepend: 'https:' }} to generate an absolute CDN URL. Never use relative paths in structured data — they fail outside the context of your domain. Verify the image URL returns 200 with curl -I [url].The offers.priceValidUntil date has passed, signaling to search engines that the price is no longer valid.
// WRONG — expired date: "priceValidUntil": "2025-12-31" // CORRECT — omit entirely (never expires) or set 12 months out: "priceValidUntil": "2027-06-01"
priceValidUntil entirely (valid — Schema.org does not require it), or render it dynamically as 12 months from today. In Shopify Liquid: {{ 'now' | date: '%s' | plus: 31536000 | date: '%Y-%m-%d' }}. This error is especially common on sites that hardcode a year-end date in their theme and forget to update it.A numeric price is present but priceCurrency is missing, making it impossible to validate against the displayed page price.
// WRONG — price without currency:
"offers": { "@type": "Offer", "price": "89.95" }
// CORRECT:
"offers": {
"@type": "Offer",
"price": "89.95",
"priceCurrency": "USD"
}
price with priceCurrency. In Shopify, use {{ shop.currency }} to emit the store's configured currency as the ISO 4217 code.A review app emits an AggregateRating block for products with no reviews yet, or uses a ratingValue above 5 (e.g., on a 10-point scale).
// WRONG — zero reviews:
"aggregateRating": { "ratingValue": 0, "reviewCount": 0 }
// WRONG — 10-point scale without declaring bestRating:
"aggregateRating": { "ratingValue": "8.5", "reviewCount": 42 }
// CORRECT — 10-point scale with explicit bestRating:
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "8.5",
"bestRating": "10",
"reviewCount": "42"
}
AggregateRating JSON-LD for products with zero reviews. For non-5-point scales, always include bestRating and worstRating. Most review apps (Okendo, Loox, Judge.me) have a setting to hide structured data for unreviewed products.FAQ
What is the most common structured data error in e-commerce?
The most common error is an invalid availability value — using shorthand strings like "InStock" or "available" instead of the full namespace URL "https://schema.org/InStock". Google's Rich Results Test is lenient about this, but Bing's Shopping Graph and AI shopping agents require the full URL form. The fix is a one-line change in your product template.
What GTIN format does Google and Bing require for Product structured data?
GTINs must be plain digit strings — no dashes, spaces, or letters. Acceptable formats: gtin8 (8 digits), gtin12 (12 digits/UPC), gtin13 (13 digits/EAN), gtin14 (14 digits/ITF-14). If you use the generic gtin property, the value must be 8, 12, 13, or 14 digits. Remove all non-numeric characters before emitting GTIN values.
How do I find structured data errors across my entire Shopify store?
For a full-store audit: (1) Google Search Console → Enhancements → Shopping → Products shows errors affecting indexed pages at scale; (2) CatalogScan's free scan checks Product JSON-LD on a sample of your pages and reports errors, missing required fields, and availability mismatches; (3) For individual pages, use Google's Rich Results Test or Schema Markup Validator. Google Search Console is the most actionable source as it shows errors already affecting your Shopping presence.
Can structured data errors cause removal from Google Shopping?
Yes. Google Shopping can demote or remove products for several errors: claiming InStock for an out-of-stock product, submitting a price that doesn't match the page price during Google's verification crawl, and providing an invalid GTIN. Repeated availability mismatches result in a merchant-level trust penalty affecting all products from that domain — not just the affected pages. Fix availability accuracy first.
Find structured data errors across your entire catalog
CatalogScan audits your Product JSON-LD for availability values, GTIN format, price formatting, missing fields, and 14 more signals in 2 minutes.
Run the free scan →