Clienti

Structured Data for Ecommerce: Product Schema, Offers, Reviews and FAQ Schema

How we approach product schema in 2026: what Google and AI engines actually read from your markup, copy-ready JSON-LD for single and variant products, and how to keep it in step with your feed.

The short answer

Product schema is structured data, usually JSON-LD written with the schema.org vocabulary, that states a product page's facts in a form machines read without guessing: name, brand, GTIN, attributes, price, stock, shipping, returns, ratings. Google uses it for merchant listings and product snippets. Merchant Center checks feed data against it, and AI systems use it to confirm what you actually sell.

01

Product schema in 30 seconds

Product schema tells search engines and AI systems what you sell, what it costs and what it's made of. It earns its keep only when it agrees with the page and the feed.

  1. 01

    Product schema is JSON-LD that states a product's facts outright (brand, GTIN, price, stock, shipping, returns, ratings, variants) so crawlers don't infer them from your layout.

  2. 02

    Google uses it for two rich result types: merchant listings on pages where people buy, and product snippets on pages that review or compare products.

  3. 03

    Treat schema as a promise about your product. It pays off only when it matches the visible page and your Merchant Center feed, field for field.

  4. 04

    FAQ rich results disappeared from Google Search on May 7, 2026. Keep the FAQ content anyway, because shoppers now put those exact questions to AI assistants.

  5. 05

    No special markup gets you into AI Overviews or ChatGPT. Complete product data that says the same thing everywhere does.

03

What schema should a product page have?

One Product per page (or a ProductGroup when you sell variants) with a nested Offer. Add AggregateRating and Review only when real reviews are visible. Shipping and return policies go on Organization, and a BreadcrumbList covers the category path.

The schema types a product page needs

Schema typeWhere it goesStatus for a buyable productWhat it powers
ProductProduct detail pageRequired: name, image, offersMerchant listings, product snippets, Shopping understanding
OfferNested in Product.offersRequired: price above zero, priceCurrencyPrice, availability, sale price and strikethrough display
AggregateRating and ReviewNested in ProductRecommended, only if visible on the pageStar ratings and review counts
ProductGroupParent of variant productsRecommended for sizes, colors, materialsVariant grouping in merchant listings
OfferShippingDetailsOrganization or OfferRecommendedShipping cost and delivery time in results
MerchantReturnPolicyOrganization or OfferRecommendedReturn window and fees in results
BreadcrumbListEvery product and category pageRecommendedCategory path shown instead of the raw URL

Product and Offer: the required core

The required list is short. Google's merchant listing documentation asks for name, image and offers on the Product, plus price (above zero) and priceCurrency (ISO 4217) on a single Offer.

Most themes stop there. The recommended list is where catalogs differ: brand.name, description, color, material, pattern, size, sku, mpn, a GTIN (gtin8 to gtin14), and on the offer availability, itemCondition and url. Shoppers filter on them; agents match against them. An empty material field costs more than a missing star rating.

Two details catch European stores. price takes a dot as decimal separator and no currency symbol, so "89.00" is valid and "89,00 €" isn't. And GTINs that pass through Excel lose their leading zero, turning a 12 digit UPC into an 11 digit string that fails the check digit. If a product has no GTIN at all, leave the field out and send mpn with brand, as our guide to GTINs and what to do without them explains.

AggregateRating and Review: the aggregate rating schema rules

Google's review snippet rules require ratingValue and at least one of ratingCount or reviewCount on AggregateRating, and an author plus reviewRating.ratingValue on each Review. Stores that lose their stars usually broke one of these:

  • The rating and count must be visible on the page.
  • Never aggregate ratings from other websites.
  • Rate one specific item, never a category or list, so category pages carry no aggregate rating.
  • Keep the markup count in step with the widget shoppers see.

Shipping and returns follow a different logic. Google recommends defining hasMerchantReturnPolicy and shippingDetails under your Organization, with offer-level versions only as overrides. Check the precedence order before debugging: return settings in Merchant Center or Search Console override your markup.

Product page schema checklist

  • One primary Product per page

    The main entity is the product you sell, and name matches the H1

  • No duplicate Product blocks

    Theme and review app both output it, so keep one

  • Real GTIN or MPN with brand

    Most specific GTIN type, valid check digit, omitted if none is assigned

  • Price matches the page

    Same value and currency, dot decimal, no symbol inside price

  • Attributes are filled

    color, material, size, pattern and audience wherever they apply

  • Ratings only when visible

    AggregateRating shows the same score and count as the page

  • JSON-LD in the initial HTML

    Server-rendered, so Shopping crawls read it reliably

For the copy and UX on that same page, read Product Page Optimization. Once the markup is clean, run the full product page checklist for AI readiness.

04

Merchant listings vs product snippets

Merchant listings are the rich results for pages where people can buy, and they can show price and stock along with shipping and return terms. Product snippets cover pages that review or compare products, so they lean on ratings. Target merchant listings and you're eligible for snippets too.

Which rich results your products qualify for

Merchant listingsProduct snippets
Page typePages where customers can buy from youPages that review, compare or list products without direct purchase
Required markupProduct with name, image and an Offer with price and priceCurrencyProduct with name plus one of review, aggregateRating or offers
Offer typeSingle Offer, price above zeroOffer or AggregateOffer (lowPrice, highPrice, offerCount)
Extra detailsShipping, returns, apparel sizing, variants, member prices, strikethrough pricesPros and cons via positiveNotes and negativeNotes, on editorial reviews only
Search Console reportMerchant listingsProduct snippets

Google's product structured data overview spells out the overlap. Add the required properties for merchant listings and your product pages are also eligible for product snippets. We rarely see a reason for a store to target snippets alone.

Feeds, markup or both

Google takes product data from markup, a Merchant Center feed, or both, and says sending both maximizes eligibility and helps it verify your data.

If you already run a feed, markup is cheap insurance. With markup alone, you can't run Shopping ads. The feed side is covered in Google Merchant Center.

05

Product schema example: complete JSON-LD for a product page

Two copy-ready JSON-LD templates: a single buyable product, and a variant product built on ProductGroup. Put them in a <script type="application/ld+json"> tag in the server-rendered HTML, with values that match the page.

Product schema example: single product JSON-LD

An illustrative example for a fictional merino sweater sold in the US.

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Northvale Merino Crew Neck Sweater, Navy",
  "description": "Midweight crew neck sweater knitted from 100% extra-fine merino wool. Regular fit, ribbed cuffs and hem, machine washable on wool cycle.",
  "image": [
    "https://www.example.com/img/merino-crew-navy-1x1.jpg",
    "https://www.example.com/img/merino-crew-navy-4x3.jpg"
  ],
  "sku": "NV-MCS-NAV-M",
  "gtin13": "5901234123457",
  "brand": {
    "@type": "Brand",
    "name": "Northvale"
  },
  "color": "Navy",
  "material": "Merino wool",
  "size": "M",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": 4.7,
    "reviewCount": 212
  },
  "offers": {
    "@type": "Offer",
    "url": "https://www.example.com/products/merino-crew-navy?size=m",
    "price": 89,
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition",
    "shippingDetails": {
      "@type": "OfferShippingDetails",
      "shippingRate": {
        "@type": "MonetaryAmount",
        "value": 0,
        "currency": "USD"
      },
      "shippingDestination": {
        "@type": "DefinedRegion",
        "addressCountry": "US"
      },
      "deliveryTime": {
        "@type": "ShippingDeliveryTime",
        "handlingTime": {
          "@type": "QuantitativeValue",
          "minValue": 0,
          "maxValue": 1,
          "unitCode": "DAY"
        },
        "transitTime": {
          "@type": "QuantitativeValue",
          "minValue": 3,
          "maxValue": 5,
          "unitCode": "DAY"
        }
      }
    },
    "hasMerchantReturnPolicy": {
      "@type": "MerchantReturnPolicy",
      "applicableCountry": "US",
      "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
      "merchantReturnDays": 30,
      "returnMethod": "https://schema.org/ReturnByMail",
      "returnFees": "https://schema.org/FreeReturn"
    }
  }
}

The offer url preselects size M, so the markup describes exactly what a shopper lands on. Shipping and returns sit inside the offer only to keep the example self-contained; on a real store we'd define them once on Organization.

Product structured data for variants: ProductGroup JSON-LD

Google has supported product variant markup since 2024. The ProductGroup holds the shared facts plus a productGroupID (the parent SKU). variesBy lists the attributes that change, and each variant is a full Product under hasVariant. Google accepts six variesBy values: color, size, material, pattern, suggestedAge, suggestedGender.

{
  "@context": "https://schema.org",
  "@type": "ProductGroup",
  "name": "Northvale Merino Crew Neck Sweater",
  "url": "https://www.example.com/products/merino-crew",
  "brand": {
    "@type": "Brand",
    "name": "Northvale"
  },
  "productGroupID": "NV-MCS",
  "variesBy": [
    "https://schema.org/size",
    "https://schema.org/color"
  ],
  "hasVariant": [
    {
      "@type": "Product",
      "sku": "NV-MCS-NAV-M",
      "gtin13": "5901234123457",
      "name": "Northvale Merino Crew Neck Sweater, Navy, M",
      "image": "https://www.example.com/img/merino-crew-navy.jpg",
      "color": "Navy",
      "size": "M",
      "offers": {
        "@type": "Offer",
        "url": "https://www.example.com/products/merino-crew?color=navy&size=m",
        "price": 89,
        "priceCurrency": "USD",
        "availability": "https://schema.org/InStock"
      }
    },
    {
      "@type": "Product",
      "sku": "NV-MCS-OAT-L",
      "name": "Northvale Merino Crew Neck Sweater, Oatmeal, L",
      "image": "https://www.example.com/img/merino-crew-oatmeal.jpg",
      "color": "Oatmeal",
      "size": "L",
      "offers": {
        "@type": "Offer",
        "url": "https://www.example.com/products/merino-crew?color=oatmeal&size=l",
        "price": 89,
        "priceCurrency": "USD",
        "availability": "https://schema.org/OutOfStock"
      }
    }
  ]
}

This is the template we find broken most often. The theme outputs one Product with a single Offer for the whole family, so every size shares one price, and the GTIN belongs to whichever variant loaded first.

Single-page or multi-page variants

Single-page variants

Variants share one URL, selected with query parameters. The ProductGroup gets one canonical url, each variant a preselectable URL like ?color=navy&size=m.

Multi-page variants

Each variant has its own page, carrying a complete ProductGroup that lists siblings by url only and omits the group-level url.

Variants can also point back to the group with isVariantOf or inProductGroupWithID. Either way, mirror the grouping in your feed with item_group_id. We use the same value as productGroupID.

06

FAQ schema on product pages: still worth it in 2026?

For Google rich results, no. FAQ rich results stopped appearing in Google Search on May 7, 2026, after being limited to government and health sites since 2023. The content still matters, because product FAQs answer the narrow questions shoppers put to AI assistants.

What changed for FAQ schema

DateChange
August 2023Google limited FAQ rich results to well-known, authoritative government and health websites
May 7, 2026FAQ rich results stopped appearing in Google Search for all sites
June 2026FAQ search appearance, rich result report and Rich Results Test support removed
August 2026FAQ data removed from the Search Console API

Search Engine Journal, quoting Google's notice, reports that existing FAQ markup can stay without causing problems. It just won't show anything in Google Search.

Many teams took this as a cue to delete product FAQs. We think that's a mistake, and our article on FAQ schema for product pages explains why.

Why FAQ content still helps AI answers

Assistants get narrow questions. "Can this sweater go in the washing machine?" "Does it run small?" A page that answers them in visible text gives the assistant a sentence to quote.

ChatGPT
Demo illustrativa
Scrivo la domanda
Illustrative example

Google's AI features guidance favors text content and crawlable pages over special markup. OpenAI's product feed reference says question-and-answer lists "are not part of this discovery contract", so your FAQs have to live on the page, where crawlers and agents can read them.

What good product FAQs cover

  • Fit and sizing: how it fits, model measurements, size advice
  • Care and materials: washing instructions, composition, durability
  • Compatibility: which devices, refills or accessories it works with
  • Use cases: who it is for and when to use it

The best questions usually sit in customer service tickets. In FAQPage markup, each Question sits in mainEntity with an acceptedAnswer of type Answer.

07

Validation, common errors and schema vs feed consistency

Validate each template in the Rich Results Test, then check live pages with URL Inspection. Then watch the Search Console and Merchant Center reports. Most errors go away once page and schema come from the same record as the feed.

How to validate product structured data

  1. 1

    Test the template

    Run a URL or code snippet through the Rich Results Test. Fix errors first, then look at warnings for GTIN, brand or shipping.

  2. 2

    Inspect the rendered page

    Use URL Inspection and read the tested HTML. Google advises Product markup in the initial HTML, since JavaScript-generated markup can make Shopping crawls less frequent and reliable.

  3. 3

    Monitor the reports

    Watch the Merchant listings and Product snippets reports for items falling out of the valid count.

  4. 4

    Cross-check Merchant Center

    Issues such as "Mismatched value (page crawl) [price]" show exactly where feed and page disagree.

  5. 5

    Re-test after every release

    Theme updates and new apps often duplicate or break JSON-LD.

Don't treat every warning as urgent. An optional priceValidUntil can wait. A missing GTIN on an advertised product can't.

Common product schema errors and how to fix them

ErrorTypical causeFix
Missing field "offers"Out-of-stock template drops the OfferKeep it and set availability to OutOfStock
Price mismatch with the pageSale price shown, regular price in markupGenerate markup from the same price source as the template
Invalid GTINInternal SKU entered as gtinUse the real GTIN, or omit it and send mpn with brand
Rating not visibleReviews load only on clickShow score and count on load, or drop aggregateRating
Wrong variant dataOne Offer for all sizesOne Product and Offer per variant in a ProductGroup
Duplicate Product itemsTheme and review app both output JSON-LDKeep one source and merge the rating into it

Schema vs feed consistency: one product, one truth

Google reads your product facts on the page, in the JSON-LD and in the Merchant Center feed. With automatic item updates switched on (it's the default), Google uses landing page data, structured data included, to correct price and availability in Shopping ads and free listings. If the feed says $4 and the page says $3, Google uses $3. Too many mismatches can mean disapprovals or switch the automation off.

AI agents add more readers. ChatGPT reads merchant feeds built on OpenAI's product feed spec (title, description, gtin, brand, price, availability) and sends shoppers to the product url. Every disagreement erodes trust.

1

Single source

Where does each fact live?

One record in your PIM, ERP or platform

2

Generate

How are schema and feed produced?

From the same fields, never by hand

3

Sync

When do they update?

Price and stock changes push everywhere at once

4

Monitor

How do you catch drift?

Search Console and Merchant Center diagnostics, weekly

Run it on every change and the three sources never drift apart.

For crawling and indexing, see Ecommerce SEO. Feed hygiene has its own guide in Product Feed Optimization.

08

Product structured data with AndromedAI

AndromedAI fixes the product data underneath your schema and feed, the same data AI agents read, and publishes one record to your store and Merchant Center.

Where structured data quality really comes from

Themes write JSON-LD automatically. They can't write data that doesn't exist. If material is blank in your catalog, it's blank in your schema, in your feed and in every AI answer that mentions you.

That's the layer we work on, SKU by SKU.

AndromedAI / OptimizerAI Readiness 38/100

title

BeforeMerino Crew Navy

AfterNorthvale Merino Crew Neck Sweater, Navy, 100% Extra-Fine Merino

description

BeforeA cozy knit for cold days.

AfterMidweight crew neck in 100% extra-fine merino wool. Regular fit, ribbed cuffs, machine washable on the wool cycle.

color

Beforenot set

AfterNavy

material

Beforenot set

After100% extra-fine merino wool

size

BeforeM

AfterM (regular fit, runs true to size)

faq

Beforenot set

AfterCan it go in the washing machine? Yes, on the wool cycle.

Illustrative example, AI Readiness Score from 38 to 90

Fix the record and your theme outputs the right-hand version into JSON-LD, template untouched.

How the platform maps to the work

StepAndromedAIWhat it does for structured data
AuditAI Readiness AuditScores pages on Product Data Completeness, Keyword Coverage, Customer Intent Match and Shopping Metadata
Complete and enrichOptimizerExtracts attributes such as color, material, size; rewrites titles, descriptions, bullets, FAQ; adds use cases and intents
Create missing pagesCreatorBuilds complete product pages from brand or supplier data in 12 languages
Cover category demandCategory page optimizerBuilds category pages around real demand
Publish everywhereIntegrationsShopify (native app), Google Merchant Center, Salesforce Commerce Cloud, Adobe Commerce, Shopware, Akeneo, Plytix, WooCommerce: the same record behind the page and its schema, plus the feed

The Brand Kit (tone of voice, rules, examples, glossary, banned words) keeps content on brand. Approval workflows decide what goes live, with auto-approval above an AI Checker score of 4.0. AndromedAI also generates Merchant Center conversational attributes. More than 500 catalogs have been optimized on the platform.

+1,800%

clicks from AI chats

Bomboogie
1 week

to first sales from ChatGPT, with catalog generation costs down 95%

Matassa
+160%

organic traffic and +46.9% sales, 483 hours saved

Semprefarmacia
+80%

add-to-cart in two months

Altaforma Milano
+40%

ROAS, with CPC down 6% and Quality Score 10/10

Instal
09

FAQ

One Product with name, image, brand, a GTIN or MPN and the attributes that apply, plus a nested Offer with price, currency and availability. Add AggregateRating and Review only when visible on the page, define shipping and returns, include a BreadcrumbList, and use ProductGroup for variants.

The smallest valid version is an application/ld+json script tag holding a Product with a name, an image and an Offer with price and priceCurrency. A complete one adds identifiers, attributes, availability, shippingDetails, hasMerchantReturnPolicy and aggregateRating, as in the templates on this page.

Indirectly. Google says AI Overviews and AI Mode need no special schema, though structured data should match the visible page. Microsoft has said schema helps its LLMs understand content. Schema makes price, stock and identifiers unambiguous, which helps AI systems verify a product when page, markup and feed agree.

Merchant listings are for pages where shoppers can buy, and they can show price and availability along with shipping and returns. Product snippets are for pages that review or compare products, and they focus on ratings. Marking up a store page for merchant listings also makes it eligible for product snippets.

FAQ rich results stopped appearing in Google Search on May 7, 2026, so the markup no longer produces a visible Google feature. Existing markup can stay. Visible FAQ content is still worth writing, because it answers what shoppers ask AI assistants about fit, care and use.

Google reads both. Automatic item updates use landing page data, structured data included, to correct feed prices and availability, and frequent mismatches can lead to disapprovals. AI agents such as ChatGPT also read merchant feeds and send shoppers to the product page, so a price or stock value that differs between the two undermines trust in your listing.

10

Glossary

JSON-LD
The structured data format Google recommends, placed in a script tag separate from the visible HTML and written with the schema.org vocabulary.
Product schema
The schema.org Product type and its properties, used to describe a product's identity, offers and ratings.
AggregateRating
The schema.org type that summarizes all ratings for an item with an average value and a rating or review count.
ProductGroup
The schema.org type that groups the variants of one parent product, using productGroupID, variesBy and hasVariant.
Merchant listings
Google rich results for pages where shoppers buy a product, showing price, stock, shipping and returns.
Product snippets
Google rich results for product review or comparison pages, highlighting ratings and reviews.
GTIN
Global Trade Item Number, the 8, 12, 13 or 14 digit GS1 identifier that lets systems match the same product across sites.
Automatic item updates
A Merchant Center feature that uses landing page data and structured data to correct price, availability and condition.

Parlano di noi