CatalogScan

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.

TL;DR The most impactful errors to fix first: (1) 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:

ToolBest forURL
Google Search Console → ShoppingFinding errors across all indexed pages; see which products are affected at scalesearch.google.com/search-console → Enhancements
Google Rich Results TestTesting individual product pages; confirms whether a page qualifies for rich resultssearch.google.com/test/rich-results
Schema Markup ValidatorStrict spec-level validation; catches errors Google's tool is lenient aboutvalidator.schema.org
CatalogScanStore-wide structured data audit covering Shopify-specific patterns and AI agent requirementscatalogscan.com

The 7 most common errors and their fixes

Error 1: Invalid availability value

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"
Fix: In your Shopify theme's product template Liquid, use {% 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.
Error 2: Price as a formatted string with currency symbol

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"
Fix: In Shopify Liquid, use {{ 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").
Error 3: Invalid GTIN format (hyphens, wrong digit count)

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
Fix: Strip all non-numeric characters from barcodes before emitting in JSON-LD. In Shopify Liquid: {{ variant.barcode | remove: "-" | remove: " " }}. Also verify digit count — 8, 12, 13, or 14 are the only valid lengths.
Error 4: Missing required image

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"
Fix: In Shopify Liquid, use {{ 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].
Error 5: priceValidUntil date in the past

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"
Fix: Either omit 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.
Error 6: Missing priceCurrency (price without currency)

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"
}
Fix: Always pair price with priceCurrency. In Shopify, use {{ shop.currency }} to emit the store's configured currency as the ISO 4217 code.
Error 7: AggregateRating with ratingCount = 0 or ratingValue out of range

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"
}
Fix: Configure your review app to suppress 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 →