auditmysitev2.0.2

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.

schema_rules_graph_and_arrays.htmlHTML
<!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.

schema_rules_merchant_listing_complete.htmlHTML
<!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.