Skip to content
Issue docs

No Product schema on a product page

Importantproduct_schema_missingIssue 108

What is this issue?

This issue reports a Product schema block your page already declares that is missing a required property, or whose declared offers, ratings or reviews fail Google's rich-result value rules — not a product page that has no Product schema at all.

Checked once a page declares Product schema:

  • name, image and description are present
  • any declared offers carry a valid price/lowPrice, priceCurrency and availability
  • a declared aggregateRating or review.reviewRating falls inside its rating scale

What this issue is not:

  • It does not guess that a page under /shop/ or /product/, or one with add-to-cart UI, ought to declare Product schema. A page with none declared is never reported.
  • It does not flag a Product that declares no offers at all — that is a separate, dedicated issue (#109).
  • A missing product identifier (sku, gtin, mpn) is a recommendation, not part of this finding.

Why it matters

Product schema is the most commercially important schema type:

  • Google Shopping rich results: Enables products to appear in Google Shopping carousels
  • Price snippets: Shows price and availability directly in search results
  • Star ratings: Displays star ratings and review counts in search results
  • Merchant Listings: Required for Google Merchant Center listings
  • AI search readiness: AI engines use Product schema to understand and recommend products
  • Conversion rates: Product rich results have significantly higher click-through rates

Resolving this issue improves your SEO health score by ensuring products are properly structured for maximum commercial visibility.

How to fix it

If this issue was raised, your page already declares a Product missing a required property, or with an invalid offer, rating or review — open the finding for specifics. A Product with no offers at all is a separate issue (#109). The steps below are for a page that declares no Product schema yet: worthwhile to add, and never reported as a defect while absent.

  1. Identify product pages: Look for pages with:

    • URL patterns (/product/, /shop/, /item/, /p/)
    • Product name, price, and add-to-cart functionality
    • Product images and descriptions
  2. Add Product JSON-LD structured data to the page's <head> or before </body>:

    {
      "@context": "https://schema.org",
      "@type": "Product",
      "name": "Widget Pro",
      "image": ["https://example.com/img1.jpg", "https://example.com/img2.jpg"],
      "sku": "WGT-001",
      "brand": { "@type": "Brand", "name": "Example Corp" },
      "offers": {
        "@type": "Offer",
        "price": "49.99",
        "priceCurrency": "USD",
        "availability": "https://schema.org/InStock"
      },
      "aggregateRating": {
        "@type": "AggregateRating",
        "ratingValue": "4.7",
        "reviewCount": "342"
      }
    }
  3. Include required properties:

    • name: Product name
    • description: Product description
    • image: Product image URL(s)
    • offers: Pricing information (nest Offer schema)
  4. Add recommended properties:

    • sku: Unique product identifier
    • brand: Product brand (use Brand schema)
    • aggregateRating: Review ratings (nest AggregateRating schema)
    • availability: Product availability status
  5. Validate with Google's Rich Results Test

Examples

Example 1: No Schema Declared — Not This Issue

<!-- Product page with visible price and add-to-cart, but no Product schema -->
<html>
  <head>
    <title>Widget Pro - Example Store</title>
  </head>
  <body>
    <h1>Widget Pro</h1>
    <img src="https://example.com/img1.jpg" alt="Widget Pro" />
    <p>High-quality widget for professional use.</p>
    <p><strong>Price:</strong> $49.99</p>
    <button>Add to Cart</button>
  </body>
</html>

Nothing is reported, however clearly the page sells a product.

Example 1b: The Same Product, Declared and Valid (passes)

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Widget Pro",
  "description": "High-quality widget for professional use.",
  "image": ["https://example.com/img1.jpg", "https://example.com/img2.jpg"],
  "sku": "WGT-001",
  "brand": { "@type": "Brand", "name": "Example Corp" },
  "offers": {
    "@type": "Offer",
    "price": "49.99",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.7",
    "reviewCount": "342"
  }
}

Example 2: Product Schema with Multiple Images

Corrected state:

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Running Shoes",
  "image": [
    "https://example.com/shoes-front.jpg",
    "https://example.com/shoes-side.jpg",
    "https://example.com/shoes-back.jpg"
  ],
  "offers": {
    "@type": "Offer",
    "price": "89.99",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock"
  }
}

Example 3: Incomplete Product Schema (fails)

Problematic state:

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Coffee Mug"
}

Reported: description missing, image missing. A missing offers is not part of this finding — a Product with no offers at all is reported separately, under issue #109.

Corrected state:

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Coffee Mug",
  "description": "Ceramic coffee mug with ergonomic handle",
  "image": "https://example.com/mug.jpg",
  "offers": {
    "@type": "Offer",
    "price": "12.99",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock"
  }
}

Example 4: A Rating Value Outside Its Scale (fails)

Problematic state:

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Coffee Mug",
  "description": "Ceramic coffee mug with ergonomic handle",
  "image": "https://example.com/mug.jpg",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "6",
    "reviewCount": "42"
  }
}

Reported: aggregateRating.ratingValue 6 is outside its 1-5 scale.

Corrected state: either correct the value, or declare the actual scale with bestRating/worstRating (e.g. a 1-10 scale).

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 none is not examined — this check does not infer a product page from its URL (/product/, /shop/), add-to-cart buttons, or product imagery.

  3. Check the required properties: name, image and description must be present.

  4. Check the rich-result value rules on whatever the Product itself declares:

    • offers — each offer's price (or lowPrice for an AggregateOffer), priceCurrency and availability are checked for presence and validity (a numeric price with no currency symbol, a real ISO 4217 currency, a real ItemAvailability value). A Product declaring no offers at all is not flagged here — see #109 for that.
    • aggregateRating — if present, its ratingValue must sit inside its declared (or default 1–5) scale
    • review[].reviewRating — each, if present, is checked the same way
    • a missing product identifier (sku, gtin, mpn, etc.) is recorded as a recommendation, never a finding
  5. This is reported when: the page declares a Product missing a required property, or whose declared offers/ratings/reviews fail the value rules above. A product page with no Product schema at all is never reported.

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