auditmysitev2.0.2

Merchant Listing: missing required properties

seo.schema.schema_rule_missing_merchant_listing

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 on a purchasable product detail page 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. Applies only where the page is a purchasable product detail page; the audit establishes that from the visible page intent (shop) and the product route in the SEO module's derive step. Where that context is not established the Product gets needs_review (context unknown), never a pass or a violation. On a product detail page: fails when name, image or an Offer with price and priceCurrency is missing; with them present and recommended properties missing it is needs_review (Google's Rich Results Test reports missing recommended properties as non-critical issues (eligible, but a human should decide whether the data exists)); all present 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/merchant-listing (required: name, image, offers with price and priceCurrency; recommended: description, sku, brand.name, offers.availability)

Detection: detect_structured_data; needs dom.

Failing example

The check reports a violation here. Corpus case schema_rules_merchant_listing_incomplete. The page may contain further findings for other rules.

schema_rules_merchant_listing_incomplete.htmlHTML
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Milk frother</title>
  <script type="application/ld+json">
  {"@context": "https://schema.org", "@type": "Product", "name": "Milk frother", "offers": {"@type": "Offer", "price": "39.00"}}
  </script>
</head>
<body>
  <header><p>Example</p></header>
  <main>
    <h1>Milk frother</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>

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.