Recently, I ran into Aymeric Bouillat at Lab FormaSEO, which took place Wednesday and Thursday in Nantes. A really good time among search enthusiasts. Among the topics he enthusiastically covered were structured data.
By the way, he even presented a custom GPT he designed to generate schemas without hallucinations. Handy, especially when you want to avoid common mistakes or phantom properties.
And naturally, it made me want to take stock. A useful, simple, and concrete guide for e-merchants who want to integrate the right microdata in the right places.
Because in the era of generative AI, structured data no longer serves only Google. It also feeds LLMs like those from OpenAI, Perplexity, Claude, or Mistral. Better-structured pages also make you more understandable to conversational agents.
1. Product
Describes an individual product with its basic information: name, image, description, SKU, brand, etc.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Glutamine",
"image": [
"https://cdn.shopify.com/s/files/1/0274/3669/3508/products/glutamine-dijo.jpg?v=1678373123"
],
"description": "La Glutamine de Dijo est un complément alimentaire favorisant la santé intestinale, la récupération musculaire et la perméabilité intestinale.",
"sku": "GLUTAMINE",
"brand": {
"@type": "Brand",
"name": "Dijo"
},
"offers": {
"@type": "Offer",
"url": "https://www.dijo.fr/products/glutamine",
"priceCurrency": "EUR",
"price": "24.90",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
},
"mainEntityOfPage": "https://www.dijo.fr/products/glutamine"
}
Is not sufficient on its own to trigger a rich display. Combine it with Offer and possibly Review.
2. Offer
This stays classic but fundamental. The Offer schema enriches Product with commercial information: price, currency, availability, item condition.
{
"@context": "https://schema.org/",
"@type": "Offer",
"url": "https://www.example.com/tshirt-bio",
"priceCurrency": "EUR",
"price": "29.90",
"priceValidUntil": "2025-12-31",
"itemCondition": "https://schema.org/NewCondition",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "Organization",
"name": "GreenStyle"
}
}
Include it inside Product under the offers property. The priceValidUntil field isn’t mandatory, but it shows Google that the information is up to date.
3. Review + Aggregate Rating
There’s no point in showing five stars if they’re not on the page. Google checks and can even penalize in some cases (though that’s very rare). If your products are genuinely rated (and it’s visible), use this markup.
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "T-shirt coton bio",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.4",
"reviewCount": "27"
},
"review": {
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5"
},
"author": {
"@type": "Person",
"name": "Jean Dupont"
},
"reviewBody": "Excellent produit, agréable à porter et éthique."
}
}
Preferably, display the stars visible above the fold
4. Merchant Return Policy
A clearly displayed return policy = a cart that’s more likely to convert.
{
"@context": "https://schema.org",
"@type": "MerchantReturnPolicy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn",
"returnPolicyCountry": "FR"
}
Recommended for Google Merchant Center. Can be nested inside Product.
5. Offer Shipping Details
Specifies delivery methods (destinations, rates, times).
{
"@context": "https://schema.org",
"@type": "OfferShippingDetails",
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "FR"
},
"shippingRate": {
"@type": "MonetaryAmount",
"value": "4.90",
"currency": "EUR"
},
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": {
"@type": "QuantitativeValue",
"minValue": 1,
"maxValue": 2,
"unitCode": "d"
},
"transitTime": {
"@type": "QuantitativeValue",
"minValue": 2,
"maxValue": 3,
"unitCode": "d"
}
}
}
To be used alongside the Offer schema. Compatible with Merchant Center and useful for SEO on product pages.
6. ProductGroup
Allows grouping product variants (color, size, etc.).
{
"@context": "https://schema.org",
"@type": "ProductGroup",
"name": "T-shirt coton bio",
"description": "T-shirt unisexe décliné en plusieurs tailles et couleurs",
"brand": {
"@type": "Brand",
"name": "GreenStyle"
},
"variesBy": "size, color",
"hasVariant": [
{
"@type": "Product",
"name": "T-shirt coton bio - Taille M - Bleu",
"sku": "TSHIRT123-BLEU-M",
"color": "Bleu",
"size": "M"
},
{
"@type": "Product",
"name": "T-shirt coton bio - Taille L - Vert",
"sku": "TSHIRT123-VERT-L",
"color": "Vert",
"size": "L"
}
]
}
Prefer this if you have advanced product variant management (e.g., marketplaces, major brands).
7. Breadcrumb List
Structuring navigation helps users… and search engines.
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Accueil",
"item": "https://www.example.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Vêtements",
"item": "https://www.example.com/vetements"
},
{
"@type": "ListItem",
"position": 3,
"name": "T-shirt coton bio",
"item": "https://www.example.com/vetements/tshirt-bio"
}
]
}
Add it to the HTML header or the JSON-LD of each product page, preferably near the top with a polished UX to facilitate breadcrumb navigation for your visitors (remember the mobile version too).
8. Organization
Even without a physical store, your business deserves a clean profile. Organization markup builds trust.
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "DIJO",
"legalName": "PROBIOPHARMA",
"alternateName": "Dijo",
"url": "https://www.dijo.fr",
"logo": "https://www.dijo.fr/cdn/shop/files/logo-dijo.png",
"founder": {
"@type": "Person",
"name": "Anouk Le Terrier"
},
"foundingDate": "2019",
"address": {
"@type": "PostalAddress",
"streetAddress": "646 route des digues",
"postalCode": "14123",
"addressLocality": "Fleury-sur-Orne",
"addressCountry": "FR"
},
"vatID": "FR30852588102",
"iso6523Code": "0009:852588102",
"mainEntityOfPage": "https://www.dijo.fr/policies/terms-of-sale"
}
Include on all brand and legal pages (e.g., About Us).
9. Local Business
If you have stores, this is where it belongs. Google loves clean info: address, opening hours, phone number.
{
"@context": "https://schema.org",
"@type": "AutoRepair",
"name": "Carglass® Nantes Descartes",
"image": "https://www.carglass.fr/sites/default/files/logo-carglass.svg",
"url": "https://www.carglass.fr/centre/44000-100000001873346/nantes-descartes-ef-3339-connect",
"telephone": "+33977402480",
"address": {
"@type": "PostalAddress",
"streetAddress": "Rue Descartes, Parking Effia niveau 0, places 3 à 7",
"addressLocality": "Nantes",
"postalCode": "44000",
"addressCountry": "FR"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 47.2375,
"longitude": -1.5539
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
],
"opens": "08:30",
"closes": "19:00"
}
],
"amenityFeature": [
{
"@type": "LocationFeatureSpecification",
"name": "Wi-Fi",
"value": true
}
],
"priceRange": "€€",
"mainEntityOfPage": "https://www.carglass.fr/centre/44000-100000001873346/nantes-descartes-ef-3339-connect",
"description": "Centre Carglass® à Nantes Descartes pour la réparation et le remplacement de vitrages automobiles : pare-brise, vitres latérales, lunettes arrière. Garantie à vie, déplacement gratuit, accompagnement avec votre assureur."
}
Duplicate for each store listing.
10. Website + SearchAction
Declares the site's internal search function and can make a search field appear in Google results.
{
"@context": "https://schema.org",
"@type": "WebSite",
"url": "https://www.example.com/",
"potentialAction": {
"@type": "SearchAction",
"target": "https://www.example.com/recherche?q={search_term_string}",
"query-input": "required name=search_term_string"
}
}
Works only if the site's internal search is actually functional for users. Do not use a static URL (the target must be dynamic with the parameter).
11. VideoObject
A video is worth a thousand descriptions.
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "Présentation du T-shirt GreenStyle",
"description": "Découvrez les caractéristiques du t-shirt en coton bio GreenStyle",
"thumbnailUrl": "https://www.example.com/images/video-thumb.jpg",
"uploadDate": "2025-04-20T08:00:00+00:00",
"duration": "PT1M45S",
"contentUrl": "https://www.example.com/videos/tshirt-demo.mp4",
"embedUrl": "https://www.youtube.com/embed/xyz123",
"publisher": {
"@type": "Organization",
"name": "GreenStyle",
"logo": {
"@type": "ImageObject",
"url": "https://www.example.com/logo.png",
"width": 600,
"height": 60
}
}
}
The VideoObject markup (and its extensions such as Clip, BroadcastEvent, SeekToAction, etc.) must be used only on a “watch page”, that is, a page where the video is the main content element.
Other microdata useful in certain cases
Here are some secondary schemas that can prove useful depending on the nature of your activity:
- HowTo : for user guides or practical tutorials (e.g., "how to assemble this piece of furniture")
- ProfilePage / Person : to present third-party sellers or review authors
- Event : useful if you organize private sales, trade shows, live shopping
- Software Application : if you sell apps or plugins
- Book : for bookstores or ebook sellers
- ImageObject : for images with credits, in a creative or artistic context
- WarrantyPromise : to indicate product warranty duration
- Energy Consumption Details : for household appliances
As a bonus: ItemList
A practical schema to structure a category page or a list of results
{
"@context": "https://schema.org",
"@type": "ItemList",
"name": "iPhone 13 reconditionnés",
"description": "Découvrez tous les modèles d’iPhone 13 reconditionnés disponibles sur Largo.",
"url": "https://www.largo.fr/iphone-13-reconditionne/",
"itemListElement": [
{
"@type": "Product",
"name": "iPhone 13 reconditionnés",
"image": "https://www.largo.fr/wp-content/uploads/2023/06/iPhone-13-reconditionne.webp",
"description": "Sélection d’iPhone 13 reconditionnés en différents coloris, capacités et états.",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"reviewCount": "320"
},
"offers": {
"@type": "AggregateOffer",
"offerCount": 48,
"lowPrice": "399",
"highPrice": "699",
"priceCurrency": "EUR"
}
}
]
}
I often tend to use a product schema with the high price, low price and the different offers from the listing page to make stars, stock and a price range stand out on Google

To test your schemas
Before going live, validatevalidate your schemas with the two recommended tools:
- validator.schema.org
- search.google.com/test/rich-results (my personal preference : more precise and closer to what Google actually takes into account)
The article “11 e‑commerce microdata to implement on your store” was published on the site Abondance.
