Skip to main content

Offer Schema Missing or Incomplete

Issue No: 161

Category: Structured Data & Rich Results

Issue type: Issue

Priority: CRITICAL

Description

Product pages have a Product schema block but the nested Offer is absent or missing required fields, preventing Google from displaying price and availability in rich results.

How do we capture it

  • Find pages with Product schema (from Issue #59 check)
  • Inspect the offers key in the Product block
  • Check for price, priceCurrency, availability

What to store

StructuredDataAudit with schemaType = Offer, issueNumber = 60, plus StructuredDataField rows:

FieldTypeComment
has_pricebooleanprice property present
has_price_currencybooleanpriceCurrency currency code present
has_availabilitybooleanavailability URL property present
has_price_valid_untilbooleanpriceValidUntil expiry date present
offer_typetextOffer or AggregateOffer

Core audit fields: isPresent, rawJson

Condition for trigger

The following rules trigger this issue:

  • Trigger Rule 1: Offer absent
    • Target Field: isPresent
    • Evaluation Logic: isPresent = false
    • Severity: CRITICAL
    • Diagnostic Message: "No Offer in Product schema"
  • Trigger Rule 2: Price missing
    • Target Field: has_price
    • Evaluation Logic: has_price = false
    • Severity: CRITICAL
    • Diagnostic Message: "Required for rich results"
  • Trigger Rule 3: Currency missing
    • Target Field: has_price_currency
    • Evaluation Logic: has_price_currency = false
    • Severity: CRITICAL
    • Diagnostic Message: "Google cannot validate price"

Sources

Long description

Without Offer, Product schema provides context but no purchasable data. Google cannot show price or stock status in SERPs.

Use AggregateOffer for variable-price products (size/colour variants):

"offers": { "@type": "AggregateOffer", "lowPrice": "9.99", "highPrice": "49.99", "priceCurrency": "USD", "offerCount": "5" }

Use Offer for a single price:

"offers": { "@type": "Offer", "price": "29.99", "priceCurrency": "USD", "availability": "https://schema.org/InStock", "itemCondition": "https://schema.org/NewCondition" }

Availability values: schema.org/InStock, schema.org/OutOfStock, schema.org/PreOrder, schema.org/Discontinued

How to Fix

  1. Add offers block inside Product schema
  2. Always include price, priceCurrency, availability
  3. Use AggregateOffer for price ranges
  4. Add priceValidUntil for sale prices
  5. Keep price in sync with page — mismatches cause Google penalties