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 messageNo Product schema foundwhen no such node exists. No further checks run.product-required: warns with the messageProduct schema missing required propertiesand lists the missing names as items. The required set isnameandimage. When both are present it passes withProduct schema has required properties.product-offers: reports at info status with the messageProduct schema has no offers/pricingand the valueAdd Offer with price and availabilitywhenoffersis absent.product-offer-details: warns with the messageProduct Offer missing price or availabilitywhen the offer lacks either property.product-reviews: emitted only whenrevieworaggregateRatingis present, passing with the messageProduct 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 ID | schema/product |
| Category | Structured Data |
| Scope | Per-page |
| Severity | warning |
| Weight | 6/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.
Related rules
- schema/review: the shape of the
aggregateRatingandreviewnodes 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.