[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fo2kVPpbsVignoLq0A1udn_02S2uI2Xr5AsDgDrFdMLA":3,"$fWPE1y3InuYmvB-GaRs0YO-ely-E5eJpiqgV16SQC02o":25},{"_id":4,"slug":5,"__v":6,"author":7,"body":8,"canonical":9,"category":10,"createdAt":11,"date":12,"description":13,"htmlContent":14,"image":15,"imageAlt":15,"readingTime":16,"tags":17,"title":23,"updatedAt":24},"6a041412aa6b273b0c40f181","how-to-build-local-pages-that-win-in-ai-powered-search-via-sejournal-lorenbaker",0,"Equipe Seogard","Google AI Overviews et AI Mode reformulent les résultats locaux en synthèses contextuelles. Une page locale qui ranke en position 3 sur une requête classique peut être totalement absente de la réponse générée par le LLM. Le problème n'est presque jamais le contenu lui-même — c'est l'architecture technique qui empêche le modèle d'extraire, de vérifier et de citer l'information locale.\n\n## Pourquoi les pages locales classiques échouent dans l'AI Search\n\nLe modèle de génération derrière AI Overviews ne \"lit\" pas une page locale comme un humain. Il procède par extraction d'entités, vérification croisée entre sources, et sélection de fragments citables. Une page locale typique — nom de ville en H1, paragraphe générique sur le service, carte Google Maps embed, formulaire de contact — ne fournit rien de tout ça.\n\n### Le problème du template local dupliqué\n\nLe pattern le plus répandu chez les entreprises multi-sites : un template identique déployé sur 50, 200 ou 2 000 villes, avec comme seule variation le nom de la localité injecté dynamiquement. Google sait détecter ce pattern depuis des années (voir les guidelines sur les [doorway pages](https://developers.google.com/search/docs/essentials/spam-policies#doorway-pages)). Mais dans le contexte AI, le problème est plus profond.\n\nUn LLM qui grounding sa réponse a besoin de **signaux de différenciation sémantique** entre les pages. Si 200 pages partagent 90% du même contenu et que seul le nom de ville change, le modèle n'a aucune raison de préférer l'une à l'autre — et il ne citera probablement aucune d'entre elles. Il ira chercher une source qui offre une information spécifique à la localité : un annuaire local, un article de presse régionale, un avis Google Business détaillé.\n\n### Ce que le grounding attend d'une page locale\n\nLe processus de grounding — la façon dont un LLM vérifie et ancre ses affirmations dans des sources — repose sur la correspondance entre des **claims** (affirmations factuelles) et des **passages structurés** dans les documents sources. Pour le local, ça signifie :\n\n- Des affirmations factuelles vérifiables (adresse, horaires, services spécifiques à cette localité)\n- Un balisage sémantique qui rend ces faits extractibles par machine\n- Une cohérence entre le contenu on-page et les données structurées off-page (Google Business Profile, annuaires, NAP)\n\nSi vous voulez comprendre en profondeur comment le grounding diffère de l'indexation classique, l'analyse de [ce que Bing a révélé sur le grounding](/blog/bing-reveals-what-grounding-means-for-ai-search-visibility-via-sejournal-mattgsouthern) est un bon point de départ.\n\n## Architecture technique d'une page locale AI-ready\n\nVoici l'architecture que nous recommandons pour une page locale qui doit performer à la fois en search classique et en AI Search. Le principe : chaque fait local doit exister à trois niveaux — HTML visible, données structurées JSON-LD, et métadonnées sémantiques.\n\n### Le squelette HTML sémantique\n\nChaque page locale doit contenir des sections clairement identifiables par un crawler ou un modèle. Pas de div générique — utilisez des éléments sémantiques HTML5 avec des attributs `itemscope` et `itemtype` en backup du JSON-LD.\n\n```html\n\u003Carticle itemscope itemtype=\"https://schema.org/LocalBusiness\">\n  \u003Cheader>\n    \u003Ch1 itemprop=\"name\">Plomberie Durand — Intervention à Lyon 3e\u003C/h1>\n    \u003Cp itemprop=\"description\">\n      Service de plomberie d'urgence dans le 3e arrondissement de Lyon.\n      Intervention sous 45 minutes, 7j/7, depuis notre dépôt rue Paul Bert.\n    \u003C/p>\n  \u003C/header>\n\n  \u003Csection aria-labelledby=\"address-heading\">\n    \u003Ch2 id=\"address-heading\">Zone d'intervention et accès\u003C/h2>\n    \u003Caddress itemprop=\"address\" itemscope itemtype=\"https://schema.org/PostalAddress\">\n      \u003Cspan itemprop=\"streetAddress\">127 rue Paul Bert\u003C/span>,\n      \u003Cspan itemprop=\"postalCode\">69003\u003C/span>\n      \u003Cspan itemprop=\"addressLocality\">Lyon\u003C/span>,\n      \u003Cspan itemprop=\"addressRegion\">Rhône\u003C/span>\n    \u003C/address>\n    \u003Cp>Quartiers couverts en moins de 30 minutes : Part-Dieu, Villette,\n       Montchat, Sans Souci, Dauphiné. Accès direct via le boulevard\n       Vivier-Merle — stationnement dédié véhicule d'intervention.\u003C/p>\n  \u003C/section>\n\n  \u003Csection aria-labelledby=\"services-heading\">\n    \u003Ch2 id=\"services-heading\">Services spécifiques Lyon 3e\u003C/h2>\n    \u003Cul itemprop=\"hasOfferCatalog\" itemscope\n        itemtype=\"https://schema.org/OfferCatalog\">\n      \u003Cli itemprop=\"itemListElement\" itemscope\n          itemtype=\"https://schema.org/Offer\">\n        \u003Cspan itemprop=\"name\">Débouchage canalisations immeuble haussmannien\u003C/span>\n        \u003Cmeta itemprop=\"priceCurrency\" content=\"EUR\"/>\n        \u003Cspan itemprop=\"price\" content=\"120\">à partir de 120 €\u003C/span>\n      \u003C/li>\n      \u003Cli itemprop=\"itemListElement\" itemscope\n          itemtype=\"https://schema.org/Offer\">\n        \u003Cspan itemprop=\"name\">Remplacement colonne montante copropriété\u003C/span>\n        \u003Cmeta itemprop=\"priceCurrency\" content=\"EUR\"/>\n        \u003Cspan itemprop=\"price\" content=\"2500\">à partir de 2 500 €\u003C/span>\n      \u003C/li>\n    \u003C/ul>\n  \u003C/section>\n\n  \u003Csection aria-labelledby=\"hours-heading\">\n    \u003Ch2 id=\"hours-heading\">Horaires d'intervention Lyon 3e\u003C/h2>\n    \u003Ctime itemprop=\"openingHours\" datetime=\"Mo-Fr 07:00-21:00\">\n      Lundi – Vendredi : 7h – 21h\n    \u003C/time>\n    \u003Ctime itemprop=\"openingHours\" datetime=\"Sa-Su 08:00-18:00\">\n      Samedi – Dimanche : 8h – 18h\n    \u003C/time>\n  \u003C/section>\n\u003C/article>\n```\n\nTrois choses à noter dans cette structure :\n\n1. **Chaque section a un heading sémantique** lié par `aria-labelledby`. Le LLM et les crawlers peuvent identifier le sujet de chaque bloc sans parser le contenu.\n2. **Les prix sont balisés avec `Offer`** — c'est un signal de spécificité locale. Un template générique ne contient jamais de prix localisés.\n3. **La zone d'intervention est décrite en texte libre** avec des noms de quartiers réels, pas juste \"Lyon\". Ça fournit des entités géographiques granulaires pour le grounding.\n\n### JSON-LD complet pour le local\n\nLe microdata dans le HTML ne suffit pas. Ajoutez un bloc JSON-LD complet qui consolide toutes les informations et ajoute des propriétés que le HTML ne peut pas porter proprement :\n\n```json\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Plumber\",\n  \"@id\": \"https://plomberie-durand.fr/lyon-3e/#business\",\n  \"name\": \"Plomberie Durand — Lyon 3e\",\n  \"url\": \"https://plomberie-durand.fr/lyon-3e/\",\n  \"telephone\": \"+33472XXXXXX\",\n  \"email\": \"lyon3@plomberie-durand.fr\",\n  \"address\": {\n    \"@type\": \"PostalAddress\",\n    \"streetAddress\": \"127 rue Paul Bert\",\n    \"postalCode\": \"69003\",\n    \"addressLocality\": \"Lyon\",\n    \"addressRegion\": \"Auvergne-Rhône-Alpes\",\n    \"addressCountry\": \"FR\"\n  },\n  \"geo\": {\n    \"@type\": \"GeoCoordinates\",\n    \"latitude\": 45.7578,\n    \"longitude\": 4.8715\n  },\n  \"areaServed\": [\n    {\n      \"@type\": \"City\",\n      \"name\": \"Lyon\",\n      \"sameAs\": \"https://www.wikidata.org/wiki/Q456\"\n    },\n    {\n      \"@type\": \"AdministrativeArea\",\n      \"name\": \"Lyon 3e arrondissement\"\n    }\n  ],\n  \"openingHoursSpecification\": [\n    {\n      \"@type\": \"OpeningHoursSpecification\",\n      \"dayOfWeek\": [\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\"],\n      \"opens\": \"07:00\",\n      \"closes\": \"21:00\"\n    },\n    {\n      \"@type\": \"OpeningHoursSpecification\",\n      \"dayOfWeek\": [\"Saturday\",\"Sunday\"],\n      \"opens\": \"08:00\",\n      \"closes\": \"18:00\"\n    }\n  ],\n  \"aggregateRating\": {\n    \"@type\": \"AggregateRating\",\n    \"ratingValue\": \"4.7\",\n    \"reviewCount\": \"183\"\n  },\n  \"sameAs\": [\n    \"https://www.google.com/maps/place/...\",\n    \"https://www.pagesjaunes.fr/...\"\n  ]\n}\n```\n\nLe point critique : la propriété `sameAs` et le lien Wikidata dans `areaServed`. Ces références permettent au modèle de **résoudre l'entité géographique** sans ambiguïté. \"Lyon 3e\" peut être interprété de multiples façons — le lien Wikidata lève l'ambiguïté. C'est exactement le type de signal que le grounding exploite, comme l'explique l'article sur [la visibilité AI qui commence avant la recherche](/blog/why-ai-visibility-starts-before-search-and-ends-with-citations).\n\n## Contenu localement différencié : la clé du grounding\n\nLe balisage technique ne fait que rendre l'information extractible. Encore faut-il que cette information soit **unique et spécifique** à la localité.\n\n### Ce qui différencie vraiment une page locale\n\nVoici les types de contenu qui créent une différenciation suffisante pour que le LLM sélectionne votre page plutôt qu'une autre :\n\n**Données factuelles locales vérifiables.** Pas \"nous intervenons à Lyon\" mais \"temps d'intervention moyen de 38 minutes depuis notre dépôt de la rue Paul Bert vers le quartier Part-Dieu, mesuré sur 247 interventions en 2025\". Ce type d'affirmation est vérifiable par croisement avec votre Google Business Profile et vos avis clients.\n\n**Contexte géographique technique.** Pour un plombier : \"Les immeubles du quartier Villette (construits entre 1960 et 1975) utilisent majoritairement des colonnes en fonte — nos techniciens sont équipés de caméras d'inspection et de furets motorisés adaptés à ce type de réseau.\" Ce n'est pas du contenu marketing — c'est de l'information technique spécifique à une zone.\n\n**Références croisées locales.** Mentionner des entités locales vérifiables : \"Partenaire de la régie Alliade Habitat pour la maintenance des 1 200 logements du parc HLM du 3e arrondissement.\" Ce type de claim crée un lien d'entité que le LLM peut vérifier via d'autres sources.\n\n### Le piège du contenu \"localisé\" par IA générative\n\nBeaucoup d'équipes SEO utilisent maintenant des LLM pour générer du contenu localisé à grande échelle. Le problème : un LLM qui génère du contenu sur \"Lyon 3e\" produit des généralités tirées de son training data, pas des faits spécifiques à votre business dans cette zone. Google [détecte et pénalise le contenu scalé de faible qualité](/blog/google-s-quality-threshold-is-quietly-killing-scaled-ai-content-via-sejournal-taylordanrw) — et les AI Overviews ne le citent tout simplement pas.\n\nLa seule approche viable : un template technique solide (la structure HTML/JSON-LD ci-dessus) + un contenu éditorial qui ne peut venir que de données internes (CRM, historique d'interventions, témoignages clients localisés).\n\n## SSR et rendu : les pages locales doivent être crawlables sans JavaScript\n\nSi vous utilisez un framework JavaScript pour vos pages locales — React, Vue, Angular — le rendu côté serveur n'est pas optionnel. C'est un prérequis absolu.\n\n### Pourquoi le CSR tue vos pages locales dans l'AI Search\n\nGoogle peut techniquement exécuter du JavaScript pour le rendering. Mais les bots d'AI Search — y compris les crawlers qui alimentent les modèles de grounding — n'ont pas forcément cette capacité. Le [bot authorization standard que Google teste](/blog/google-is-testing-new-bot-authorization-standard-via-sejournal-martinibuster) montre bien que l'écosystème de crawl se fragmente : vous ne savez plus exactement qui crawle quoi, et avec quelles capacités de rendering.\n\nVérifiez le rendu de vos pages locales avec un test simple dans Chrome DevTools :\n\n```bash\n# Désactivez JavaScript et observez le résultat\n# Chrome DevTools > Settings > Debugger > Disable JavaScript\n\n# Ou testez avec curl pour voir ce que reçoit un bot sans JS\ncurl -s -A \"Mozilla/5.0 (compatible; Googlebot/2.1)\" \\\n  \"https://plomberie-durand.fr/lyon-3e/\" | \\\n  grep -c \"127 rue Paul Bert\"\n\n# Si le résultat est 0, votre adresse n'est pas dans le HTML initial\n# Le grounding ne la verra probablement pas\n```\n\nSi votre adresse, vos horaires, votre JSON-LD ou vos prix n'apparaissent pas dans le HTML initial (avant exécution JavaScript), vous avez un problème. Les [leçons de JavaScript SEO tirées du e-commerce](/blog/5-javascript-seo-lessons-from-top-ecommerce-sites) s'appliquent intégralement aux pages locales.\n\n### Configuration SSR pour les pages locales Next.js\n\nPour les sites construits avec Next.js (le cas le plus fréquent en 2026 pour les sites multi-locations), utilisez `getServerSideProps` ou le App Router avec des Server Components pour garantir que les données locales sont dans le HTML initial :\n\n```typescript\n// app/locations/[city]/page.tsx — Next.js App Router\nimport { Metadata } from 'next'\nimport { getLocationData } from '@/lib/locations'\nimport { LocalBusinessJsonLd } from '@/components/LocalBusinessJsonLd'\n\ninterface Props {\n  params: { city: string }\n}\n\n// Génération statique des pages locales au build\nexport async function generateStaticParams() {\n  const locations = await getAllLocations()\n  return locations.map((loc) => ({ city: loc.slug }))\n}\n\n// Metadata dynamique par localité\nexport async function generateMetadata({ params }: Props): Promise\u003CMetadata> {\n  const location = await getLocationData(params.city)\n  return {\n    title: `${location.businessName} — ${location.cityName}`,\n    description: location.metaDescription,\n    alternates: {\n      canonical: `https://plomberie-durand.fr/${params.city}/`,\n    },\n  }\n}\n\n// Page component — rendu côté serveur, zéro JS requis pour le contenu\nexport default async function LocationPage({ params }: Props) {\n  const location = await getLocationData(params.city)\n\n  return (\n    \u003Carticle itemScope itemType=\"https://schema.org/Plumber\">\n      \u003CLocalBusinessJsonLd data={location} />\n      \u003Cheader>\n        \u003Ch1 itemProp=\"name\">\n          {location.businessName} — {location.cityName}\n        \u003C/h1>\n        \u003Cp itemProp=\"description\">{location.localDescription}\u003C/p>\n      \u003C/header>\n\n      \u003Csection aria-labelledby=\"area-heading\">\n        \u003Ch2 id=\"area-heading\">Zone d'intervention {location.cityName}\u003C/h2>\n        \u003Caddress itemProp=\"address\" itemScope\n                 itemType=\"https://schema.org/PostalAddress\">\n          \u003Cspan itemProp=\"streetAddress\">{location.street}\u003C/span>,\n          \u003Cspan itemProp=\"postalCode\">{location.postalCode}\u003C/span>\n          \u003Cspan itemProp=\"addressLocality\">{location.cityName}\u003C/span>\n        \u003C/address>\n        \u003Cp>{location.areaDescription}\u003C/p>\n        \u003Cul>\n          {location.neighborhoods.map((n) => (\n            \u003Cli key={n.slug}>{n.name} — {n.avgResponseTime} min\u003C/li>\n          ))}\n        \u003C/ul>\n      \u003C/section>\n\n      \u003Csection aria-labelledby=\"services-heading\">\n        \u003Ch2 id=\"services-heading\">\n          Services spécifiques {location.cityName}\n        \u003C/h2>\n        {location.localServices.map((service) => (\n          \u003Cdiv key={service.id} itemProp=\"hasOfferCatalog\" itemScope\n               itemType=\"https://schema.org/Offer\">\n            \u003Ch3 itemProp=\"name\">{service.name}\u003C/h3>\n            \u003Cp>{service.localContext}\u003C/p>\n            \u003Cp>À partir de \u003Cspan itemProp=\"price\"\n               content={service.price}>{service.priceFormatted}\u003C/span>\n              \u003Cmeta itemProp=\"priceCurrency\" content=\"EUR\" />\n            \u003C/p>\n          \u003C/div>\n        ))}\n      \u003C/section>\n    \u003C/article>\n  )\n}\n```\n\nL'avantage de `generateStaticParams` : les pages sont pré-rendues au build. Le HTML complet, incluant le JSON-LD et toutes les données locales, est servi instantanément. Pas de waterfall, pas de client-side fetch, pas de skeleton screen que le bot voit à la place du contenu.\n\n## Scénario concret : migration de 340 pages locales\n\nUn réseau de cliniques vétérinaires avec 85 établissements en France. Avant migration : un SPA React avec les données locales chargées via API après le premier rendu. 340 pages locales (85 villes × 4 services par ville).\n\n### État initial\n\n- **Trafic organique local** : 12 400 visites/mois\n- **Pages indexées dans Search Console** : 340 soumises, 187 indexées (55%). Les 153 autres en \"Crawled — currently not indexed\" ou \"Discovered — currently not indexed\".\n- **Présence dans AI Overviews** : 0 citations détectées sur un échantillon de 200 requêtes locales monitorées.\n- **Temps de rendu complet** (mesuré via Screaming Frog en mode JavaScript rendering) : 4,2 secondes en moyenne.\n\n### Actions techniques\n\n1. **Migration vers Next.js App Router avec SSR statique** (ISR toutes les 6 heures pour les données dynamiques comme les horaires exceptionnels).\n2. **Ajout du JSON-LD LocalBusiness** avec `@type: VeterinaryCare`, `areaServed` avec liens Wikidata, `aggregateRating` tiré de Google Business Profile via l'API.\n3. **Contenu différencié** : chaque page a reçu un paragraphe de contexte local rédigé par le vétérinaire responsable (espèces les plus traitées dans la zone, partenariats avec les refuges locaux, particularités du parc animalier de la ville).\n4. **Maillage interne local** : chaque page de ville lie vers les pages de services spécifiques et vers les 2-3 villes les plus proches géographiquement.\n5. **Monitoring des régressions** : un outil comme Seogard a été configuré pour alerter si le JSON-LD disparaît d'une page locale (ça arrive plus souvent qu'on ne le pense lors des déploiements), si un canonical est mal généré, ou si le SSR casse sur un subset de pages.\n\n### Résultats après 14 semaines\n\n- **Pages indexées** : 327/340 (96%)\n- **Trafic organique local** : 28 700 visites/mois (+131%)\n- **Citations AI Overviews détectées** : 23 requêtes locales sur l'échantillon de 200 (11,5%). Principalement sur des requêtes de type \"vétérinaire urgence [ville]\" et \"clinique vétérinaire ouverte dimanche [ville]\".\n- **Temps de rendu** : 0,3 secondes (HTML statique).\n\nLe facteur déterminant n'a pas été le contenu seul, ni le balisage seul. C'est la combinaison : HTML sémantique crawlable immédiatement + données structurées complètes + contenu localement unique + cohérence avec les signaux off-page (Google Business Profile, NAP dans les annuaires).\n\n## Signaux off-page et cohérence des entités\n\nLe balisage on-page ne suffit pas si vos signaux off-page contredisent vos données. Le grounding effectue une **vérification croisée** : si votre JSON-LD dit \"ouvert le dimanche 8h-18h\" mais que votre Google Business Profile dit \"fermé le dimanche\", le modèle a un signal contradictoire — et il ne citera ni l'un ni l'autre.\n\n### NAP consistency à l'ère du grounding\n\nLa cohérence NAP (Name, Address, Phone) est un classique du local SEO. Dans le contexte AI, elle prend une dimension supplémentaire : le modèle ne regarde plus seulement si l'information existe, mais si elle est **cohérente entre les sources**.\n\nVérifiez systématiquement :\n\n- **Google Business Profile** vs contenu on-page vs JSON-LD : les trois doivent être identiques, caractère par caractère pour l'adresse et le téléphone.\n- **Annuaires tiers** (PagesJaunes, Yelp, TripAdvisor selon le secteur) : même logique.\n- **Wikidata** si votre business y est référencé : la propriété `sameAs` dans votre JSON-LD doit pointer vers la bonne entité.\n\nLe suivi des [métriques géographiques en 2026](/blog/8-geo-metrics-to-track-in-2026) montre que la cohérence inter-sources est devenue un KPI à part entière, pas un nice-to-have.\n\n### Les avis comme source de claims pour le grounding\n\nLes avis Google Business Profile servent de source de vérification pour le LLM. Quand un utilisateur demande \"est-ce que le plombier Durand à Lyon 3e est fiable ?\", le modèle synthétise les avis — pas votre page \"À propos\".\n\nImplication technique : encouragez des avis qui contiennent des **claims factuels** (\"intervention en 30 minutes pour un dégât des eaux\", \"remplacement d'un ballon d'eau chaude en 2 heures\"), pas juste \"super service 5 étoiles\". Ces claims factuels alimentent le grounding et renforcent les affirmations de votre page locale.\n\n## Monitoring et détection des régressions locales\n\nLes pages locales sont particulièrement vulnérables aux régressions silencieuses. Un déploiement qui casse le SSR sur 15% des pages, un changement de template qui supprime le JSON-LD, un redirect chain qui s'installe entre l'ancienne et la nouvelle URL d'une ville — ces problèmes passent inaperçus pendant des semaines si vous ne monitorez pas activement.\n\n### Ce qu'il faut surveiller\n\n**JSON-LD présent et valide sur chaque page locale.** Utilisez Screaming Frog en mode liste (importez toutes vos URLs locales) avec l'extraction personnalisée pour vérifier la présence du `@type: LocalBusiness` dans le HTML brut.\n\n**Canonical auto-référent.** Chaque page locale doit avoir un canonical qui pointe vers elle-même. Un canonical qui pointe vers la mauvaise ville — ça arrive avec les templates dynamiques — détruit l'indexation de la page.\n\n**Temps de réponse serveur.** Les pages locales générées dynamiquement peuvent avoir des temps de réponse variables selon la charge. Un TTFB > 800ms sur une page locale est un signal d'alerte.\n\n**Cohérence entre le sitemap et les pages réellement accessibles.** Si votre sitemap liste 340 URLs mais que 20 d'entre elles retournent un 404 ou un soft 404, vous gaspillez du [crawl budget et risquez un effondrement de trafic](/blog/how-soft-404s-and-indexing-issues-caused-a-90-traffic-collapse).\n\nUn outil de monitoring continu comme Seogard détecte automatiquement ce type de régression — la disparition d'un bloc JSON-LD, un canonical modifié, un changement de statut HTTP — et alerte avant que l'impact SEO ne se matérialise dans vos données Search Console, qui arrivent toujours avec plusieurs jours de retard.\n\n## Au-delà des AI Overviews : préparer les pages locales pour AI Mode\n\nGoogle AI Mode (accessible via Chrome) va plus loin que les AI Overviews : il permet des conversations multi-tours où l'utilisateur affine sa requête locale. \"Trouve un plombier à Lyon 3e\" → \"Lequel est ouvert le dimanche ?\" → \"Combien coûte un débouchage ?\" Chaque étape est une opportunité de citation — ou d'exclusion.\n\nPour que vos pages locales survivent à ce parcours conversationnel, chaque fait doit être **atomique et extractible** : un prix dans une balise `Offer`, un horaire dans `OpeningHoursSpecification`, une zone dans `areaServed`. Le LLM ne va pas parser un paragraphe de 200 mots pour en extraire un horaire noyé dans le texte.\n\nL'évolution des [liens dans les AI Overviews et AI Mode](/blog/google-updates-links-within-ai-overviews-ai-mode) confirme que Google augmente progressivement les citations de sources dans les réponses générées. Les pages qui fournissent des données structurées granulaires et vérifiables sont celles qui captent ces citations.\n\nLa construction de pages locales performantes dans l'AI Search n'est pas un exercice de création de contenu — c'est un exercice d'ingénierie de l'information. Le contenu doit être spécifique et vérifiable, la structure doit être extractible par machine, et la cohérence entre sources doit être maintenue en continu. Les équipes qui traitent leurs pages locales comme un problème technique — et non comme un problème éditorial — sont celles qui captent les citations dans les réponses AI.","https://seogard.io/blog/how-to-build-local-pages-that-win-in-ai-powered-search-via-sejournal-lorenbaker","Actualités SEO","2026-05-13T06:02:58.743Z","2026-05-13","Guide technique pour construire des pages locales qui performent dans les AI Overviews et AI Mode. Schema, SSR, contenu structuré.","\u003Cp>Google AI Overviews et AI Mode reformulent les résultats locaux en synthèses contextuelles. Une page locale qui ranke en position 3 sur une requête classique peut être totalement absente de la réponse générée par le LLM. Le problème n'est presque jamais le contenu lui-même — c'est l'architecture technique qui empêche le modèle d'extraire, de vérifier et de citer l'information locale.\u003C/p>\n\u003Ch2>Pourquoi les pages locales classiques échouent dans l'AI Search\u003C/h2>\n\u003Cp>Le modèle de génération derrière AI Overviews ne \"lit\" pas une page locale comme un humain. Il procède par extraction d'entités, vérification croisée entre sources, et sélection de fragments citables. Une page locale typique — nom de ville en H1, paragraphe générique sur le service, carte Google Maps embed, formulaire de contact — ne fournit rien de tout ça.\u003C/p>\n\u003Ch3>Le problème du template local dupliqué\u003C/h3>\n\u003Cp>Le pattern le plus répandu chez les entreprises multi-sites : un template identique déployé sur 50, 200 ou 2 000 villes, avec comme seule variation le nom de la localité injecté dynamiquement. Google sait détecter ce pattern depuis des années (voir les guidelines sur les \u003Ca href=\"https://developers.google.com/search/docs/essentials/spam-policies#doorway-pages\">doorway pages\u003C/a>). Mais dans le contexte AI, le problème est plus profond.\u003C/p>\n\u003Cp>Un LLM qui grounding sa réponse a besoin de \u003Cstrong>signaux de différenciation sémantique\u003C/strong> entre les pages. Si 200 pages partagent 90% du même contenu et que seul le nom de ville change, le modèle n'a aucune raison de préférer l'une à l'autre — et il ne citera probablement aucune d'entre elles. Il ira chercher une source qui offre une information spécifique à la localité : un annuaire local, un article de presse régionale, un avis Google Business détaillé.\u003C/p>\n\u003Ch3>Ce que le grounding attend d'une page locale\u003C/h3>\n\u003Cp>Le processus de grounding — la façon dont un LLM vérifie et ancre ses affirmations dans des sources — repose sur la correspondance entre des \u003Cstrong>claims\u003C/strong> (affirmations factuelles) et des \u003Cstrong>passages structurés\u003C/strong> dans les documents sources. Pour le local, ça signifie :\u003C/p>\n\u003Cul>\n\u003Cli>Des affirmations factuelles vérifiables (adresse, horaires, services spécifiques à cette localité)\u003C/li>\n\u003Cli>Un balisage sémantique qui rend ces faits extractibles par machine\u003C/li>\n\u003Cli>Une cohérence entre le contenu on-page et les données structurées off-page (Google Business Profile, annuaires, NAP)\u003C/li>\n\u003C/ul>\n\u003Cp>Si vous voulez comprendre en profondeur comment le grounding diffère de l'indexation classique, l'analyse de \u003Ca href=\"/blog/bing-reveals-what-grounding-means-for-ai-search-visibility-via-sejournal-mattgsouthern\">ce que Bing a révélé sur le grounding\u003C/a> est un bon point de départ.\u003C/p>\n\u003Ch2>Architecture technique d'une page locale AI-ready\u003C/h2>\n\u003Cp>Voici l'architecture que nous recommandons pour une page locale qui doit performer à la fois en search classique et en AI Search. Le principe : chaque fait local doit exister à trois niveaux — HTML visible, données structurées JSON-LD, et métadonnées sémantiques.\u003C/p>\n\u003Ch3>Le squelette HTML sémantique\u003C/h3>\n\u003Cp>Chaque page locale doit contenir des sections clairement identifiables par un crawler ou un modèle. Pas de div générique — utilisez des éléments sémantiques HTML5 avec des attributs \u003Ccode>itemscope\u003C/code> et \u003Ccode>itemtype\u003C/code> en backup du JSON-LD.\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">article\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemscope\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemtype\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/LocalBusiness\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">header\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">h1\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Plomberie Durand — Intervention à Lyon 3e&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">h1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">p\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"description\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      Service de plomberie d'urgence dans le 3e arrondissement de Lyon.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      Intervention sous 45 minutes, 7j/7, depuis notre dépôt rue Paul Bert.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">p\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">header\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">section\u003C/span>\u003Cspan style=\"color:#B392F0\"> aria-labelledby\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"address-heading\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">h2\u003C/span>\u003Cspan style=\"color:#B392F0\"> id\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"address-heading\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Zone d'intervention et accès&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">h2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">address\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"address\"\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemscope\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemtype\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/PostalAddress\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"streetAddress\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>127 rue Paul Bert&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"postalCode\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>69003&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"addressLocality\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Lyon&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"addressRegion\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Rhône&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">address\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">p\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Quartiers couverts en moins de 30 minutes : Part-Dieu, Villette,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">       Montchat, Sans Souci, Dauphiné. Accès direct via le boulevard\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">       Vivier-Merle — stationnement dédié véhicule d'intervention.&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">p\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">section\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">section\u003C/span>\u003Cspan style=\"color:#B392F0\"> aria-labelledby\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"services-heading\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">h2\u003C/span>\u003Cspan style=\"color:#B392F0\"> id\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"services-heading\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Services spécifiques Lyon 3e&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">h2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">ul\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"hasOfferCatalog\"\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemscope\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        itemtype\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/OfferCatalog\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">li\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"itemListElement\"\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemscope\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">          itemtype\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/Offer\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Débouchage canalisations immeuble haussmannien&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">meta\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"priceCurrency\"\u003C/span>\u003Cspan style=\"color:#B392F0\"> content\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"EUR\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">/>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"price\"\u003C/span>\u003Cspan style=\"color:#B392F0\"> content\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"120\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>à partir de 120 €&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">li\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">li\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"itemListElement\"\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemscope\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">          itemtype\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/Offer\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Remplacement colonne montante copropriété&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">meta\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"priceCurrency\"\u003C/span>\u003Cspan style=\"color:#B392F0\"> content\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"EUR\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">/>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"price\"\u003C/span>\u003Cspan style=\"color:#B392F0\"> content\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"2500\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>à partir de 2 500 €&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">span\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">li\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">ul\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">section\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">section\u003C/span>\u003Cspan style=\"color:#B392F0\"> aria-labelledby\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"hours-heading\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">h2\u003C/span>\u003Cspan style=\"color:#B392F0\"> id\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"hours-heading\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Horaires d'intervention Lyon 3e&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">h2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">time\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"openingHours\"\u003C/span>\u003Cspan style=\"color:#B392F0\"> datetime\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Mo-Fr 07:00-21:00\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      Lundi – Vendredi : 7h – 21h\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">time\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">time\u003C/span>\u003Cspan style=\"color:#B392F0\"> itemprop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"openingHours\"\u003C/span>\u003Cspan style=\"color:#B392F0\"> datetime\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Sa-Su 08:00-18:00\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      Samedi – Dimanche : 8h – 18h\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">time\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">section\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">article\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Trois choses à noter dans cette structure :\u003C/p>\n\u003Col>\n\u003Cli>\u003Cstrong>Chaque section a un heading sémantique\u003C/strong> lié par \u003Ccode>aria-labelledby\u003C/code>. Le LLM et les crawlers peuvent identifier le sujet de chaque bloc sans parser le contenu.\u003C/li>\n\u003Cli>\u003Cstrong>Les prix sont balisés avec \u003Ccode>Offer\u003C/code>\u003C/strong> — c'est un signal de spécificité locale. Un template générique ne contient jamais de prix localisés.\u003C/li>\n\u003Cli>\u003Cstrong>La zone d'intervention est décrite en texte libre\u003C/strong> avec des noms de quartiers réels, pas juste \"Lyon\". Ça fournit des entités géographiques granulaires pour le grounding.\u003C/li>\n\u003C/ol>\n\u003Ch3>JSON-LD complet pour le local\u003C/h3>\n\u003Cp>Le microdata dans le HTML ne suffit pas. Ajoutez un bloc JSON-LD complet qui consolide toutes les informations et ajoute des propriétés que le HTML ne peut pas porter proprement :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"@context\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Plumber\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"@id\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://plomberie-durand.fr/lyon-3e/#business\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Plomberie Durand — Lyon 3e\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"url\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://plomberie-durand.fr/lyon-3e/\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"telephone\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"+33472XXXXXX\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"email\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"lyon3@plomberie-durand.fr\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"address\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"PostalAddress\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"streetAddress\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"127 rue Paul Bert\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"postalCode\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"69003\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"addressLocality\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Lyon\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"addressRegion\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Auvergne-Rhône-Alpes\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"addressCountry\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"FR\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"geo\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"GeoCoordinates\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"latitude\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">45.7578\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"longitude\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">4.8715\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"areaServed\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"City\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Lyon\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"sameAs\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://www.wikidata.org/wiki/Q456\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"AdministrativeArea\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Lyon 3e arrondissement\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"openingHoursSpecification\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"OpeningHoursSpecification\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"dayOfWeek\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Monday\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Tuesday\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Wednesday\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Thursday\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Friday\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"opens\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"07:00\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"closes\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"21:00\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"OpeningHoursSpecification\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"dayOfWeek\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Saturday\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Sunday\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"opens\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"08:00\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"closes\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"18:00\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"aggregateRating\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"AggregateRating\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"ratingValue\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"4.7\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"reviewCount\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"183\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"sameAs\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"https://www.google.com/maps/place/...\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"https://www.pagesjaunes.fr/...\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  ]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le point critique : la propriété \u003Ccode>sameAs\u003C/code> et le lien Wikidata dans \u003Ccode>areaServed\u003C/code>. Ces références permettent au modèle de \u003Cstrong>résoudre l'entité géographique\u003C/strong> sans ambiguïté. \"Lyon 3e\" peut être interprété de multiples façons — le lien Wikidata lève l'ambiguïté. C'est exactement le type de signal que le grounding exploite, comme l'explique l'article sur \u003Ca href=\"/blog/why-ai-visibility-starts-before-search-and-ends-with-citations\">la visibilité AI qui commence avant la recherche\u003C/a>.\u003C/p>\n\u003Ch2>Contenu localement différencié : la clé du grounding\u003C/h2>\n\u003Cp>Le balisage technique ne fait que rendre l'information extractible. Encore faut-il que cette information soit \u003Cstrong>unique et spécifique\u003C/strong> à la localité.\u003C/p>\n\u003Ch3>Ce qui différencie vraiment une page locale\u003C/h3>\n\u003Cp>Voici les types de contenu qui créent une différenciation suffisante pour que le LLM sélectionne votre page plutôt qu'une autre :\u003C/p>\n\u003Cp>\u003Cstrong>Données factuelles locales vérifiables.\u003C/strong> Pas \"nous intervenons à Lyon\" mais \"temps d'intervention moyen de 38 minutes depuis notre dépôt de la rue Paul Bert vers le quartier Part-Dieu, mesuré sur 247 interventions en 2025\". Ce type d'affirmation est vérifiable par croisement avec votre Google Business Profile et vos avis clients.\u003C/p>\n\u003Cp>\u003Cstrong>Contexte géographique technique.\u003C/strong> Pour un plombier : \"Les immeubles du quartier Villette (construits entre 1960 et 1975) utilisent majoritairement des colonnes en fonte — nos techniciens sont équipés de caméras d'inspection et de furets motorisés adaptés à ce type de réseau.\" Ce n'est pas du contenu marketing — c'est de l'information technique spécifique à une zone.\u003C/p>\n\u003Cp>\u003Cstrong>Références croisées locales.\u003C/strong> Mentionner des entités locales vérifiables : \"Partenaire de la régie Alliade Habitat pour la maintenance des 1 200 logements du parc HLM du 3e arrondissement.\" Ce type de claim crée un lien d'entité que le LLM peut vérifier via d'autres sources.\u003C/p>\n\u003Ch3>Le piège du contenu \"localisé\" par IA générative\u003C/h3>\n\u003Cp>Beaucoup d'équipes SEO utilisent maintenant des LLM pour générer du contenu localisé à grande échelle. Le problème : un LLM qui génère du contenu sur \"Lyon 3e\" produit des généralités tirées de son training data, pas des faits spécifiques à votre business dans cette zone. Google \u003Ca href=\"/blog/google-s-quality-threshold-is-quietly-killing-scaled-ai-content-via-sejournal-taylordanrw\">détecte et pénalise le contenu scalé de faible qualité\u003C/a> — et les AI Overviews ne le citent tout simplement pas.\u003C/p>\n\u003Cp>La seule approche viable : un template technique solide (la structure HTML/JSON-LD ci-dessus) + un contenu éditorial qui ne peut venir que de données internes (CRM, historique d'interventions, témoignages clients localisés).\u003C/p>\n\u003Ch2>SSR et rendu : les pages locales doivent être crawlables sans JavaScript\u003C/h2>\n\u003Cp>Si vous utilisez un framework JavaScript pour vos pages locales — React, Vue, Angular — le rendu côté serveur n'est pas optionnel. C'est un prérequis absolu.\u003C/p>\n\u003Ch3>Pourquoi le CSR tue vos pages locales dans l'AI Search\u003C/h3>\n\u003Cp>Google peut techniquement exécuter du JavaScript pour le rendering. Mais les bots d'AI Search — y compris les crawlers qui alimentent les modèles de grounding — n'ont pas forcément cette capacité. Le \u003Ca href=\"/blog/google-is-testing-new-bot-authorization-standard-via-sejournal-martinibuster\">bot authorization standard que Google teste\u003C/a> montre bien que l'écosystème de crawl se fragmente : vous ne savez plus exactement qui crawle quoi, et avec quelles capacités de rendering.\u003C/p>\n\u003Cp>Vérifiez le rendu de vos pages locales avec un test simple dans Chrome DevTools :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Désactivez JavaScript et observez le résultat\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Chrome DevTools > Settings > Debugger > Disable JavaScript\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Ou testez avec curl pour voir ce que reçoit un bot sans JS\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">curl\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -s\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -A\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Mozilla/5.0 (compatible; Googlebot/2.1)\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  \"https://plomberie-durand.fr/lyon-3e/\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  grep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -c\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"127 rue Paul Bert\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Si le résultat est 0, votre adresse n'est pas dans le HTML initial\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Le grounding ne la verra probablement pas\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Si votre adresse, vos horaires, votre JSON-LD ou vos prix n'apparaissent pas dans le HTML initial (avant exécution JavaScript), vous avez un problème. Les \u003Ca href=\"/blog/5-javascript-seo-lessons-from-top-ecommerce-sites\">leçons de JavaScript SEO tirées du e-commerce\u003C/a> s'appliquent intégralement aux pages locales.\u003C/p>\n\u003Ch3>Configuration SSR pour les pages locales Next.js\u003C/h3>\n\u003Cp>Pour les sites construits avec Next.js (le cas le plus fréquent en 2026 pour les sites multi-locations), utilisez \u003Ccode>getServerSideProps\u003C/code> ou le App Router avec des Server Components pour garantir que les données locales sont dans le HTML initial :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// app/locations/[city]/page.tsx — Next.js App Router\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { Metadata } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'next'\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { getLocationData } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '@/lib/locations'\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { LocalBusinessJsonLd } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '@/components/LocalBusinessJsonLd'\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> Props\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  params\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"color:#FFAB70\">city\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Génération statique des pages locales au build\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">export\u003C/span>\u003Cspan style=\"color:#F97583\"> async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> generateStaticParams\u003C/span>\u003Cspan style=\"color:#E1E4E8\">() {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> locations\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> getAllLocations\u003C/span>\u003Cspan style=\"color:#E1E4E8\">()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> locations.\u003C/span>\u003Cspan style=\"color:#B392F0\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">loc\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ({ city: loc.slug }))\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Metadata dynamique par localité\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">export\u003C/span>\u003Cspan style=\"color:#F97583\"> async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> generateMetadata\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({ \u003C/span>\u003Cspan style=\"color:#FFAB70\">params\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> }\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Props\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Promise\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">Metadata\u003C/span>\u003Cspan style=\"color:#E1E4E8\">> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> location\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> getLocationData\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(params.city)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    title: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">location\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">businessName\u003C/span>\u003Cspan style=\"color:#9ECBFF\">} — ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">location\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">cityName\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    description: location.metaDescription,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    alternates: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      canonical: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`https://plomberie-durand.fr/${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">params\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">city\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}/`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Page component — rendu côté serveur, zéro JS requis pour le contenu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">export\u003C/span>\u003Cspan style=\"color:#F97583\"> default\u003C/span>\u003Cspan style=\"color:#F97583\"> async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> LocationPage\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({ \u003C/span>\u003Cspan style=\"color:#FFAB70\">params\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> }\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Props\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> location\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> getLocationData\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(params.city)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">article itemScope itemType\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/Plumber\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">LocalBusinessJsonLd data\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{location} \u003C/span>\u003Cspan style=\"color:#F97583\">/>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">header\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">h1 itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"name\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          {\u003C/span>\u003Cspan style=\"color:#FFAB70\">location\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">businessName\u003C/span>\u003Cspan style=\"color:#E1E4E8\">} — {\u003C/span>\u003Cspan style=\"color:#FFAB70\">location\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">cityName\u003C/span>\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">h1\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">p itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"description\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{location.localDescription}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">p\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">header\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">section aria\u003C/span>\u003Cspan style=\"color:#F97583\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\">labelledby\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"area-heading\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">h2 id\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"area-heading\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">Zone d\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'intervention {location.cityName}&#x3C;/h2\u003C/span>\u003Cspan style=\"color:#FDAEB7;font-style:italic\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">address itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"address\"\u003C/span>\u003Cspan style=\"color:#FFAB70\"> itemScope\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">                 itemType\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/PostalAddress\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">          &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">span itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"streetAddress\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{location.street}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">span\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">          &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">span itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"postalCode\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{location.postalCode}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">span\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">          &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">span itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"addressLocality\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{location.cityName}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">span\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">address\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">p\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>{location.areaDescription}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">p\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">ul\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          {\u003C/span>\u003Cspan style=\"color:#FFAB70\">location\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">neighborhoods\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">n\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">li key\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{n.slug}\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{n.name} — {\u003C/span>\u003Cspan style=\"color:#FFAB70\">n\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">avgResponseTime\u003C/span>\u003Cspan style=\"color:#E1E4E8\">} min\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">li\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          ))}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">ul\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">section\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">section aria\u003C/span>\u003Cspan style=\"color:#F97583\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\">labelledby\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"services-heading\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">h2 id\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"services-heading\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          Services spécifiques {\u003C/span>\u003Cspan style=\"color:#FFAB70\">location\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">cityName\u003C/span>\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">h2\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        {\u003C/span>\u003Cspan style=\"color:#FFAB70\">location\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">localServices\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">service\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">          &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">div key\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{service.id} itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"hasOfferCatalog\"\u003C/span>\u003Cspan style=\"color:#FFAB70\"> itemScope\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">               itemType\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/Offer\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">h3 itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"name\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{service.name}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">h3\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            &#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">p\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>{service.localContext}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">p\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            &#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">p\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003Cspan style=\"color:#79B8FF\">À\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> partir de \u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">span itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"price\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">               content\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{service.price}\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{service.priceFormatted}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">span\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">              &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">meta itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"priceCurrency\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> content\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"EUR\"\u003C/span>\u003Cspan style=\"color:#F97583\"> />\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">p\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">          &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">div\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        ))}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">section\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">article\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  )\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>L'avantage de \u003Ccode>generateStaticParams\u003C/code> : les pages sont pré-rendues au build. Le HTML complet, incluant le JSON-LD et toutes les données locales, est servi instantanément. Pas de waterfall, pas de client-side fetch, pas de skeleton screen que le bot voit à la place du contenu.\u003C/p>\n\u003Ch2>Scénario concret : migration de 340 pages locales\u003C/h2>\n\u003Cp>Un réseau de cliniques vétérinaires avec 85 établissements en France. Avant migration : un SPA React avec les données locales chargées via API après le premier rendu. 340 pages locales (85 villes × 4 services par ville).\u003C/p>\n\u003Ch3>État initial\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Trafic organique local\u003C/strong> : 12 400 visites/mois\u003C/li>\n\u003Cli>\u003Cstrong>Pages indexées dans Search Console\u003C/strong> : 340 soumises, 187 indexées (55%). Les 153 autres en \"Crawled — currently not indexed\" ou \"Discovered — currently not indexed\".\u003C/li>\n\u003Cli>\u003Cstrong>Présence dans AI Overviews\u003C/strong> : 0 citations détectées sur un échantillon de 200 requêtes locales monitorées.\u003C/li>\n\u003Cli>\u003Cstrong>Temps de rendu complet\u003C/strong> (mesuré via Screaming Frog en mode JavaScript rendering) : 4,2 secondes en moyenne.\u003C/li>\n\u003C/ul>\n\u003Ch3>Actions techniques\u003C/h3>\n\u003Col>\n\u003Cli>\u003Cstrong>Migration vers Next.js App Router avec SSR statique\u003C/strong> (ISR toutes les 6 heures pour les données dynamiques comme les horaires exceptionnels).\u003C/li>\n\u003Cli>\u003Cstrong>Ajout du JSON-LD LocalBusiness\u003C/strong> avec \u003Ccode>@type: VeterinaryCare\u003C/code>, \u003Ccode>areaServed\u003C/code> avec liens Wikidata, \u003Ccode>aggregateRating\u003C/code> tiré de Google Business Profile via l'API.\u003C/li>\n\u003Cli>\u003Cstrong>Contenu différencié\u003C/strong> : chaque page a reçu un paragraphe de contexte local rédigé par le vétérinaire responsable (espèces les plus traitées dans la zone, partenariats avec les refuges locaux, particularités du parc animalier de la ville).\u003C/li>\n\u003Cli>\u003Cstrong>Maillage interne local\u003C/strong> : chaque page de ville lie vers les pages de services spécifiques et vers les 2-3 villes les plus proches géographiquement.\u003C/li>\n\u003Cli>\u003Cstrong>Monitoring des régressions\u003C/strong> : un outil comme Seogard a été configuré pour alerter si le JSON-LD disparaît d'une page locale (ça arrive plus souvent qu'on ne le pense lors des déploiements), si un canonical est mal généré, ou si le SSR casse sur un subset de pages.\u003C/li>\n\u003C/ol>\n\u003Ch3>Résultats après 14 semaines\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Pages indexées\u003C/strong> : 327/340 (96%)\u003C/li>\n\u003Cli>\u003Cstrong>Trafic organique local\u003C/strong> : 28 700 visites/mois (+131%)\u003C/li>\n\u003Cli>\u003Cstrong>Citations AI Overviews détectées\u003C/strong> : 23 requêtes locales sur l'échantillon de 200 (11,5%). Principalement sur des requêtes de type \"vétérinaire urgence [ville]\" et \"clinique vétérinaire ouverte dimanche [ville]\".\u003C/li>\n\u003Cli>\u003Cstrong>Temps de rendu\u003C/strong> : 0,3 secondes (HTML statique).\u003C/li>\n\u003C/ul>\n\u003Cp>Le facteur déterminant n'a pas été le contenu seul, ni le balisage seul. C'est la combinaison : HTML sémantique crawlable immédiatement + données structurées complètes + contenu localement unique + cohérence avec les signaux off-page (Google Business Profile, NAP dans les annuaires).\u003C/p>\n\u003Ch2>Signaux off-page et cohérence des entités\u003C/h2>\n\u003Cp>Le balisage on-page ne suffit pas si vos signaux off-page contredisent vos données. Le grounding effectue une \u003Cstrong>vérification croisée\u003C/strong> : si votre JSON-LD dit \"ouvert le dimanche 8h-18h\" mais que votre Google Business Profile dit \"fermé le dimanche\", le modèle a un signal contradictoire — et il ne citera ni l'un ni l'autre.\u003C/p>\n\u003Ch3>NAP consistency à l'ère du grounding\u003C/h3>\n\u003Cp>La cohérence NAP (Name, Address, Phone) est un classique du local SEO. Dans le contexte AI, elle prend une dimension supplémentaire : le modèle ne regarde plus seulement si l'information existe, mais si elle est \u003Cstrong>cohérente entre les sources\u003C/strong>.\u003C/p>\n\u003Cp>Vérifiez systématiquement :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Google Business Profile\u003C/strong> vs contenu on-page vs JSON-LD : les trois doivent être identiques, caractère par caractère pour l'adresse et le téléphone.\u003C/li>\n\u003Cli>\u003Cstrong>Annuaires tiers\u003C/strong> (PagesJaunes, Yelp, TripAdvisor selon le secteur) : même logique.\u003C/li>\n\u003Cli>\u003Cstrong>Wikidata\u003C/strong> si votre business y est référencé : la propriété \u003Ccode>sameAs\u003C/code> dans votre JSON-LD doit pointer vers la bonne entité.\u003C/li>\n\u003C/ul>\n\u003Cp>Le suivi des \u003Ca href=\"/blog/8-geo-metrics-to-track-in-2026\">métriques géographiques en 2026\u003C/a> montre que la cohérence inter-sources est devenue un KPI à part entière, pas un nice-to-have.\u003C/p>\n\u003Ch3>Les avis comme source de claims pour le grounding\u003C/h3>\n\u003Cp>Les avis Google Business Profile servent de source de vérification pour le LLM. Quand un utilisateur demande \"est-ce que le plombier Durand à Lyon 3e est fiable ?\", le modèle synthétise les avis — pas votre page \"À propos\".\u003C/p>\n\u003Cp>Implication technique : encouragez des avis qui contiennent des \u003Cstrong>claims factuels\u003C/strong> (\"intervention en 30 minutes pour un dégât des eaux\", \"remplacement d'un ballon d'eau chaude en 2 heures\"), pas juste \"super service 5 étoiles\". Ces claims factuels alimentent le grounding et renforcent les affirmations de votre page locale.\u003C/p>\n\u003Ch2>Monitoring et détection des régressions locales\u003C/h2>\n\u003Cp>Les pages locales sont particulièrement vulnérables aux régressions silencieuses. Un déploiement qui casse le SSR sur 15% des pages, un changement de template qui supprime le JSON-LD, un redirect chain qui s'installe entre l'ancienne et la nouvelle URL d'une ville — ces problèmes passent inaperçus pendant des semaines si vous ne monitorez pas activement.\u003C/p>\n\u003Ch3>Ce qu'il faut surveiller\u003C/h3>\n\u003Cp>\u003Cstrong>JSON-LD présent et valide sur chaque page locale.\u003C/strong> Utilisez Screaming Frog en mode liste (importez toutes vos URLs locales) avec l'extraction personnalisée pour vérifier la présence du \u003Ccode>@type: LocalBusiness\u003C/code> dans le HTML brut.\u003C/p>\n\u003Cp>\u003Cstrong>Canonical auto-référent.\u003C/strong> Chaque page locale doit avoir un canonical qui pointe vers elle-même. Un canonical qui pointe vers la mauvaise ville — ça arrive avec les templates dynamiques — détruit l'indexation de la page.\u003C/p>\n\u003Cp>\u003Cstrong>Temps de réponse serveur.\u003C/strong> Les pages locales générées dynamiquement peuvent avoir des temps de réponse variables selon la charge. Un TTFB > 800ms sur une page locale est un signal d'alerte.\u003C/p>\n\u003Cp>\u003Cstrong>Cohérence entre le sitemap et les pages réellement accessibles.\u003C/strong> Si votre sitemap liste 340 URLs mais que 20 d'entre elles retournent un 404 ou un soft 404, vous gaspillez du \u003Ca href=\"/blog/how-soft-404s-and-indexing-issues-caused-a-90-traffic-collapse\">crawl budget et risquez un effondrement de trafic\u003C/a>.\u003C/p>\n\u003Cp>Un outil de monitoring continu comme Seogard détecte automatiquement ce type de régression — la disparition d'un bloc JSON-LD, un canonical modifié, un changement de statut HTTP — et alerte avant que l'impact SEO ne se matérialise dans vos données Search Console, qui arrivent toujours avec plusieurs jours de retard.\u003C/p>\n\u003Ch2>Au-delà des AI Overviews : préparer les pages locales pour AI Mode\u003C/h2>\n\u003Cp>Google AI Mode (accessible via Chrome) va plus loin que les AI Overviews : il permet des conversations multi-tours où l'utilisateur affine sa requête locale. \"Trouve un plombier à Lyon 3e\" → \"Lequel est ouvert le dimanche ?\" → \"Combien coûte un débouchage ?\" Chaque étape est une opportunité de citation — ou d'exclusion.\u003C/p>\n\u003Cp>Pour que vos pages locales survivent à ce parcours conversationnel, chaque fait doit être \u003Cstrong>atomique et extractible\u003C/strong> : un prix dans une balise \u003Ccode>Offer\u003C/code>, un horaire dans \u003Ccode>OpeningHoursSpecification\u003C/code>, une zone dans \u003Ccode>areaServed\u003C/code>. Le LLM ne va pas parser un paragraphe de 200 mots pour en extraire un horaire noyé dans le texte.\u003C/p>\n\u003Cp>L'évolution des \u003Ca href=\"/blog/google-updates-links-within-ai-overviews-ai-mode\">liens dans les AI Overviews et AI Mode\u003C/a> confirme que Google augmente progressivement les citations de sources dans les réponses générées. Les pages qui fournissent des données structurées granulaires et vérifiables sont celles qui captent ces citations.\u003C/p>\n\u003Cp>La construction de pages locales performantes dans l'AI Search n'est pas un exercice de création de contenu — c'est un exercice d'ingénierie de l'information. Le contenu doit être spécifique et vérifiable, la structure doit être extractible par machine, et la cohérence entre sources doit être maintenue en continu. Les équipes qui traitent leurs pages locales comme un problème technique — et non comme un problème éditorial — sont celles qui captent les citations dans les réponses AI.\u003C/p>",null,12,[18,19,20,21,22],"local SEO","AI search","pages locales","schema markup","SSR","Pages locales pour l'AI Search : architecture technique","Wed May 13 2026 06:02:58 GMT+0000 (Coordinated Universal Time)",[26,42,55],{"_id":27,"slug":28,"__v":6,"author":7,"canonical":29,"category":10,"createdAt":30,"date":31,"description":32,"image":15,"imageAlt":15,"readingTime":33,"tags":34,"title":40,"updatedAt":41},"6a02c291aa6b273b0c2a74f9","the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus","https://seogard.io/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus","2026-05-12T06:02:57.339Z","2026-05-12","Comment adapter votre audit technique SEO aux exigences des AI Overviews, du crawl par les LLMs et du grounding. Méthodes, code et scénarios concrets.",14,[35,36,37,38,39],"tech seo audit","ai search","ai visibility","crawl budget","structured data","Audit SEO technique pour l'ère AI Search : guide avancé","Tue May 12 2026 06:02:57 GMT+0000 (Coordinated Universal Time)",{"_id":43,"slug":44,"__v":6,"author":7,"canonical":45,"category":10,"createdAt":46,"date":31,"description":47,"image":15,"imageAlt":15,"readingTime":16,"tags":48,"title":53,"updatedAt":54},"6a02fac0aa6b273b0c58d096","the-consensus-gap-via-sejournal-kevin-indig","https://seogard.io/blog/the-consensus-gap-via-sejournal-kevin-indig","2026-05-12T10:02:40.519Z","Une marque peut dominer dans un dashboard AI agrégé et être absente de deux moteurs sur trois. Analyse technique du Consensus Gap et méthodes pour le détecter.",[49,19,50,51,52],"consensus gap","LLM visibility","GEO","multi-engine","The Consensus Gap : votre marque visible sur un LLM, invisible sur deux autres","Tue May 12 2026 10:02:40 GMT+0000 (Coordinated Universal Time)",{"_id":56,"slug":57,"__v":6,"author":7,"canonical":58,"category":10,"createdAt":59,"date":31,"description":60,"image":15,"imageAlt":15,"readingTime":16,"tags":61,"title":67,"updatedAt":68},"6a034125aa6b273b0c92e66e","how-soft-404s-and-indexing-issues-caused-a-90-traffic-collapse","https://seogard.io/blog/how-soft-404s-and-indexing-issues-caused-a-90-traffic-collapse","2026-05-12T15:03:01.689Z","Comment des soft 404s massives après une migration ont provoqué une chute de 90% du trafic organique, et les étapes techniques pour inverser la tendance.",[62,63,64,65,66],"soft 404","indexation","migration","Search Console","SEO technique","Soft 404s et désindexation : autopsie d'un crash de trafic à -90%","Tue May 12 2026 15:03:01 GMT+0000 (Coordinated Universal Time)"]