---
name: product-schema-that-earns-listings
description: Use when product pages are valid in the rich results test but show no price, rating, or availability in the search listing.
---

# Product Schema That Earns Listings

Valid schema and eligible schema are different things. Product markup only earns a rich listing when the required fields are present, consistent with what the page visibly shows, and the identifiers resolve. Most implementations pass validation while missing the fields that actually trigger the enhancement, or contradict the rendered page in a way that suppresses it silently.

## What you need first

- the rendered DOM of a product page, not the source HTML
- your GTIN, MPN, and brand data coverage across the catalogue
- Search Console merchant listings and product snippet reports

## Method

1. Validate against the rendered page, since a lot of ecommerce templates inject price and stock client-side and the crawler may see a different value than your JSON-LD claims.
2. Ship offers with price, priceCurrency, availability, and priceValidUntil. A missing currency alone is enough to suppress the price in the listing while still validating.
3. Populate gtin where you have it and mpn plus brand where you do not. Identifier coverage is what separates merchant listing eligibility from a plain product snippet.
4. For variant products use a single product with an offer for each variant, or aggregateOffer with lowPrice and highPrice. Do not emit one Product object per variant on one URL.
5. Only mark up aggregateRating where the reviews are genuinely on that page and visible. Aggregating site-wide ratings onto every product is the most common cause of a structured data manual action.
6. Track the Search Console merchant listings report weekly rather than retesting single URLs - it shows which items are eligible at scale and which are being filtered out.

## What this produces

Product JSON-LD that passes the merchant listing eligibility bar, not just the validator, verified against the rendered page.

## Where this goes wrong

- JSON-LD price drifting from the displayed price because one is cached and the other is not, which suppresses the enhancement silently
- reusing one site-wide review score as aggregateRating on every product page
- omitting priceCurrency or shipping details and assuming a valid test result means the listing will show

---

From the QuQi skill library - https://www.quqi.io/skills/product-schema-that-earns-listings
