Schema.org JSON-LD : les données structurées pour la recherche Google
Comment choisir, générer et valider des données structurées conformes au contenu visible, et éligibles aux résultats enrichis sans jamais les garantir.
Les données structurées Schema.org forment un vocabulaire que les moteurs de recherche utilisent pour comprendre le contenu des pages. Bien implémentées, elles transforment un snippet ordinaire en résultat enrichi : notes en étoiles, prix des produits, horaires d’ouverture ou photos affichés directement dans les résultats de Google.
Cet article couvre le système complet : du choix du format et de la hiérarchisation des schémas jusqu’au code JSON-LD concret pour Organization, Product, AggregateRating, Review et ImageObject, avec une attention particulière aux sous-types les plus souvent négligés.
<script> → Google analyse la structure → rich snippet avec étoiles de notation et prix directement dans la SERP.Qu’est-ce que Schema.org et pourquoi utiliser les données structurées
Schema.org est un projet commun de Google, Bing, Yahoo et Yandex, lancé en 2011. Le vocabulaire compte plus de 900 types de données et des milliers de propriétés. Tous les types héritent du type de base Thing et se répartissent en Person, Organization, Product, Event, CreativeWork, Action et d’autres.
Correspondre à la page
Le balisage doit décrire des informations que les lecteurs peuvent voir et vérifier.
Respecter les règles de la fonctionnalité
Utilisez un type pris en charge et respectez ses règles de contenu et techniques.
Tester le graphe
Contrôlez la syntaxe et les exigences de la politique, puis inspectez la page après rendu.
Aucune garantie d’affichage
Réussir un test ne garantit pas qu’un résultat enrichi sera affiché.
Le balisage Schema.org répond à trois besoins à la fois. Pour les moteurs de recherche, il identifie sans ambiguïté les entités : il s’agit d’une organisation, et non d’un simple texte portant un nom d’entreprise ; il s’agit d’un prix de produit, et non d’un simple nombre. Pour les internautes, les résultats enrichis rendent le snippet plus informatif avant le clic. Pour l’entreprise, ils améliorent le CTR et renforcent la présence dans le Knowledge Graph.
Formats : JSON-LD, Microdata, RDFa
Les données structurées Schema.org peuvent être ajoutées de trois façons. Pour un nouveau projet, le choix est clair : le JSON-LD. Les deux autres formats sont pris en charge, mais plus difficiles à maintenir.
| Format | Emplacement | Lien avec le HTML | Recommandation Google |
|---|---|---|---|
| JSON-LD | Balise <script type="application/ld+json"> | Séparé du HTML | Préféré |
| Microdata | Attributs itemscope, itemtype, itemprop | Intégré aux éléments HTML | Pris en charge |
| RDFa | Attributs vocab, typeof, property | Intégré aux éléments HTML | Pris en charge |
Le modèle JSON-LD de base est le même pour toutes les pages : une balise <script> de type application/ld+json, contenant un objet JSON avec les champs obligatoires @context et @type. La balise peut être placée dans <head> ou à la fin de <body>. Plusieurs schémas, c’est plusieurs blocs <script> distincts.
<!-- Base JSON-LD template -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Site Name",
"url": "https://example.com"
}
</script>
<!-- Multiple schemas — multiple <script> blocks -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Company",
"url": "https://example.com"
}
</script>Priorité des schémas : ce qui produit des résultats enrichis dans Google
Tous les types Schema.org ne donnent pas un résultat enrichi. Google prend en charge un ensemble limité de types qui apportent des améliorations visuelles dans la SERP. Les autres schémas aident Google à comprendre le contenu, sans modifier l’apparence du snippet.
Entreprises et organisations
LocalBusiness, Restaurant, Store : horaires, adresse, téléphone et notes dans le Knowledge Panel. Priorité absolue pour les entreprises locales.
Produits et prix
Product + Offer : prix, disponibilité et notes directement dans le snippet. Google Shopping et rich snippets. Indispensable pour l’e-commerce.
Contenu et FAQ
Article et les autres types pris en charge doivent représenter fidèlement le contenu visible. Le contenu de type FAQ reste utile aux lecteurs, mais il ne garantit pas une extension du résultat de recherche.
Notes et avis
AggregateRating + Review : notes en étoiles dans le snippet. L’élément le plus visible. Fonctionne pour Product, LocalBusiness, Recipe et Course.
| Type de schéma | Résultat enrichi dans Google | Priorité |
|---|---|---|
| Product + Offer | Prix, disponibilité, notes dans le snippet ; cartes Shopping | Critique pour l’e-commerce |
| LocalBusiness + AggregateRating | Knowledge Panel, Map Pack, étoiles | Critique pour le commerce local |
| Article / NewsArticle | Carrousel Top Stories, date de publication | Élevée pour les médias et les blogs |
| BreadcrumbList | Fil d’Ariane à la place de l’URL dans le snippet | Élevée pour tout site |
| Event | Carte d’événement avec date et lieu | Moyenne pour les pages d’événements |
| Recipe | Carte de recette avec photo, durée et calories | Moyenne pour les sites de cuisine |
| Organization (non local) | Knowledge Graph, logo dans les résultats | Base pour tous les sites |
Organization : schéma de base et tous ses sous-types
Organization est le type de base pour toute entreprise, organisation ou marque. La hiérarchie des sous-types est large, et chacun ajoute des champs spécifiques. Le choix du bon sous-type compte : Google s’en sert pour déterminer le contexte de l’entreprise et ce qu’il affiche dans le Knowledge Panel.
| Type | Destiné à | Champs complémentaires clés |
|---|---|---|
| Organization | Toute entreprise, ONG ou marque sans adresse physique | name, url, logo, sameAs |
| LocalBusiness | Toute entreprise disposant d’une adresse physique | address, telephone, openingHours, geo |
| Store | Magasin de détail | currenciesAccepted, paymentAccepted |
| FoodEstablishment | Café, restaurant (type de base) | servesCuisine, menu, hasMap |
| Restaurant | Restaurant | servesCuisine, menu, acceptsReservations |
| CafeOrCoffeeShop | Salon de café | servesCuisine |
| FastFoodRestaurant | Restauration rapide | servesCuisine |
| MedicalOrganization | Établissement de santé (type de base) | medicalSpecialty |
| Hospital | Hôpital | availableService, medicalSpecialty |
| MedicalClinic | Clinique | medicalSpecialty, availableService |
| Dentist | Cabinet dentaire | availableService |
| LegalService | Cabinet juridique | — |
| Lawyer | Avocat | — |
| AccountingService | Cabinet comptable ou d’audit | — |
| FinancialService | Banque, assureur, société d’investissement | — |
| RealEstateAgent | Agence immobilière | — |
| AutomotiveBusiness | Concession ou réparation automobile (type de base) | — |
| AutoDealer | Concession automobile | — |
| AutoRepair | Garage de réparation automobile | — |
| Hotel | Hôtel | amenityFeature, checkinTime, checkoutTime |
| SportsActivityLocation | Équipement sportif (type de base) | availableService |
| GymOrHealthClub | Salle de sport, club de fitness | — |
| GovernmentOrganization | Organisme public | — |
| EducationalOrganization | Établissement d’enseignement (type de base) | — |
| CollegeOrUniversity | Université, établissement d’enseignement supérieur | — |
| School | École | — |
| Corporation | Grande entreprise | tickerSymbol, legalName |
Organization de base
Le schéma Organization de base s’ajoute à la page d’accueil de tout site. Il aide Google à identifier la marque et à la relier à ses profils externes via sameAs. Le champ @id, avec un identifiant unique, permet aux autres schémas de référencer cette organisation sans dupliquer les données.
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Company Name",
"legalName": "Example LLC",
"url": "https://example.com",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png",
"width": 200,
"height": 60
},
"description": "Brief company description for Knowledge Graph.",
"foundingDate": "2015",
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+1-800-123-4567",
"contactType": "customer service",
"availableLanguage": "English"
},
"sameAs": [
"https://www.linkedin.com/company/yourcompany",
"https://twitter.com/yourcompany",
"https://www.facebook.com/yourcompany"
]
}LocalBusiness : entreprise dotée d’une adresse physique
LocalBusiness est le sous-type le plus important pour les entreprises disposant d’un lieu physique. Un schéma correctement renseigné améliore les chances d’apparaître dans le Google Map Pack (le bloc carte en haut de la SERP) et dans un Knowledge Panel avec les horaires d’ouverture. Champs clés : address, geo, openingHoursSpecification, telephone, priceRange.
{
"@context": "https://schema.org",
"@type": "Restaurant",
"@id": "https://example.com/#business",
"name": "The Birch Restaurant",
"url": "https://example.com",
"telephone": "+1-212-555-0100",
"email": "info@example.com",
"servesCuisine": ["American", "European"],
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main Street",
"addressLocality": "New York",
"addressRegion": "NY",
"postalCode": "10001",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 40.7128,
"longitude": -74.0060
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "12:00",
"closes": "23:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday", "Sunday"],
"opens": "12:00",
"closes": "00:00"
}
],
"image": "https://example.com/photos/restaurant.jpg",
"hasMap": "https://maps.google.com/?cid=XXXXXX"
}opens « 00:00 » et closes « 23:59 ».sameAs : relier les profils externes
Le champ sameAs indique à Google que votre organisation est la même entité que des profils présents sur d’autres plateformes. C’est le champ clé pour construire le Knowledge Graph, la base d’entités de Google. Plus les sources fiables confirment l’existence d’une organisation, plus elle a de chances d’apparaître dans un Knowledge Panel.
- Wikidata (la plus fiable) : https://www.wikidata.org/wiki/Q...
- Wikipédia : https://en.wikipedia.org/wiki/...
- LinkedIn, Twitter/X, Facebook, Instagram
- La chaîne YouTube de l’organisation
- Fiche Google Business Profile (pour les entreprises locales)
- Annuaires sectoriels : registres médicaux, ordres professionnels, etc.
Product : schéma produit et tous ses sous-types
Product est le schéma de base pour tout produit ou article. Il fonctionne avec Offer (prix et disponibilité) et AggregateRating (note). Correctement implémenté, il donne un résultat enrichi dans Google : prix, statut de disponibilité et notes en étoiles directement dans le snippet.
| Type | Cas d’usage | Remarques |
|---|---|---|
| Product | Schéma de base pour tout produit | name, image, description obligatoires |
| Offer | Offre précise : prix et disponibilité | price, priceCurrency, availability obligatoires |
| AggregateOffer | Fourchette de prix (plusieurs offres) | lowPrice, highPrice, offerCount |
| ProductGroup | Groupe de produits avec variantes | variesBy, hasVariant |
| IndividualProduct | Variante précise au sein d’un ProductGroup | isVariantOf → ProductGroup |
| Brand | Marque du produit (imbriquée dans Product) | name obligatoire |
Product de base avec Offer
Google exige un ensemble minimal de champs pour un résultat enrichi : name, image, description et une Offer imbriquée avec priceCurrency, price et availability. Si l’un de ces champs manque, le snippet produit ne sera pas enrichi.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Air X Pro Running Shoes",
"description": "Lightweight running shoes with foam sole for road running. Weight 230g, drop 10mm.",
"sku": "AIRX-001-BLK",
"mpn": "AIRX001",
"gtin13": "0123456789012",
"brand": {
"@type": "Brand",
"name": "RunMax"
},
"image": [
"https://example.com/photos/airx-front.jpg",
"https://example.com/photos/airx-side.jpg",
"https://example.com/photos/airx-back.jpg"
],
"offers": {
"@type": "Offer",
"url": "https://example.com/products/air-x-pro",
"priceCurrency": "USD",
"price": "89.99",
"priceValidUntil": "2026-12-31",
"itemCondition": "https://schema.org/NewCondition",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "Organization",
"name": "RunMax Store"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "128"
}
}AggregateOffer : fourchette de prix
Si un produit est proposé par plusieurs vendeurs ou existe en variantes à prix différents, utilisez AggregateOffer. Il affiche une fourchette de prix (lowPrice – highPrice) au lieu d’un prix unique.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Galaxy S25 Smartphone",
"brand": { "@type": "Brand", "name": "Samsung" },
"image": "https://example.com/galaxy-s25.jpg",
"offers": {
"@type": "AggregateOffer",
"priceCurrency": "USD",
"lowPrice": "799",
"highPrice": "1099",
"offerCount": "3",
"offers": [
{
"@type": "Offer",
"name": "128 GB / Black",
"price": "799",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
},
{
"@type": "Offer",
"name": "256 GB / White",
"price": "899",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
},
{
"@type": "Offer",
"name": "512 GB / Violet",
"price": "1099",
"priceCurrency": "USD",
"availability": "https://schema.org/PreOrder"
}
]
}
}ProductGroup : produits avec variantes
ProductGroup regroupe des produits liés qui diffèrent par certains paramètres (taille, couleur, matière). Il sert sur les pages produit proposant des variantes. Chaque variante précise est un Product imbriqué, dont isVariantOf pointe vers le ProductGroup parent.
{
"@context": "https://schema.org",
"@type": "ProductGroup",
"name": "Air X Pro Running Shoes",
"description": "Road running shoes available in multiple colours and sizes.",
"url": "https://example.com/products/air-x-pro",
"brand": { "@type": "Brand", "name": "RunMax" },
"productGroupID": "AIRX-PRO",
"variesBy": ["https://schema.org/color", "https://schema.org/size"],
"hasVariant": [
{
"@type": "Product",
"name": "Air X Pro — Black, US 9",
"sku": "AIRX-BLK-9",
"color": "Black",
"size": "US 9",
"offers": {
"@type": "Offer",
"price": "89.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
},
{
"@type": "Product",
"name": "Air X Pro — Blue, US 11",
"sku": "AIRX-BLU-11",
"color": "Blue",
"size": "US 11",
"offers": {
"@type": "Offer",
"price": "89.99",
"priceCurrency": "USD",
"availability": "https://schema.org/OutOfStock"
}
}
]
}AggregateRating et Review : notes et avis
Les notes en étoiles dans les résultats de recherche sont l’élément le plus visible du snippet. Elles s’implémentent via deux types liés : AggregateRating (le score global issu de toutes les notes) et Review (un avis textuel individuel). Les deux types s’imbriquent toujours dans un schéma parent : Product, LocalBusiness, Recipe, Course, Book, etc.
AggregateRating : score global
AggregateRating reflète le score agrégé : valeur moyenne et nombre de votes. Google l’affiche sous forme d’étoiles dans le snippet. Champs obligatoires : ratingValue (moyenne) et reviewCount ou ratingCount.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Air X Pro Running Shoes",
"image": "https://example.com/airx.jpg",
"offers": {
"@type": "Offer",
"price": "89.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"bestRating": "5",
"worstRating": "1",
"reviewCount": "128",
"ratingCount": "215"
}
}Review : avis individuels
Review est le schéma d’un avis textuel individuel. Il s’imbrique dans l’objet parent via la propriété review. Chaque Review contient un auteur, une note et le texte de l’avis. Google peut afficher un extrait du texte de l’avis dans le résultat enrichi.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Air X Pro Running Shoes",
"image": "https://example.com/airx.jpg",
"offers": {
"@type": "Offer",
"price": "89.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "128"
},
"review": [
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"name": "Great shoes for daily runs",
"reviewBody": "Been running in them for 3 months — sole holds up well, feet don't tire. Recommend for road running.",
"datePublished": "2026-03-15",
"author": {
"@type": "Person",
"name": "Alex K."
}
},
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "4",
"bestRating": "5"
},
"reviewBody": "Good cushioning, but runs a little small. Order half a size up.",
"datePublished": "2026-04-01",
"author": {
"@type": "Person",
"name": "Maria S."
}
}
]
}ImageObject : les photos dans les données structurées
Les images dans Schema.org peuvent être indiquées de deux façons : sous forme de chaîne d’URL ("image": "https://example.com/photo.jpg") ou sous forme d’ImageObject avec métadonnées. Une simple chaîne suffit pour la plupart des schémas, mais pour Article, Recipe et HowTo, Google recommande ImageObject : il permet de préciser les dimensions, la légende et le format.
| Type de schéma | Exigences pour les images | Largeur min. |
|---|---|---|
| Product | Au moins une image du produit ; fond blanc préféré | 800 px recommandés |
| Article / NewsArticle | Au moins 3 images : 16:9, 4:3, 1:1 | 1 200 px |
| Recipe | Photo obligatoire du plat fini | Au choix ; 1 200×628 optimal |
| LocalBusiness | Photos de l’entrée, de l’intérieur et de la façade | Au choix |
| Organization (logo) | Logo rectangulaire, fond blanc ou transparent | 112×112 min, ratio jusqu’à 1×10 |
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Air X Pro Running Shoes",
"image": [
{
"@type": "ImageObject",
"url": "https://example.com/airx-front.jpg",
"width": 1200,
"height": 1200,
"caption": "Air X Pro — front view"
},
{
"@type": "ImageObject",
"url": "https://example.com/airx-side.jpg",
"width": 1200,
"height": 1200,
"caption": "Air X Pro — side view"
}
],
"offers": {
"@type": "Offer",
"price": "89.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}Combiner plusieurs schémas sur une même page
Plusieurs schémas sur une même page s’ajoutent sous forme de blocs <script> distincts. Voici le balisage complet d’une page produit : l’organisation qui vend, le fil d’Ariane, puis le produit avec son prix, sa note et son avis.
<!-- Schema 1: Selling organisation (on all site pages) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "RunMax Store",
"url": "https://example.com",
"logo": "https://example.com/logo.png"
}
</script>
<!-- Schema 2: Breadcrumbs -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com" },
{ "@type": "ListItem", "position": 2, "name": "Footwear", "item": "https://example.com/shoes" },
{ "@type": "ListItem", "position": 3, "name": "Air X Pro" }
]
}
</script>
<!-- Schema 3: Product with price, rating and review (on product page) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Air X Pro Running Shoes",
"description": "Road running shoes.",
"sku": "AIRX-001",
"brand": { "@type": "Brand", "name": "RunMax" },
"image": "https://example.com/airx.jpg",
"offers": {
"@type": "Offer",
"price": "89.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"priceValidUntil": "2026-12-31",
"seller": { "@id": "https://example.com/#organization" }
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "128",
"bestRating": "5"
},
"review": {
"@type": "Review",
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"author": { "@type": "Person", "name": "Alex K." },
"reviewBody": "Excellent shoes, run in them every day.",
"datePublished": "2026-04-10"
}
}
</script>seller, la valeur { "@id": "https://example.com/#organization" } renvoie à l’organisation définie plus haut par son @id. On parle de liaison de graphe : Google relie les entités dans un graphe de connaissances unifié, sans dupliquer les données.Valider les données structurées
Après l’implémentation, validez toujours le balisage. Google met à disposition deux outils officiels, et la Search Console donne la vision réelle de ce que voit le crawler sur les pages indexées.
Ouvrez search.google.com/test/rich-results, puis saisissez une URL ou du HTML. L’outil indique les résultats enrichis disponibles pour le schéma, les champs obligatoires et les champs mal renseignés. C’est le seul moyen de confirmer que le balisage produira réellement des améliorations visuelles dans la SERP.
Ouvrez validator.schema.org pour une validation complète selon la norme Schema.org, et pas seulement pour les types pris en charge par Google. Il vérifie les propriétés obligatoires de chaque type et signale les combinaisons incompatibles : utile pour les schémas imbriqués complexes.
Search Console → Améliorations, puis sélectionnez le type de schéma. Cette section affiche les erreurs réelles sur les pages indexées. Ce sont elles qui bloquent aujourd’hui les résultats enrichis, sur les URL en ligne : c’est le signal le plus directement exploitable.
script type="application/ld+json". Si le bloc est absent, Googlebot risque de ne pas voir le balisage.Liste de contrôle des données structurées
Implémentation de base du JSON-LD
- Balise
<script type="application/ld+json">ajoutée dans<head>ou à la fin de<body> - Chaque bloc contient
@context(valeur « https://schema.org ») et@type - Chaque entité principale possède un
@idunique au format URL avec fragment (#nom) - Le JSON est valide : pas de virgule finale, toutes les chaînes correctement fermées
- Le balisage est présent dans la réponse HTML du serveur (pas seulement via JavaScript)
Organization / LocalBusiness
- Sous-type adapté choisi (Restaurant, Dentist, AutoDealer, etc.) plutôt qu’un simple Organization
- Renseignés : name, url, telephone, address (pour LocalBusiness)
- geo ajouté avec des coordonnées précises (latitude, longitude)
- openingHoursSpecification renseigné avec les noms de jours en anglais et les heures au format HH:MM
- sameAs renseigné avec au moins les profils sociaux et Wikidata (si disponible)
Product
- Renseignés : name, description, image (au moins une image)
- Offer imbriquée avec : price, priceCurrency, availability, priceValidUntil
- availability au format d’URL complète : https://schema.org/InStock
- sku et/ou gtin13 renseignés pour Google Shopping
- AggregateRating imbriqué si la page affiche des notes d’utilisateurs
Notes et avis
- AggregateRating contient ratingValue, reviewCount, bestRating, worstRating
- Les valeurs d’AggregateRating correspondent aux données réelles du site
- Review est imbriquée dans l’objet parent (Product / LocalBusiness), et non isolée
- Chaque Review comporte author (Person), reviewRating, datePublished et reviewBody
- Les avis présents dans le balisage proviennent de vrais utilisateurs
FAQ
Le balisage Schema.org influence-t-il directement le classement dans Google ?
Peut-on ajouter des données structurées via Google Tag Manager ?
<script> contenant du JSON-LD. Mais Google privilégie un balisage présent dans la réponse HTML du serveur, et non ajouté par JavaScript. Un balisage injecté par GTM peut ne pas être correctement reconnu lors du crawl si Googlebot n’exécute pas le JavaScript de la page. La méthode optimale consiste à générer le JSON-LD côté serveur.Combien d’avis faut-il inclure dans le balisage Review ?
Pourquoi les résultats enrichis n’apparaissent-ils pas alors que le balisage passe la validation ?
Comment indiquer le prix pour une boutique internationale ?
Check it with SpiderHead
Free and local: run the audit on your own machine.



