squirrelscan
GitHub

Product schema: name, image, offers and review checks

Product markup with no name or image, an Offer missing price or availability, and no rating data. squirrel checks each product page.

What Product schema is

Product is the schema.org type for a thing being sold. It names the product with name and image, describes what it costs through an offers property holding an Offer with price, priceCurrency and availability, and identifies it with brand, sku or gtin. Ratings hang off it as aggregateRating or an array of review nodes.

Google’s guidance is to put the markup on the page that is about that product. A listing page that shows many products is described with ItemList and product snippets rather than a full Product node for each one.

What squirrel checks

The rule reads every script[type="application/ld+json"] on the page and keeps the first Product node from the last script that contains one, matching either a plain @type or an @type array. It emits one to three checks:

  • product-schema: reports at info status with the message No Product schema found when no such node exists. No further checks run.
  • product-required: warns with the message Product schema missing required properties and lists the missing names as items. The required set is name and image. When both are present it passes with Product schema has required properties.
  • product-offers: reports at info status with the message Product schema has no offers/pricing and the value Add Offer with price and availability when offers is absent.
  • product-offer-details: warns with the message Product Offer missing price or availability when the offer lacks either property.
  • product-reviews: emitted only when review or aggregateRating is present, passing with the message Product has review/rating data.

When offers is an array only the first entry is checked, so a product with several offers is judged on one of them. An offer written as a node reference ({"@id": "…#offer"}) is read from the node with that @id anywhere in the page’s JSON-LD. Every property test is a truthiness test rather than a presence test, so a property present but empty, 0 or false counts as missing. A price of 0 is therefore treated as missing, and so is an image of "".

How to fix it

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Ceramic pour-over dripper",
  "image": "https://example.com/dripper.jpg",
  "offers": {
    "@type": "Offer",
    "price": "32.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock"
  }
}
</script>

Put it in the <head> of the product page and keep the price and availability in step with what the page shows a shopper.

JSON-LD wrapped in an @graph array, which is what Yoast, Rank Math and several other generators emit, is read the same as a top-level node: the rule flattens each script before looking for Product.

Rule IDschema/product
CategoryStructured Data
ScopePer-page
Severitywarning
Weight6/10

Enable / disable

Disable this rule

[rules]
disable = ["schema/product"]

Disable all Structured Data rules

[rules]
disable = ["schema/*"]

Enable only this rule

[rules]
enable = ["schema/product"]

enable replaces the default ["*"], so this is the only rule selected. Leave disable out: a rule that matches any disable pattern is skipped even when enable names it. Only an enabled setting under a rule’s own [rule_options] table overrides both lists.

  • schema/review: the shape of the aggregateRating and review nodes this rule only checks for presence.
  • schema/rating-scope: whether a rating is visible to readers and about the page it sits on.
  • schema/json-ld-valid: whether the JSON-LD parses and passes schema.org validation at all.
  • schema/coverage-outlier: product pages missing the markup the rest of the site’s product pages carry.

Structured data findings ship in every audit next to the core SEO, performance and agent experience rules. See Fix SEO issues with AI for how an agent works through a report.

References

Check your site

Run squirrel audit https://example.com and open the Structured Data section of the report. Each product page lists the properties it is missing. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.

Type to search…

↑↓ navigate↵ openesc close