SEO

Product schema per l'e-commerce, con il prezzo giusto

Product schema è un blocco JSON-LD che dichiara nome, immagine, prezzo e disponibilità di una pagina prodotto. Va nella pagina, e il prezzo deve coincidere.

In sintesi

  • Product schema descrive una pagina di prodotto con @type Product: nome, immagine e un'offerta con prezzo e valuta.
  • Google separa Product snippets, per le pagine senza acquisto, e Merchant listings, per quelle dove si compra.
  • Un prezzo nel markup diverso dal prezzo visibile è una discrepanza semantica che nessun validatore segnala.

Product schema è un blocco JSON-LD con @type Product che dichiara nome, immagine, prezzo e disponibilità di una pagina di prodotto. Si scrive dentro la pagina, non nel feed, e deve ripetere ciò che l'utente vede.

Due tipi, non uno

Google documenta due insiemi di requisiti. Product snippets copre le pagine dove non si compra, per esempio una recensione, e chiede name, image e almeno uno fra offers, review e aggregateRating. Merchant listings copre le pagine dove si compra e aggiunge i dettagli di vendita: spedizione e politica di reso. Fonte: pagina Product structured data di Google Search Central, letta il 1 novembre 2026.

Il blocco minimo

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Camicia in lino",
  "image": ["https://example.com/img/camicia-lino.jpg"],
  "sku": "CAM-LIN-01",
  "brand": { "@type": "Brand", "name": "Example" },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/prodotti/camicia-lino",
    "price": "79.00",
    "priceCurrency": "EUR",
    "availability": "https://schema.org/InStock"
  }
}

I campi che decidono il risultato: name uguale al titolo visibile, image con URL assoluto, offers.price come stringa senza simbolo di valuta, offers.priceCurrency in ISO 4217 e offers.availability come URL schema.org, per esempio https://schema.org/InStock. sku, gtin13, mpn e brand identificano il prodotto quando esiste un catalogo; senza identificatori Google confronta solo testo e prezzo.

Il prezzo deve coincidere

Un prezzo nel markup diverso dal prezzo in pagina è una discrepanza, non un errore di sintassi: nessun validatore la vede, e Google può applicare un'azione manuale. Il caso tipico è la pagina variante, dove il selettore taglia cambia il prezzo via JavaScript e il JSON-LD resta sul valore base. Se le varianti sono reali, il markup corretto è ProductGroup con hasVariant, non dieci Product scollegati.

La verifica prima del deploy

cat > check-product.mjs  s.slice(s.indexOf(">") + 1, s.indexOf("")));
const blocks = raw.map((s) => JSON.parse(s)).filter((j) => j["@type"] === "Product");
for (const p of blocks) {
  const o = p.offers || {};
  console.log(p.name, o.price, o.priceCurrency, o.availability);
}
console.log(`${blocks.length} Product blocks`);
EOF
curl -s https://ui.eneawork.it/blocks/creativetimofficial-ui/product-details-01 > page.html
node check-product.mjs page.html

Lo script separa ogni blocco JSON-LD, tiene i Product e stampa nome, prezzo, valuta e disponibilità. Sul blocco product-details-01 stampa 0 Product blocks: un blocco di layout contiene il posto del prezzo, non il prezzo. Il dato va aggiunto dal tuo strato dati, e lo script dice subito se manca.

Il catalogo EneUI

Per una pagina prodotto i record da guardare sono product-detail-01 di commercn, la product card di Ravikatiyar e il checkout interattivo di Kokonut UI, licenza MIT. La categoria pricing raccoglie 41 blocchi per la parte commerciale. Nessuno di questi record dichiara un prezzo: sono struttura, e il markup Product va scritto sopra leggendo i dati veri. Verificato il 1 novembre 2026.

La limitazione

Product schema non crea un merchant listing completo. Per la scheda ricca con spedizione, resi e venditori Google usa anche il feed di Merchant Center, e senza identificatori il risultato resta più povero. Su un catalogo con varianti il markup di una pagina che ne copre dieci richiede ProductGroup: un Product per variante, tutti collegati, altrimenti la pagina dichiara un prodotto che non esiste.

Dove continuare

Il formato generale del markup è in schema FAQPage passo per passo; i blocchi per un negozio sono in blocchi per e-commerce; la sequenza per aprire il negozio è in creare un sito e-commerce.

Domande frequenti

Product schema è obbligatorio?

No. È un'aggiunta volontaria che aiuta Google a capire la pagina e può produrre un rich result. Senza markup la pagina resta valida, ma perde i dettagli di prezzo e disponibilità nel risultato.

Dove va messo il prezzo?

In offers.price, come stringa senza simbolo, con offers.priceCurrency in ISO 4217. Il valore deve coincidere con il prezzo visibile e con quello del checkout.

Serve un feed Merchant Center?

Per i Product snippets no: basta il JSON-LD nella pagina. Per i merchant listings completi, con spedizione e resi, Google legge anche il feed, e i due dati devono concordare.

Posso marcare più prodotti nella stessa pagina?

Sì. Un blocco per prodotto, oppure un ItemList che li elenca, purché ogni Product abbia il proprio URL e il proprio prezzo. Non duplicare lo stesso prodotto con dati diversi.

Cosa faccio se il prezzo cambia spesso?

Aggiorna il markup nella stessa richiesta che aggiorna il prezzo visibile, e aggiorna updatedAt della pagina. Un prezzo vecchio nel JSON-LD è la causa più comune di azione manuale su un negozio.