Product Snippet: missing required properties
seo.schema.schema_rule_missing_product_snippet
- Outcome class
- Automatic. An automated check that can report a confirmed violation.
- Area
- SEO, structured data
What the rule checks
Scope. Applies to JSON-LD nodes of type Product in the audited document (top level, top-level arrays, @graph entries; full schema.org IRIs count as the short type). Microdata and RDFa are outside this method.
Expectation. Fails when a Product node lacks name, or has none of review / aggregateRating / offers, or an offer without price (AggregateOffer: lowPrice and priceCurrency). No recommended properties are profiled here, so a node meeting the requirements passes. Nested property values (an author Person, a provider Organization) are not nodes of their own and are not assessed; a page without a node of the type is not applicable. A page whose structured-data collection fails is not run for every feature, never clean.
Source. https://developers.google.com/search/docs/appearance/structured-data/product-snippet (required: name; one of review, aggregateRating, offers; offers need price, AggregateOffer lowPrice and priceCurrency)
Detection: detect_structured_data; needs dom.
Failing example
The check reports a violation here. Corpus case schema_rules_graph_and_arrays. The page may contain further findings for other rules.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Nodes in @graph and in a top-level array</title>
<script type="application/ld+json">
{"@context": "https://schema.org", "@graph": [{"@type": "Organization", "@id": "https://example.com/#org", "name": "Example Inc", "url": "https://example.com", "logo": "https://example.com/logo.png", "address": {"@type": "PostalAddress", "streetAddress": "Main Street 1"}, "telephone": "+1-555-0100", "sameAs": ["https://social.example/example"]}, {"@type": "WebSite", "@id": "https://example.com/#site", "name": "Example", "url": "https://example.com", "inLanguage": "en", "publisher": {"@id": "https://example.com/#org"}, "potentialAction": {"@type": "SearchAction", "target": "https://example.com/?q={q}", "query-input": "required name=q"}}, {"@type": "WebPage", "name": "Pricing", "url": "https://example.com/pricing", "description": "Plans", "inLanguage": "en", "isPartOf": {"@id": "https://example.com/#site"}}, {"@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/"}, {"@type": "ListItem", "position": 2, "name": "Pricing"}]}, {"@type": "Product", "name": "Plan"}]}
</script>
<script type="application/ld+json">
[{"@context": "https://schema.org", "@type": "https://schema.org/BlogPosting", "headline": "Post", "author": {"@type": "Person", "name": "Ada"}, "datePublished": "2026-01-01", "dateModified": "2026-01-02", "image": "https://example.com/p.jpg"}, {"@context": "https://schema.org", "@type": "Person", "name": "Ada Example", "url": "https://example.com/ada", "image": "https://example.com/ada.jpg", "jobTitle": "Engineer", "worksFor": {"@type": "Organization", "name": "Example"}, "sameAs": ["https://social.example/ada"]}]
</script>
</head>
<body>
<header><p>Example</p></header>
<main>
<h1>Nodes in @graph and in a top-level array</h1>
<p>Structured data corpus page.</p>
</main>
<footer><p>Footer</p></footer>
</body>
</html>Passing example
The check passes here and reports nothing. Corpus case schema_rules_merchant_listing_complete. The page may contain further findings for other rules.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Espresso grinder</title>
<script type="application/ld+json">
{"@context": "https://schema.org", "@type": "Product", "name": "Espresso grinder", "image": "https://example.com/grinder.jpg", "description": "Conical burr grinder", "sku": "EG-1", "brand": {"@type": "Brand", "name": "Example"}, "offers": {"@type": "Offer", "price": "89.00", "priceCurrency": "EUR", "availability": "https://schema.org/InStock"}}
</script>
</head>
<body>
<header><p>Example</p></header>
<main>
<h1>Espresso grinder</h1>
<p>Price: 89.00 EUR. In stock, ships in two days.</p>
<label for="qty">Quantity</label> <input id="qty" type="number" value="1" min="1">
<button type="button">Add to cart</button>
<p><a href="/cart">View cart</a> · <a href="/checkout">Checkout</a></p>
</main>
<footer><p>Footer</p></footer>
</body>
</html>This page is generated from the rule catalogue and the rule contracts; see therule overview for how the outcome classes are derived.