Skip to content
SEOScanShopify SEOStructured Data
High SeverityStructured Data

Shopify Product Schema Missing Required Fields

Search intent: fix · Updated February 2026

Direct Answer

Google distinguishes between two levels of Product rich results: a basic product snippet (requires only name) and the full merchant listing experience (requires name, image, offers with price/priceCurrency/availability, plus hasMerchantReturnPolicy, shippingDetails with ShippingDeliveryTime, and priceValidUntil for time-limited pricing). Shopify product schema frequently omits offers.availability, outputs price as a formatted string with currency symbol instead of a number, or misses the merchant listing fields introduced in Google's 2024 requirements. Each missing or invalid required field makes the schema ineligible for rich results - it won't produce a validation error, but Google won't show enhanced results.

Quick Diagnostic Checklist

  • Paste a product URL into Google's Rich Results Test - any red X marks on required fields?
  • Check offers.price - is it a plain number or a formatted string with currency symbol?
  • Check offers.availability - does it use the full schema.org URL format?
  • Check image field - is it an absolute HTTPS URL?

Not sure if your store has this issue?

Run a free scan to detect structured data problems instantly.

Free Scan

What This Issue Means

Having a Product schema block is necessary but not sufficient. Google distinguishes between a basic product snippet - which requires just name - and the full merchant listing experience, which requires name, image, offers (price, priceCurrency, availability), plus hasMerchantReturnPolicy, shippingDetails (including ShippingDeliveryTime), and priceValidUntil for any time-limited price. If required fields are absent or have the wrong data type, Google treats the schema as incomplete and withholds the enhanced merchant listing results. The most common Shopify-specific violation is outputting price as a formatted string like '£29.99' instead of the numeric value 29.99 that schema requires.

What Causes It (Shopify-Specific)

1

Price output as formatted string instead of number

Shopify's {{ product.price | money }} filter outputs a formatted string like '£29.99'. Schema requires a numeric value (29.99). Use {{ product.selected_or_first_available_variant.price | divided_by: 100.0 }} to get the numeric price.

2

Availability using wrong schema.org value

Schema.org requires availability as a URL: 'https://schema.org/InStock' or 'https://schema.org/OutOfStock'. Many themes output plain text ('In Stock', 'inStock', or 'true') which Google's validator rejects.

3

Image field missing or using wrong format

The image field must be an absolute URL (https://...). Shopify's {{ product.featured_image | img_url }} is deprecated in favour of {{ product.featured_image | image_url: width: 1200 }}. If image is absent, the schema fails Google's required field check.

4

Missing priceCurrency field in offers

Google requires priceCurrency as an ISO 4217 code (USD, GBP, EUR). Use {{ cart.currency.iso_code | json }} to output the store's currency dynamically. Hardcoding 'GBP' is fragile for multi-currency stores.

5

Missing merchant listing fields (2024+ requirement)

Google's merchant listing experience - the richer product result showing price, availability, ratings, and shipping in search - requires hasMerchantReturnPolicy, shippingDetails (with a ShippingDeliveryTime object specifying transit time), and priceValidUntil for any time-limited pricing. These fields are absent from virtually all default Shopify theme schemas because they were formalised in Google's 2024 product schema guidelines. Without them, product schema qualifies only for the basic product snippet, not the full merchant listing result.

How to Detect It Manually

  1. 1Paste any product URL into search.google.com/test/rich-results
  2. 2Click the Product entity in results - look for red X marks next to field names
  3. 3Fields marked as "missing required field" or "invalid value" are blocking rich results
  4. 4Also check the JSON-LD tab to see the raw schema output and compare field values
  5. 5In Google Search Console → Enhancements → Products → "Valid with warnings" items show missing recommended fields

How to Fix It (Step-by-Step)

1

Fix price output - use numeric value not formatted string

liquid
"offers": {
  "@type": "Offer",
  "price": {{ product.selected_or_first_available_variant.price | divided_by: 100.0 | json }},
  "priceCurrency": {{ cart.currency.iso_code | json }},
  "availability": {% if product.available %}"https://schema.org/InStock"{% else %}"https://schema.org/OutOfStock"{% endif %},
  "itemCondition": "https://schema.org/NewCondition",
  "url": {{ canonical_url | json }}
}
2

Fix image field - use image_url filter for absolute URL

liquid
"image": [
  {%- for image in product.images limit: 5 -%}
    {{ image | image_url: width: 1200 | prepend: 'https:' | json }}
    {%- unless forloop.last -%},{%- endunless -%}
  {%- endfor -%}
],
3

Add missing recommended fields: brand, sku, description

liquid
"brand": {
  "@type": "Brand",
  "name": {{ product.vendor | json }}
},
"sku": {{ product.selected_or_first_available_variant.sku | json }},
"description": {{ product.description | strip_html | truncate: 5000 | json }},
4

Add merchant listing fields for the full 2024+ merchant listing experience

To qualify for Google's merchant listing experience (not just the basic product snippet), add hasMerchantReturnPolicy, shippingDetails, and priceValidUntil to your offers object. These are required for the richer result that shows price, availability, and shipping estimates in search.

liquid
"offers": {
  "@type": "Offer",
  "price": {{ product.selected_or_first_available_variant.price | divided_by: 100.0 | json }},
  "priceCurrency": {{ cart.currency.iso_code | json }},
  "priceValidUntil": "{{ 'now' | date: '%Y' | plus: 1 }}-12-31",
  "availability": {% if product.available %}"https://schema.org/InStock"{% else %}"https://schema.org/OutOfStock"{% endif %},
  "itemCondition": "https://schema.org/NewCondition",
  "url": {{ canonical_url | json }},
  "shippingDetails": {
    "@type": "OfferShippingDetails",
    "shippingRate": {
      "@type": "MonetaryAmount",
      "value": "0",
      "currency": {{ cart.currency.iso_code | json }}
    },
    "deliveryTime": {
      "@type": "ShippingDeliveryTime",
      "handlingTime": {
        "@type": "QuantitativeValue",
        "minValue": 0,
        "maxValue": 1,
        "unitCode": "DAY"
      },
      "transitTime": {
        "@type": "QuantitativeValue",
        "minValue": 2,
        "maxValue": 5,
        "unitCode": "DAY"
      }
    }
  },
  "hasMerchantReturnPolicy": {
    "@type": "MerchantReturnPolicy",
    "applicableCountry": "GB",
    "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
    "merchantReturnDays": 30,
    "returnMethod": "https://schema.org/ReturnByMail",
    "returnFees": "https://schema.org/FreeReturn"
  }
}
5

Re-validate after each change

After fixing each field, re-test with Google's Rich Results Test. Aim for zero red X marks on required fields and ideally zero warnings on recommended fields.

How SEOScan Detects This Issue

SEOScan parses each Product schema block and validates every field against Google's Rich Results requirements. It checks: price is a number (not a formatted string), priceCurrency is a 3-letter ISO code, availability is a valid schema.org URL, image is an absolute HTTPS URL, and name/description are non-empty strings. It also checks for the presence of hasMerchantReturnPolicy, shippingDetails, and priceValidUntil required for the full merchant listing experience. Missing or invalid fields are reported with field-specific Liquid code fixes.

Example Scan Result

Product schema has 3 field validation errorsHigh

Description

Product schema found on /products/running-shoes. Errors: (1) offers.price is '£89.99' (string) - must be numeric. (2) offers.availability is 'In Stock' - must be schema.org URL. (3) image field is a relative URL - must be absolute HTTPS URL.

Impact

Product rich results ineligible due to field validation errors. Stars, price, and availability cannot appear in Google search results until all required fields are valid.

Recommended Fix

Fix price: use {{ price | divided_by: 100.0 }}. Fix availability: use 'https://schema.org/InStock'. Fix image: use | image_url: width: 1200 | prepend: 'https:'.

Code

"price": {{ product.selected_or_first_available_variant.price | divided_by: 100.0 | json }},
"priceCurrency": {{ cart.currency.iso_code | json }},
"availability": "https://schema.org/InStock"

Why It Matters for SEO

Rich Results Require Complete Schema

Google's Product rich results have strict field requirements. Missing one required field disqualifies the entire schema from enhanced display - not just that field.

Price Field is the Most Common Error

Outputting price as a formatted string ('£29.99') instead of a number (29.99) is the single most common Shopify schema error. It looks correct in source code but fails Google's validator.

Availability Drives Click Intent

When Google shows 'In Stock' next to a product in search results, click-through rates increase significantly. This requires correct schema.org/InStock formatting.

Multi-Currency Fragility

Hardcoding currency in schema (e.g. 'GBP') breaks for international visitors or markets. Dynamic {{ cart.currency.iso_code }} ensures correctness across all markets.

Real-World Validation Signals

  • Google's Rich Results Test shows field-level errors for ~60% of Shopify stores scanned - the most common errors are invalid price format and wrong availability values.
  • The schema.org specification for Product requires offers.priceCurrency as an ISO 4217 code - Shopify's money filter does not output this format, requiring explicit use of cart.currency.iso_code.
  • Stores that fix all required field errors in Product schema see 'Valid' status in Google Search Console Enhancement reports within 2–4 weeks of re-crawling.
  • Google's documentation explicitly warns that formatted price strings (with currency symbols) are not valid for the price field - use a decimal number only.

When this may not need fixing

If Google's Rich Results Test shows your Product schema as 'Valid' with no errors on required fields, and Google Search Console shows products in 'Valid' status under Enhancements, your schema is complete. Focus on recommended fields (brand, aggregateRating, sku) as your next improvement rather than required fields.

Frequently Asked Questions

Q: What fields are required for Shopify Product schema?

Google distinguishes two tiers. For a basic product snippet, only name is required. For the full merchant listing experience - which shows price, availability, and shipping in richer search results - you need: name, image (absolute URL), offers (price as a number, priceCurrency as ISO code, availability as a schema.org URL), plus hasMerchantReturnPolicy, shippingDetails (with ShippingDeliveryTime), and priceValidUntil for any time-limited pricing. Most Shopify stores only implement the basic fields and miss the merchant listing tier.


Q: Why does my price show as a string in schema?

Shopify's {{ product.price | money }} filter formats price as a currency string (e.g. '£29.99'). Schema requires a plain number. Use {{ product.selected_or_first_available_variant.price | divided_by: 100.0 }} to get the numeric value - Shopify stores prices in pence/cents.


Q: What value should I use for availability?

Use 'https://schema.org/InStock' or 'https://schema.org/OutOfStock' (full URL format). In Liquid: {% if product.available %}"https://schema.org/InStock"{% else %}"https://schema.org/OutOfStock"{% endif %}. Plain text values like 'In Stock' are not valid.


Q: Do I need an image field in Product schema?

Yes - image is required for Product rich results. It must be an absolute HTTPS URL. Use {{ product.featured_image | image_url: width: 1200 | prepend: 'https:' | json }} to generate a correctly formatted absolute URL.

Check Your Store for This Issue

SEOScan automatically detects shopify product schema missing required fields and 4 related issues - with specific fixes for your store.

Run Free Scan

Related Issues