No Product schema on a product page
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,imageanddescriptionare present- any declared
offerscarry a validprice/lowPrice,priceCurrencyandavailability - a declared
aggregateRatingorreview.reviewRatingfalls 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 declareProductschema. A page with none declared is never reported. - It does not flag a Product that declares no
offersat 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.
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
- URL patterns (
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" } }Include required properties:
name: Product namedescription: Product descriptionimage: Product image URL(s)offers: Pricing information (nest Offer schema)
Add recommended properties:
sku: Unique product identifierbrand: Product brand (use Brand schema)aggregateRating: Review ratings (nest AggregateRating schema)availability: Product availability status
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
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 none is not examined — this check does not infer a product page from its URL (/product/,/shop/), add-to-cart buttons, or product imagery.Check the required properties:
name,imageanddescriptionmust be present.Check the rich-result value rules on whatever the Product itself declares:
offers— each offer'sprice(orlowPricefor anAggregateOffer),priceCurrencyandavailabilityare checked for presence and validity (a numeric price with no currency symbol, a real ISO 4217 currency, a realItemAvailabilityvalue). A Product declaring nooffersat all is not flagged here — see #109 for that.aggregateRating— if present, itsratingValuemust sit inside its declared (or default 1–5) scalereview[].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
This is reported when: the page declares a
Productmissing a required property, or whose declared offers/ratings/reviews fail the value rules above. A product page with noProductschema 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