Offer schema missing or incomplete
What is this issue?
This issue reports a Product schema block your page already declares that has
no offers property at all. It fires on exactly one condition: a declared Product
with the offers property missing entirely.
What this issue is not:
- It does not fire on a page with no
Productschema — see issue #108 for the Product's own required properties. - It does not fire on a Product whose
offersis present but incomplete. That is reported under a different issue instead — #106 when the offer is missingprice(orlowPrice) orpriceCurrency, or #108 when only the offer'savailabilityis missing or invalid — never under this one.
Why it matters
Offer schema is essential for e-commerce SEO:
- Product rich results: Enables price, availability, and review stars in search results
- Price drop badges: Google shows "Price drop" badges when
priceValidUntilis set - Availability signals: Helps users see if products are in stock before clicking
- Google Shopping: Required for Google Shopping rich results
- Conversion optimization: Users are more likely to click when they see current pricing
- AI search readiness: AI engines use Offer data to answer pricing queries accurately
Resolving this issue improves your e-commerce SEO health score by ensuring product pricing information is properly structured for search engines and AI systems.
How to fix it
If this issue was raised, your page already declares a Product with no offers
property at all — add one. (An offers that is present but missing a field, such as
priceCurrency, is a different issue — #106 — and is not what raised this finding.)
Locate Product schema: Find pages with
Productschema (check your product detail pages)Add or complete the
offersproperty in your Product schema:For single price:
{ "@context": "https://schema.org", "@type": "Product", "name": "Product Name", "description": "Product description", "offers": { "@type": "Offer", "price": "29.99", "priceCurrency": "USD", "availability": "https://schema.org/InStock", "priceValidUntil": "2024-12-31", "url": "https://example.com/product-page", "seller": { "@type": "Organization", "name": "Store Name" } } }For multiple offers/variants, use
AggregateOffer:"offers": { "@type": "AggregateOffer", "lowPrice": "29.99", "highPrice": "49.99", "priceCurrency": "USD", "offerCount": "5" }Use correct values for key properties:
price: Numeric value as string (e.g., "29.99")priceCurrency: ISO 4217 currency code (e.g., "USD", "EUR", "GBP")availability: Use Schema.org URLs:https://schema.org/InStock,https://schema.org/OutOfStock,https://schema.org/PreOrder, etc.priceValidUntil: ISO 8601 date format (e.g., "2024-12-31")
Keep price in sync with page - mismatches cause Google penalties
Validate with Google's Rich Results Test
Examples
Example 1: Product With No offers Property (fails)
Problematic state:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Wireless Headphones",
"description": "High-quality wireless headphones with noise cancellation"
}Reported: the Product declares no offers property at all. This is the only
condition this issue checks.
Corrected state:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Wireless Headphones",
"description": "High-quality wireless headphones with noise cancellation",
"offers": {
"@type": "Offer",
"price": "199.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}Example 2: AggregateOffer for Multiple Sellers (passes)
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Running Shoes",
"offers": {
"@type": "AggregateOffer",
"lowPrice": "89.99",
"highPrice": "129.99",
"priceCurrency": "USD",
"offerCount": "5",
"availability": "https://schema.org/InStock"
}
}offers is present, so this issue does not fire — whatever is inside it. An
incomplete offer is a different, dedicated issue (#106).
Example 3: An Incomplete Offer — See Issue #106, Not This One
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Smartphone",
"offers": {
"@type": "Offer",
"price": "599.99"
}
}offers is present here, so this issue (#109) does not fire. The incomplete offer
(missing priceCurrency) is reported under issue #106 instead.
How PixyScan detects this
Read the declared structured data: every JSON-LD block is parsed, and
@graphwrappers are flattened.Select declared
Productentities: any schema block whose@typeisProduct. A page that declares noProductschema at all is not examined by this check.Check for the
offersproperty: this is the one condition this issue checks — whether the declaredProducthas anoffersproperty at all.This is reported when: a declared
Producthas nooffersproperty whatsoever. A page with noProductschema at all is never reported here (see #108 for that). A Product whoseoffersIS present is never reported by this issue, however incomplete that offer turns out to be — an incomplete offer is reported under #106 (when it is missingprice/lowPriceorpriceCurrency) or under #108 (when the offer's ownavailabilityvalue is missing or invalid), never under this one.
What we store
Storage Level
Page Level — This issue is evaluated for each individual URL that contains structured data.
Database Table / Prisma Model
PageStructuredData
Stored Fields
| Field | Type | Description |
|---|---|---|
| schemaType | SchemaType | The type of schema (e.g., Organization, Person) |
| schemaFormat | SchemaFormat | The format of the schema (JSON-LD, Microdata, RDFa) |
| schemaIdentifier | String? | Unique identifier for the schema |
| rawJson | Json? | The raw JSON-LD or structured data content |
| schemaErrors | Json? | Array of validation errors found in the schema |
| isValidSchema | Boolean? | Whether the schema is valid according to validation |
| missingFields | Json? | Reserved for future use — the crawler always writes null here today; no check currently populates it |
Detection Dependencies
- The following data sources are required to evaluate this issue:
- HTML Document — The crawler parses the HTML to find structured data (JSON-LD, Microdata, RDFa)
- Structured Data Validation — The extracted schema is validated against Schema.org definitions
- Schema Parser — JSON-LD scripts, Microdata attributes, and RDFa markup are parsed