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
Productschema (from Issue #59 check) - Inspect the
offerskey in the Product block - Check for
price,priceCurrency,availability
What to store
StructuredDataAudit with schemaType = Offer, issueNumber = 60, plus StructuredDataField rows:
| Field | Type | Comment |
|---|---|---|
has_price | boolean | price property present |
has_price_currency | boolean | priceCurrency currency code present |
has_availability | boolean | availability URL property present |
has_price_valid_until | boolean | priceValidUntil expiry date present |
offer_type | text | Offer 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
Offerin Product schema"
- Target Field:
- Trigger Rule 2: Price missing
- Target Field:
has_price - Evaluation Logic:
has_price = false - Severity: CRITICAL
- Diagnostic Message: "Required for rich results"
- Target Field:
- Trigger Rule 3: Currency missing
- Target Field:
has_price_currency - Evaluation Logic:
has_price_currency = false - Severity: CRITICAL
- Diagnostic Message: "Google cannot validate price"
- Target Field:
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
- Add
offersblock insideProductschema - Always include
price,priceCurrency,availability - Use
AggregateOfferfor price ranges - Add
priceValidUntilfor sale prices - Keep price in sync with page — mismatches cause Google penalties