Skip to content
Issue docs

Offer schema missing or incomplete

Importantoffer_schema_missingIssue 109

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 Product schema — see issue #108 for the Product's own required properties.
  • It does not fire on a Product whose offers is present but incomplete. That is reported under a different issue instead — #106 when the offer is missing price (or lowPrice) or priceCurrency, or #108 when only the offer's availability is 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 priceValidUntil is 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.)

  1. Locate Product schema: Find pages with Product schema (check your product detail pages)

  2. Add or complete the offers property 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"
    }
  3. 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")
  4. Keep price in sync with page - mismatches cause Google penalties

  5. 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

  1. Read the declared structured data: every JSON-LD block is parsed, and @graph wrappers are flattened.

  2. Select declared Product entities: any schema block whose @type is Product. A page that declares no Product schema at all is not examined by this check.

  3. Check for the offers property: this is the one condition this issue checks — whether the declared Product has an offers property at all.

  4. This is reported when: a declared Product has no offers property whatsoever. A page with no Product schema at all is never reported here (see #108 for that). A Product whose offers IS 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 missing price/lowPrice or priceCurrency) or under #108 (when the offer's own availability value 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

Further reading