Product Structured Data

No Comments
Product structured data

What product structured data is

Product structured data is machine-readable markup — usually Product plus Offer, and optionally AggregateRating or Review — that you embed as JSON-LD so search engines can read your price, availability, and ratings directly instead of guessing from the page. It matters because that markup is what makes you eligible for merchant listing rich results: the price, stock, and star ratings that show under your listing and pull the eye away from plainer competitors.

No markup, no rich result. You can have the best product page on the internet, but if Google can't parse a valid Offer with a price and availability, you don't qualify for the enhanced treatment. This is the on-page half of ecommerce visibility; the feed in Merchant Center is the other half, and the two must agree.

A real Product JSON-LD block

Here's a complete, valid block with Product, Offer, and AggregateRating. This is the shape Google expects — copy the structure, swap your values, and keep every field in sync with what the page renders:

<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "Product",
  "name": "Cast Iron Skillet 12" Pre-Seasoned",
  "image": [
    "https://cdn.example.com/img/skillet-12-front.jpg",
    "https://cdn.example.com/img/skillet-12-side.jpg"
  ],
  "description": "Pre-seasoned 12-inch cast iron skillet, oven-safe to 500F.",
  "sku": "SKU-7781",
  "gtin13": "0847391002345",
  "brand": { "@type": "Brand", "name": "Example Forge" },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/products/cast-iron-skillet-12",
    "priceCurrency": "USD",
    "price": "39.95",
    "priceValidUntil": "2026-12-31",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.7",
    "reviewCount": "218"
  }
}
</script>

Rule that trips people up: aggregateRating and review must reflect ratings genuinely visible on the page, and every value here must match what a shopper sees. Marking up a $39.95 price while the page shows $49.95 is a violation, not a shortcut.

Which properties do what

Not all fields carry equal weight. Some are required for eligibility, some strongly recommended, and some are the ones that actually earn the visual upgrades in search.

PropertyTypeStatusWhy it matters
nameProductRequiredThe product identity; no name, no valid Product
imageProductRecommendedPowers the thumbnail in rich results
offers > price + priceCurrencyOfferRequired for priceThe price shown in the merchant listing
offers > availabilityOfferRecommendedIn-stock/out-of-stock signal that drives clicks
gtin / mpn / brandProductStrongly recommendedProduct identity; ties page to feed and catalog
aggregateRatingProductOptionalThe star rating — must match visible reviews
priceValidUntilOfferRecommendedPrevents "expired price" warnings in reports

Getting the required set right earns eligibility; getting availability, aggregateRating, and clean identifiers right is what earns the rich results that outshine the plain blue links around you.

How to check product structured data on your own site

  1. Run the Rich Results Test. Paste a product URL into Google's Rich Results Test. Confirm it detects "Product snippets" or "Merchant listings" with no errors — warnings are okay to triage, errors are not.
  2. Validate against the vocabulary. Cross-check the same URL in the Schema.org validator to catch malformed types or misspelled properties the Rich Results Test tolerates.
  3. Confirm parity with the visible page. Compare the JSON-LD price, availability, and rating to what actually renders. Any mismatch risks a manual action or silent suppression.
  4. Check the Merchant listings report in Search Console. Enhancements > Merchant listings (or Product snippets). Watch for invalid items trending up after a template change.
  5. Verify it survives rendering. If your JSON-LD is injected by JavaScript, use the URL Inspection tool's rendered HTML to confirm Google actually sees it. If it's not in the rendered DOM, it doesn't count — see the guide to debugging structured data when rich results fail.

Common mistakes and how to fix them

  • Price in markup ≠ price on page. Classic cause of lost eligibility and manual actions. Fix: generate JSON-LD from the same data that renders the price, not a hardcoded template value.
  • Fake or self-serving ratings. Marking up ratings not visible on the page (or inventing them) violates policy. Fix: only mark up real, on-page review data.
  • Missing GTIN/brand. Weakens identity and can limit merchant listings. Fix: include gtin/mpn/brand, and keep them consistent with your feed.
  • Markup buried in client-side JS Google never renders. If it's not in the rendered DOM, it's invisible. Fix: server-render the JSON-LD or confirm it appears in rendered HTML.
  • Stale priceValidUntil or wrong availability. Triggers warnings and undercuts trust. Fix: automate these from live data and tie stock states to your inventory workflow.

Frequently asked questions

Does product structured data guarantee rich results?

No. Valid markup makes you eligible, but Google decides when to show rich results based on quality, relevance, and trust. Clean, accurate markup is necessary but not sufficient — think of it as qualifying for the race, not winning it.

What's the difference between product schema and a Merchant Center feed?

Product schema is on-page markup for regular Search rich results; the feed powers the Shopping tab and free product listings. Run both, and make sure they never contradict each other on price or availability.

Should I use JSON-LD, Microdata, or RDFa?

JSON-LD. Google recommends it, it's the easiest to maintain because it sits in a single script block, and it keeps markup separate from your HTML so template changes are less likely to break it.

Do I need AggregateRating to qualify?

No. Product plus a valid Offer (price, currency, availability) is enough for merchant listing eligibility. AggregateRating adds the star rating on top — powerful for clicks, but only when the reviews are real and visible on the page.

Why do my rich results keep disappearing?

Usually markup that Google can't render, price/availability drift, or an invalid-items spike after a template change. Re-test the URL, confirm the JSON-LD is in the rendered DOM, and reconcile every value against the visible page. Full walkthrough in the product schema guide.

Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.

About SEO ProCheck

Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.

Work With Me

Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.

Subscribe to our newsletter!

More from our blog