[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fUKGtHt5cRV5Z6xRLucD2ws3H7yJHKYPfMeA3ah__W4E":3,"$fP1Xk6AAEIQbYbTxiPuds_uxff6PkD6ZQAKtLoVtOlZM":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},"69e12448aa6b273b0cf69d59","why-your-website-is-now-the-source-of-truth-in-local-ai-search",0,"Equipe Seogard","Un restaurant lyonnais avec 4.7 étoiles sur Google, 800 avis, et un site dont la page \"Horaires\" affiche encore les créneaux COVID de 2021. ChatGPT donne les bons horaires — ceux de Google My Business. Mais le client qui clique sur le site pour réserver trouve une page contradictoire et abandonne. Le problème n'est pas l'IA. Le problème, c'est que le site web a cessé d'être la source de vérité.\n\n## Le basculement : quand l'IA locale ne fait plus confiance à votre site\n\nPendant une décennie, la chaîne d'information locale était simple : fiche Google Business Profile (GBP) → pack local → clic vers le site. Le site servait de point d'atterrissage et de conversion. Les incohérences entre GBP et le site existaient, mais les utilisateurs naviguaient assez pour les résoudre eux-mêmes.\n\nAvec les AI Overviews, Google Gemini, ChatGPT avec browsing, et les agents IA de type [agentic search](/blog/google-s-task-based-agentic-search-is-disrupting-seo-today-not-tomorrow-via-sejournal-martinibuster), ce modèle est cassé. L'IA synthétise des réponses à partir de multiples sources — GBP, Yelp, TripAdvisor, Reddit, le site lui-même — et choisit la version qu'elle juge la plus fiable. Si votre site contredit votre fiche Google ou affiche des données structurées incohérentes, l'IA va privilégier une autre source. Vous perdez le contrôle du récit.\n\n### Le problème de la triangulation\n\nLes LLMs qui alimentent le search local procèdent par triangulation : ils croisent les informations provenant de 3+ sources pour établir un fait. Nom de l'entreprise, adresse, téléphone (NAP), horaires, services proposés, fourchette de prix — tout est recoupé.\n\nQuand les données concordent entre GBP, le site, et les annuaires tiers, l'IA gagne en confiance et attribue le contenu à la source la plus riche — souvent le site. Quand il y a divergence, l'IA peut :\n\n1. Choisir la source avec le plus de signaux de fraîcheur (souvent GBP, mis à jour plus fréquemment).\n2. Ignorer le site et citer un forum ou un avis tiers.\n3. Afficher un résultat ambigu avec des qualifications (\"selon certaines sources…\").\n\nLe scénario 2 est exactement ce que décrit la tendance documentée où [le contenu propriétaire perd face à un commentaire Reddit](/blog/your-owned-content-is-losing-to-a-stranger-s-reddit-comment-via-sejournal-duaneforrester). Ce phénomène, déjà visible en SEO classique, est amplifié dans le contexte du search IA local.\n\n### Le cas concret : un réseau de cliniques vétérinaires (23 établissements)\n\nPrenons un réseau de 23 cliniques vétérinaires réparties en Île-de-France. Chaque clinique a sa page dédiée sur le site principal (architecture `/cliniques/ville-nom/`), sa fiche GBP, et des fiches sur PagesJaunes et Doctolib.\n\nAprès un audit, voici ce qu'on découvre :\n\n- **9 cliniques sur 23** ont des horaires différents entre le site et GBP (souvent parce que le site n'a pas été mis à jour après un changement de planning).\n- **4 cliniques** affichent un numéro de téléphone obsolète sur le site (migration vers un nouveau standard téléphonique 6 mois plus tôt).\n- **Le schema LocalBusiness** est présent mais utilise `@type: VeterinaryCare` sur seulement 11 pages — les 12 autres utilisent le type générique `LocalBusiness`.\n- Aucune page n'implémente `openingHoursSpecification` avec les exceptions de jours fériés.\n\nRésultat dans les AI Overviews : pour les requêtes locales type \"vétérinaire urgence [ville]\", l'IA cite les horaires de GBP et renvoie vers Doctolib pour la prise de rendez-vous, pas vers le site. Le site, pourtant plus riche en contenu (pages de services détaillées, équipe, équipements), est rétrogradé au rang de source secondaire.\n\n## Structurer les données locales pour que l'IA vous choisisse comme source primaire\n\nLa fondation technique, c'est le schema markup. Mais pas le schema minimal que la plupart des sites implémentent. Pour devenir source de vérité IA, il faut un schema exhaustif, cohérent avec GBP, et maintenu programmatiquement.\n\n### Schema LocalBusiness complet avec spécialisation\n\nVoici un exemple de schema JSON-LD pour une des cliniques vétérinaires, allant bien au-delà du minimum :\n\n```html\n\u003Cscript type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"VeterinaryCare\",\n  \"@id\": \"https://www.vetcliniques-idf.fr/cliniques/montreuil-pasteur/#organization\",\n  \"name\": \"Clinique Vétérinaire Pasteur - Montreuil\",\n  \"image\": \"https://www.vetcliniques-idf.fr/images/cliniques/montreuil-pasteur-facade.webp\",\n  \"url\": \"https://www.vetcliniques-idf.fr/cliniques/montreuil-pasteur/\",\n  \"telephone\": \"+33148701234\",\n  \"email\": \"montreuil@vetcliniques-idf.fr\",\n  \"address\": {\n    \"@type\": \"PostalAddress\",\n    \"streetAddress\": \"47 rue Pasteur\",\n    \"addressLocality\": \"Montreuil\",\n    \"postalCode\": \"93100\",\n    \"addressRegion\": \"Île-de-France\",\n    \"addressCountry\": \"FR\"\n  },\n  \"geo\": {\n    \"@type\": \"GeoCoordinates\",\n    \"latitude\": 48.8612,\n    \"longitude\": 2.4432\n  },\n  \"openingHoursSpecification\": [\n    {\n      \"@type\": \"OpeningHoursSpecification\",\n      \"dayOfWeek\": [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\"],\n      \"opens\": \"08:30\",\n      \"closes\": \"19:00\"\n    },\n    {\n      \"@type\": \"OpeningHoursSpecification\",\n      \"dayOfWeek\": \"Saturday\",\n      \"opens\": \"09:00\",\n      \"closes\": \"13:00\"\n    },\n    {\n      \"@type\": \"OpeningHoursSpecification\",\n      \"dayOfWeek\": \"Sunday\",\n      \"opens\": \"00:00\",\n      \"closes\": \"00:00\",\n      \"validFrom\": \"2026-01-01\",\n      \"validThrough\": \"2026-12-31\",\n      \"description\": \"Fermé le dimanche sauf urgences sur appel\"\n    }\n  ],\n  \"specialOpeningHoursSpecification\": [\n    {\n      \"@type\": \"OpeningHoursSpecification\",\n      \"validFrom\": \"2026-05-01\",\n      \"validThrough\": \"2026-05-01\",\n      \"opens\": \"00:00\",\n      \"closes\": \"00:00\",\n      \"description\": \"Fermé - Fête du travail\"\n    }\n  ],\n  \"priceRange\": \"€€\",\n  \"paymentAccepted\": [\"Cash\", \"Credit Card\", \"Chèque\"],\n  \"areaServed\": {\n    \"@type\": \"GeoCircle\",\n    \"geoMidpoint\": {\n      \"@type\": \"GeoCoordinates\",\n      \"latitude\": 48.8612,\n      \"longitude\": 2.4432\n    },\n    \"geoRadius\": \"10000\"\n  },\n  \"hasOfferCatalog\": {\n    \"@type\": \"OfferCatalog\",\n    \"name\": \"Services vétérinaires\",\n    \"itemListElement\": [\n      {\n        \"@type\": \"Offer\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Consultation générale\",\n          \"description\": \"Examen clinique complet, vaccination, identification\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Chirurgie\",\n          \"description\": \"Stérilisation, chirurgie orthopédique, chirurgie des tissus mous\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Urgences vétérinaires\",\n          \"description\": \"Service d'urgence disponible en semaine sur les horaires d'ouverture\"\n        }\n      }\n    ]\n  },\n  \"aggregateRating\": {\n    \"@type\": \"AggregateRating\",\n    \"ratingValue\": \"4.7\",\n    \"reviewCount\": \"312\"\n  },\n  \"sameAs\": [\n    \"https://www.google.com/maps/place/?q=place_id:ChIJ_EXAMPLE_ID\",\n    \"https://www.facebook.com/vetcliniquepasteurmontreuil\",\n    \"https://www.doctolib.fr/veterinaire/montreuil/clinique-pasteur\"\n  ]\n}\n\u003C/script>\n```\n\nPlusieurs éléments importants dans ce markup :\n\n- **`sameAs`** établit explicitement le lien entre votre site et vos fiches tierces. C'est un signal de cohérence que les systèmes IA utilisent pour la triangulation.\n- **`specialOpeningHoursSpecification`** couvre les jours fériés — un point de divergence fréquent entre site et GBP.\n- **`hasOfferCatalog`** détaille les services. Les AI Overviews locales commencent à afficher les services spécifiques en réponse aux requêtes intentionnelles (\"vétérinaire urgence os cassé montreuil\").\n- **`areaServed`** avec un `GeoCircle` aide les systèmes IA à déterminer la pertinence géographique au-delà de la simple adresse.\n\n### Automatiser la synchronisation GBP ↔ Site\n\nLe vrai défi n'est pas d'écrire le schema une fois — c'est de le maintenir synchronisé. Pour un réseau multi-établissements, la solution passe par une source de données unique qui alimente à la fois le site et GBP.\n\nVoici un script TypeScript qui utilise l'API Google Business Profile pour extraire les données et générer le JSON-LD côté serveur :\n\n```typescript\n// sync-local-schema.ts\nimport { google } from 'googleapis';\n\ninterface ClinicData {\n  slug: string;\n  name: string;\n  address: string;\n  city: string;\n  postalCode: string;\n  phone: string;\n  lat: number;\n  lng: number;\n  regularHours: OpeningHours[];\n  specialHours: SpecialHours[];\n}\n\ninterface OpeningHours {\n  day: string;\n  open: string;\n  close: string;\n}\n\ninterface SpecialHours {\n  date: string;\n  open: string | null;\n  close: string | null;\n  description: string;\n}\n\nasync function fetchGBPData(accountId: string, locationId: string): Promise\u003CClinicData> {\n  const auth = new google.auth.GoogleAuth({\n    keyFile: './service-account.json',\n    scopes: ['https://www.googleapis.com/auth/business.manage'],\n  });\n\n  const mybusiness = google.mybusinessbusinessinformation({ version: 'v1', auth });\n\n  const location = await mybusiness.locations.get({\n    name: `locations/${locationId}`,\n    readMask: 'name,title,phoneNumbers,storefrontAddress,latlng,regularHours,specialHours',\n  });\n\n  const data = location.data;\n  const address = data.storefrontAddress;\n\n  return {\n    slug: generateSlug(address.locality, data.title),\n    name: data.title,\n    address: address.addressLines.join(', '),\n    city: address.locality,\n    postalCode: address.postalCode,\n    phone: data.phoneNumbers.primaryPhone,\n    lat: data.latlng.latitude,\n    lng: data.latlng.longitude,\n    regularHours: mapRegularHours(data.regularHours),\n    specialHours: mapSpecialHours(data.specialHours),\n  };\n}\n\nfunction generateJsonLd(clinic: ClinicData): string {\n  const schema = {\n    '@context': 'https://schema.org',\n    '@type': 'VeterinaryCare',\n    name: clinic.name,\n    telephone: clinic.phone,\n    address: {\n      '@type': 'PostalAddress',\n      streetAddress: clinic.address,\n      addressLocality: clinic.city,\n      postalCode: clinic.postalCode,\n      addressCountry: 'FR',\n    },\n    geo: {\n      '@type': 'GeoCoordinates',\n      latitude: clinic.lat,\n      longitude: clinic.lng,\n    },\n    openingHoursSpecification: clinic.regularHours.map((h) => ({\n      '@type': 'OpeningHoursSpecification',\n      dayOfWeek: h.day,\n      opens: h.open,\n      closes: h.close,\n    })),\n    specialOpeningHoursSpecification: clinic.specialHours.map((h) => ({\n      '@type': 'OpeningHoursSpecification',\n      validFrom: h.date,\n      validThrough: h.date,\n      opens: h.open ?? '00:00',\n      closes: h.close ?? '00:00',\n      description: h.description,\n    })),\n  };\n\n  return JSON.stringify(schema, null, 2);\n}\n\n// Exécution : synchronisation des 23 cliniques\nasync function syncAll() {\n  const locations = await loadLocationIds(); // depuis votre CMS ou config\n  for (const loc of locations) {\n    const data = await fetchGBPData(loc.accountId, loc.locationId);\n    const jsonLd = generateJsonLd(data);\n    await writeToPage(data.slug, jsonLd); // injection dans le template SSR\n    console.log(`✓ ${data.name} — schema synchronisé`);\n  }\n}\n\nsyncAll().catch(console.error);\n```\n\nCe script tourne en CI/CD (cron quotidien ou webhook sur mise à jour GBP). Il garantit que le schema du site reflète toujours les données GBP. C'est le seul moyen fiable d'assurer la cohérence pour un réseau de plus de 5 établissements.\n\n## Le contenu local que l'IA ne peut pas synthétiser elle-même\n\nL'IA excelle à agréger des faits (horaires, adresse, note). Elle est beaucoup moins performante pour synthétiser du contenu expérientiel et spécifique. C'est votre avantage compétitif.\n\n### Pages de services locaux avec profondeur\n\nUne page \"Chirurgie vétérinaire\" générique est facilement remplaçable par une réponse IA. Une page \"Chirurgie orthopédique pour grands chiens — Clinique Pasteur Montreuil\" avec des détails sur l'équipement spécifique (scanner, salle de réveil dédiée), les tarifs indicatifs, et le processus pré-opératoire ne l'est pas.\n\nLa clé : chaque page locale doit contenir au moins un élément d'information qu'aucune autre source en ligne ne possède. L'adresse et les horaires ne suffisent pas — c'est déjà sur GBP. Les éléments différenciants :\n\n- **Processus spécifiques à l'établissement** : \"Comment se déroule une première consultation à la clinique Pasteur\" avec un parcours client détaillé.\n- **Contenu visuel authentique** : photos réelles de l'établissement, pas des photos stock. Les systèmes de vision des LLMs multimodaux commencent à analyser ces images.\n- **FAQ locales véritables** : pas des FAQ génériques, mais des questions réellement posées par les clients de cet établissement spécifique.\n\n### Signaux de fraîcheur locale\n\nUn aspect sous-estimé : les LLMs et les systèmes d'AI Overview intègrent des signaux de fraîcheur. Un site dont la dernière modification visible date de 2024 sera défavorisé par rapport à un site mis à jour régulièrement.\n\nPour les sites locaux, cela signifie :\n\n- Mettre à jour le `dateModified` dans le schema à chaque modification réelle.\n- Publier des actualités locales (arrivée d'un nouveau praticien, acquisition d'un équipement).\n- Maintenir un blog local avec du contenu saisonnier pertinent (\"Précautions pour les chiens en période de canicule — conseils de nos vétérinaires à Montreuil\").\n\nGoogle Search Console reste l'outil de diagnostic principal pour vérifier que ces pages sont correctement indexées. Surveillez le rapport \"Pages\" pour détecter les pages locales exclues ou non indexées, et croisez avec le [suivi des intent gaps dans GSC](/blog/how-to-measure-intent-gaps-using-google-search-console-data) pour identifier les requêtes locales où vous apparaissez sans convertir.\n\n## SSR, performance et crawlabilité : les prérequis techniques du site source de vérité\n\nUn site local rendu côté client en JavaScript pur est un problème majeur dans le contexte du search IA. Googlebot gère le JavaScript (avec des limites de [rendering budget](/blog/rendering-budget-de-google-combien-de-javascript-est-trop)), mais les bots IA tiers — GPTBot, Claude, Perplexity — [ne le font généralement pas](/blog/llms-et-crawl-comment-les-bots-ia-crawlent-votre-site).\n\nSi votre contenu local (horaires, services, schema JSON-LD) est injecté côté client via un framework SPA, les agents IA qui crawlent votre site ne verront qu'une coquille vide. Ils se rabattront sur GBP, Yelp, ou Reddit pour leurs données.\n\n### Configuration SSR pour les pages locales\n\nPour un site Next.js multi-établissements, chaque page locale doit être rendue côté serveur avec les données fraîches :\n\n```typescript\n// app/cliniques/[slug]/page.tsx (Next.js App Router)\nimport { getClinicBySlug } from '@/lib/clinics';\nimport { generateClinicJsonLd } from '@/lib/schema';\nimport { notFound } from 'next/navigation';\n\nexport async function generateStaticParams() {\n  const clinics = await getAllClinics();\n  return clinics.map((clinic) => ({ slug: clinic.slug }));\n}\n\nexport async function generateMetadata({ params }: { params: { slug: string } }) {\n  const clinic = await getClinicBySlug(params.slug);\n  if (!clinic) return {};\n\n  return {\n    title: `${clinic.name} — Vétérinaire ${clinic.city} | VetCliniques IDF`,\n    description: `${clinic.name} à ${clinic.city}. ${clinic.services.slice(0, 3).join(', ')}. Ouvert du lundi au samedi. Rendez-vous en ligne.`,\n    alternates: {\n      canonical: `https://www.vetcliniques-idf.fr/cliniques/${params.slug}/`,\n    },\n  };\n}\n\nexport const revalidate = 3600; // ISR : revalidation toutes les heures\n\nexport default async function ClinicPage({ params }: { params: { slug: string } }) {\n  const clinic = await getClinicBySlug(params.slug);\n  if (!clinic) notFound();\n\n  const jsonLd = generateClinicJsonLd(clinic);\n\n  return (\n    \u003C>\n      \u003Cscript\n        type=\"application/ld+json\"\n        dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}\n      />\n      \u003Carticle>\n        \u003Ch1>{clinic.name}\u003C/h1>\n        \u003Csection aria-label=\"Informations pratiques\">\n          \u003Caddress>\n            {clinic.address}, {clinic.postalCode} {clinic.city}\n          \u003C/address>\n          \u003Ca href={`tel:${clinic.phone}`}>{clinic.formattedPhone}\u003C/a>\n          {/* Horaires rendus en HTML sémantique, pas injectés en JS */}\n          \u003Ctable>\n            \u003Ccaption>Horaires d'ouverture\u003C/caption>\n            \u003Ctbody>\n              {clinic.hours.map((h) => (\n                \u003Ctr key={h.day}>\n                  \u003Ctd>{h.day}\u003C/td>\n                  \u003Ctd>\n                    \u003Ctime>{h.open}\u003C/time> — \u003Ctime>{h.close}\u003C/time>\n                  \u003C/td>\n                \u003C/tr>\n              ))}\n            \u003C/tbody>\n          \u003C/table>\n        \u003C/section>\n        {/* Contenu riche : services, équipe, FAQ locale */}\n      \u003C/article>\n    \u003C/>\n  );\n}\n```\n\nPoints critiques dans cette implémentation :\n\n- **`revalidate = 3600`** (ISR) assure que les données sont fraîches sans rebuild complet. Si la synchronisation GBP met à jour la base toutes les 4 heures, réglez `revalidate` en conséquence.\n- **Les horaires sont dans le HTML**, pas dans un composant client-only. Les bots IA non-JS les voient directement.\n- **Le schema JSON-LD est injecté dans le HTML initial**, pas ajouté par un script côté client.\n\nSi vous migrez d'un framework SPA vers un setup SSR, référez-vous au [guide de migration Next.js / Nuxt](/blog/changer-de-framework-next-js-vers-nuxt-ou-l-inverse-sans-perte-seo) pour éviter les régressions classiques.\n\n## Gérer les canonicals et la déduplication dans un contexte multi-source\n\nUn piège fréquent pour les sites multi-établissements : le contenu dupliqué entre pages locales. Quand 23 cliniques proposent les mêmes services avec des descriptions proches, Google peut décider de ne pas indexer certaines pages, ou pire, de les consolider vers une seule URL canonique — [un comportement documenté par Google lui-même](/blog/google-lists-9-scenarios-that-explain-how-it-picks-canonical-urls-via-sejournal-martinibuster).\n\n### La règle des 40% de contenu unique\n\nChaque page locale doit contenir au minimum 40% de contenu textuel unique par rapport aux autres pages du même type. En pratique, cela signifie :\n\n- La description de la clinique, de l'équipe locale, et de l'environnement immédiat sont uniques.\n- Les descriptions de services partagent un tronc commun, mais intègrent des spécificités locales (équipement disponible, spécialités du praticien).\n- La FAQ est locale : les questions posées à une clinique de Montreuil ne sont pas les mêmes qu'à une clinique de Versailles.\n\nValidez cette unicité avec Screaming Frog : crawl complet du site, export des pages `/cliniques/*/`, et analyse du near-duplicate content via l'onglet \"Content\" > \"Near Duplicates\" avec un seuil de similarité à 60%.\n\n### Impact mesurable\n\nPour le réseau de cliniques vétérinaires, après correction des incohérences schema + passage en SSR + enrichissement du contenu local unique :\n\n- **Avant** : 14 pages sur 23 indexées (9 exclues pour \"Duplicate without user-selected canonical\" dans GSC).\n- **Après (8 semaines)** : 22 pages sur 23 indexées. La 23e (une clinique ouverte récemment avec très peu de contenu) reste en \"Crawled — currently not indexed\".\n- **Trafic organique local** : +34% sur les requêtes \"vétérinaire + [ville]\" (comparaison mois-sur-mois dans GSC, segment par page locale).\n- **Présence dans les AI Overviews** : le site apparaît comme source citée pour 7 des 23 villes sur les requêtes testées manuellement dans Gemini et ChatGPT. Contre 0 avant les modifications.\n\n## Configurer votre serveur pour les bots IA locaux\n\nLes bots IA ne se comportent pas comme Googlebot. Leur gestion dans le `robots.txt` et au niveau du serveur mérite une attention spécifique, surtout pour les pages locales qui sont votre actif le plus stratégique.\n\n### robots.txt différencié\n\nVous voulez que GPTBot, ClaudeBot, et PerplexityBot accèdent à vos pages locales, mais pas nécessairement à votre espace admin, vos pages de checkout, ou vos assets JavaScript internes :\n\n```nginx\n# robots.txt - stratégie différenciée pour bots IA\nUser-agent: GPTBot\nAllow: /cliniques/\nAllow: /services/\nAllow: /a-propos/\nDisallow: /admin/\nDisallow: /checkout/\nDisallow: /api/\nCrawl-delay: 2\n\nUser-agent: ClaudeBot\nAllow: /cliniques/\nAllow: /services/\nDisallow: /admin/\nDisallow: /checkout/\nDisallow: /api/\nCrawl-delay: 2\n\nUser-agent: PerplexityBot\nAllow: /cliniques/\nAllow: /services/\nDisallow: /admin/\nDisallow: /api/\nCrawl-delay: 3\n\nUser-agent: Googlebot\nAllow: /\n\nUser-agent: *\nDisallow: /admin/\nDisallow: /api/internal/\n\nSitemap: https://www.vetcliniques-idf.fr/sitemap-cliniques.xml\n```\n\nLe `Crawl-delay` est important : les bots IA peuvent être agressifs et consommer des ressources serveur significatives, [un phénomène documenté dans les données récentes de crawl IA](/blog/openai-meta-bytedance-lead-ai-bot-traffic-in-publishing-via-sejournal-mattgsouthern). Pour un site de 23 pages locales, ce n'est pas critique. Pour un annuaire avec 5 000 pages de localités, c'est un vrai sujet d'infrastructure.\n\nPensez aussi à créer un sitemap dédié pour les pages locales (`sitemap-cliniques.xml`) avec les `lastmod` à jour. Les bots IA qui respectent le protocole sitemap (GPTBot le fait) utiliseront cette information pour prioriser les pages fraîches.\n\n## La homepage comme hub de confiance locale\n\nUn aspect souvent négligé : [la homepage redevient stratégique](/blog/your-homepage-matters-again-for-seo-here-s-why) dans le contexte du search IA. Pour un site multi-établissements, la homepage est le point d'entrée que l'IA consulte en premier pour comprendre l'entité derrière le site.\n\nVotre homepage doit contenir :\n\n- Un schema `Organization` qui relie explicitement l'entité parente à tous les établissements (`subOrganization` ou `hasPOS`).\n- Une liste navigable de tous les établissements avec des liens vers les pages individuelles.\n- Des signaux de confiance visibles en HTML (pas uniquement en image) : certifications, labels, affiliations professionnelles.\n\nLes agents IA qui [crawlent votre site pour construire une compréhension de votre business](/blog/how-ai-agents-see-your-website-and-how-to-build-for-them-via-sejournal-slobodanmanic) commencent presque toujours par la homepage. Si elle ne contient pas de marqueurs structurels clairs, l'agent ne fera pas le lien entre vos établissements et votre marque.\n\n## Monitorer les divergences avant que l'IA ne les exploite\n\nLe plus gros risque dans ce modèle, c'est la dérive silencieuse. Un collaborateur met à jour les horaires sur GBP mais pas sur le site. Un développeur fait un deploy qui casse le schema JSON-LD d'une page locale. Une migration de CMS perd le `sameAs` qui reliait le site aux fiches tierces.\n\nCes régressions sont invisibles à l'œil nu. Elles ne génèrent pas d'erreur 500, pas d'alerte dans GSC. Mais elles dégradent votre statut de source de vérité aux yeux des systèmes IA.\n\nLa vérification manuelle ne passe pas à l'échelle. Pour un réseau de 23 établissements, c'est gérable trimestriellement. Pour un réseau de franchise avec 200+ points de vente, c'est impossible sans automatisation. Un outil de monitoring comme Seogard détecte automatiquement les régressions de structured data — un schema `LocalBusiness` qui disparaît après un déploiement, un `telephone` qui change sans raison, un `openingHoursSpecification` incohérent avec la version précédente.\n\nComplétez ce monitoring avec une vérification régulière du [Rich Results Test de Google](https://search.google.com/test/rich-results) pour chaque page locale, et une validation du schema via le [Schema Markup Validator](https://validator.schema.org/) pour détecter les erreurs syntaxiques avant qu'elles n'atteignent la production.\n\n## Le site comme point de décision, pas comme point d'information\n\nL'insight fondamental de ce basculement vers le search IA local : votre site ne sera bientôt plus la première source d'information pour l'utilisateur. L'IA lui aura déjà donné les horaires, l'adresse, la note. Quand l'utilisateur arrive sur votre site, il a déjà les faits. Il vient pour décider et agir.\n\nCela change radicalement ce que vos pages locales doivent prioriser :\n\n- **Les CTAs de conversion** (prise de rendez-vous, appel, itinéraire) doivent être immédiatement accessibles, pas après 3 scrolls.\n- **Les éléments de confiance différenciants** (photos de l'équipe, certifications, témoignages patients) doivent être au-dessus de la ligne de flottaison.\n- **Le contenu informatif de base** (horaires, adresse) reste nécessaire pour la cohérence schema, mais","https://seogard.io/blog/why-your-website-is-now-the-source-of-truth-in-local-ai-search","Actualités SEO","2026-04-16T18:02:48.363Z","2026-04-16","Les IA locales surfacent votre business, mais les décisions se prennent sur votre site. Structurez contenu, données et confiance pour rester la référence.","\u003Cp>Un restaurant lyonnais avec 4.7 étoiles sur Google, 800 avis, et un site dont la page \"Horaires\" affiche encore les créneaux COVID de 2021. ChatGPT donne les bons horaires — ceux de Google My Business. Mais le client qui clique sur le site pour réserver trouve une page contradictoire et abandonne. Le problème n'est pas l'IA. Le problème, c'est que le site web a cessé d'être la source de vérité.\u003C/p>\n\u003Ch2>Le basculement : quand l'IA locale ne fait plus confiance à votre site\u003C/h2>\n\u003Cp>Pendant une décennie, la chaîne d'information locale était simple : fiche Google Business Profile (GBP) → pack local → clic vers le site. Le site servait de point d'atterrissage et de conversion. Les incohérences entre GBP et le site existaient, mais les utilisateurs naviguaient assez pour les résoudre eux-mêmes.\u003C/p>\n\u003Cp>Avec les AI Overviews, Google Gemini, ChatGPT avec browsing, et les agents IA de type \u003Ca href=\"/blog/google-s-task-based-agentic-search-is-disrupting-seo-today-not-tomorrow-via-sejournal-martinibuster\">agentic search\u003C/a>, ce modèle est cassé. L'IA synthétise des réponses à partir de multiples sources — GBP, Yelp, TripAdvisor, Reddit, le site lui-même — et choisit la version qu'elle juge la plus fiable. Si votre site contredit votre fiche Google ou affiche des données structurées incohérentes, l'IA va privilégier une autre source. Vous perdez le contrôle du récit.\u003C/p>\n\u003Ch3>Le problème de la triangulation\u003C/h3>\n\u003Cp>Les LLMs qui alimentent le search local procèdent par triangulation : ils croisent les informations provenant de 3+ sources pour établir un fait. Nom de l'entreprise, adresse, téléphone (NAP), horaires, services proposés, fourchette de prix — tout est recoupé.\u003C/p>\n\u003Cp>Quand les données concordent entre GBP, le site, et les annuaires tiers, l'IA gagne en confiance et attribue le contenu à la source la plus riche — souvent le site. Quand il y a divergence, l'IA peut :\u003C/p>\n\u003Col>\n\u003Cli>Choisir la source avec le plus de signaux de fraîcheur (souvent GBP, mis à jour plus fréquemment).\u003C/li>\n\u003Cli>Ignorer le site et citer un forum ou un avis tiers.\u003C/li>\n\u003Cli>Afficher un résultat ambigu avec des qualifications (\"selon certaines sources…\").\u003C/li>\n\u003C/ol>\n\u003Cp>Le scénario 2 est exactement ce que décrit la tendance documentée où \u003Ca href=\"/blog/your-owned-content-is-losing-to-a-stranger-s-reddit-comment-via-sejournal-duaneforrester\">le contenu propriétaire perd face à un commentaire Reddit\u003C/a>. Ce phénomène, déjà visible en SEO classique, est amplifié dans le contexte du search IA local.\u003C/p>\n\u003Ch3>Le cas concret : un réseau de cliniques vétérinaires (23 établissements)\u003C/h3>\n\u003Cp>Prenons un réseau de 23 cliniques vétérinaires réparties en Île-de-France. Chaque clinique a sa page dédiée sur le site principal (architecture \u003Ccode>/cliniques/ville-nom/\u003C/code>), sa fiche GBP, et des fiches sur PagesJaunes et Doctolib.\u003C/p>\n\u003Cp>Après un audit, voici ce qu'on découvre :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>9 cliniques sur 23\u003C/strong> ont des horaires différents entre le site et GBP (souvent parce que le site n'a pas été mis à jour après un changement de planning).\u003C/li>\n\u003Cli>\u003Cstrong>4 cliniques\u003C/strong> affichent un numéro de téléphone obsolète sur le site (migration vers un nouveau standard téléphonique 6 mois plus tôt).\u003C/li>\n\u003Cli>\u003Cstrong>Le schema LocalBusiness\u003C/strong> est présent mais utilise \u003Ccode>@type: VeterinaryCare\u003C/code> sur seulement 11 pages — les 12 autres utilisent le type générique \u003Ccode>LocalBusiness\u003C/code>.\u003C/li>\n\u003Cli>Aucune page n'implémente \u003Ccode>openingHoursSpecification\u003C/code> avec les exceptions de jours fériés.\u003C/li>\n\u003C/ul>\n\u003Cp>Résultat dans les AI Overviews : pour les requêtes locales type \"vétérinaire urgence [ville]\", l'IA cite les horaires de GBP et renvoie vers Doctolib pour la prise de rendez-vous, pas vers le site. Le site, pourtant plus riche en contenu (pages de services détaillées, équipe, équipements), est rétrogradé au rang de source secondaire.\u003C/p>\n\u003Ch2>Structurer les données locales pour que l'IA vous choisisse comme source primaire\u003C/h2>\n\u003Cp>La fondation technique, c'est le schema markup. Mais pas le schema minimal que la plupart des sites implémentent. Pour devenir source de vérité IA, il faut un schema exhaustif, cohérent avec GBP, et maintenu programmatiquement.\u003C/p>\n\u003Ch3>Schema LocalBusiness complet avec spécialisation\u003C/h3>\n\u003Cp>Voici un exemple de schema JSON-LD pour une des cliniques vétérinaires, allant bien au-delà du minimum :\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\">script\u003C/span>\u003Cspan style=\"color:#B392F0\"> type\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"application/ld+json\"\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\">  \"@context\": \"https://schema.org\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@type\": \"VeterinaryCare\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@id\": \"https://www.vetcliniques-idf.fr/cliniques/montreuil-pasteur/#organization\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"name\": \"Clinique Vétérinaire Pasteur - Montreuil\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"image\": \"https://www.vetcliniques-idf.fr/images/cliniques/montreuil-pasteur-facade.webp\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"url\": \"https://www.vetcliniques-idf.fr/cliniques/montreuil-pasteur/\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"telephone\": \"+33148701234\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"email\": \"montreuil@vetcliniques-idf.fr\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"address\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"PostalAddress\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"streetAddress\": \"47 rue Pasteur\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"addressLocality\": \"Montreuil\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"postalCode\": \"93100\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"addressRegion\": \"Île-de-France\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"addressCountry\": \"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\">  \"geo\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"GeoCoordinates\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"latitude\": 48.8612,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"longitude\": 2.4432\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"openingHoursSpecification\": [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@type\": \"OpeningHoursSpecification\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"dayOfWeek\": [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\"],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"opens\": \"08:30\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"closes\": \"19: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:#E1E4E8\">      \"@type\": \"OpeningHoursSpecification\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"dayOfWeek\": \"Saturday\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"opens\": \"09:00\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"closes\": \"13: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:#E1E4E8\">      \"@type\": \"OpeningHoursSpecification\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"dayOfWeek\": \"Sunday\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"opens\": \"00:00\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"closes\": \"00:00\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"validFrom\": \"2026-01-01\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"validThrough\": \"2026-12-31\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"description\": \"Fermé le dimanche sauf urgences sur appel\"\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\">  \"specialOpeningHoursSpecification\": [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@type\": \"OpeningHoursSpecification\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"validFrom\": \"2026-05-01\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"validThrough\": \"2026-05-01\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"opens\": \"00:00\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"closes\": \"00:00\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"description\": \"Fermé - Fête du travail\"\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\">  \"priceRange\": \"€€\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"paymentAccepted\": [\"Cash\", \"Credit Card\", \"Chèque\"],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"areaServed\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"GeoCircle\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"geoMidpoint\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@type\": \"GeoCoordinates\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"latitude\": 48.8612,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"longitude\": 2.4432\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"geoRadius\": \"10000\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"hasOfferCatalog\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"OfferCatalog\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"name\": \"Services vétérinaires\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"itemListElement\": [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \"@type\": \"Offer\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \"itemOffered\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          \"@type\": \"Service\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          \"name\": \"Consultation générale\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          \"description\": \"Examen clinique complet, vaccination, identification\"\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\">\u003Cspan style=\"color:#E1E4E8\">        \"@type\": \"Offer\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \"itemOffered\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          \"@type\": \"Service\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          \"name\": \"Chirurgie\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          \"description\": \"Stérilisation, chirurgie orthopédique, chirurgie des tissus mous\"\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\">\u003Cspan style=\"color:#E1E4E8\">        \"@type\": \"Offer\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \"itemOffered\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          \"@type\": \"Service\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          \"name\": \"Urgences vétérinaires\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          \"description\": \"Service d'urgence disponible en semaine sur les horaires d'ouverture\"\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\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"aggregateRating\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"AggregateRating\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"ratingValue\": \"4.7\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"reviewCount\": \"312\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"sameAs\": [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"https://www.google.com/maps/place/?q=place_id:ChIJ_EXAMPLE_ID\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"https://www.facebook.com/vetcliniquepasteurmontreuil\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"https://www.doctolib.fr/veterinaire/montreuil/clinique-pasteur\"\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\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Plusieurs éléments importants dans ce markup :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>sameAs\u003C/code>\u003C/strong> établit explicitement le lien entre votre site et vos fiches tierces. C'est un signal de cohérence que les systèmes IA utilisent pour la triangulation.\u003C/li>\n\u003Cli>\u003Cstrong>\u003Ccode>specialOpeningHoursSpecification\u003C/code>\u003C/strong> couvre les jours fériés — un point de divergence fréquent entre site et GBP.\u003C/li>\n\u003Cli>\u003Cstrong>\u003Ccode>hasOfferCatalog\u003C/code>\u003C/strong> détaille les services. Les AI Overviews locales commencent à afficher les services spécifiques en réponse aux requêtes intentionnelles (\"vétérinaire urgence os cassé montreuil\").\u003C/li>\n\u003Cli>\u003Cstrong>\u003Ccode>areaServed\u003C/code>\u003C/strong> avec un \u003Ccode>GeoCircle\u003C/code> aide les systèmes IA à déterminer la pertinence géographique au-delà de la simple adresse.\u003C/li>\n\u003C/ul>\n\u003Ch3>Automatiser la synchronisation GBP ↔ Site\u003C/h3>\n\u003Cp>Le vrai défi n'est pas d'écrire le schema une fois — c'est de le maintenir synchronisé. Pour un réseau multi-établissements, la solution passe par une source de données unique qui alimente à la fois le site et GBP.\u003C/p>\n\u003Cp>Voici un script TypeScript qui utilise l'API Google Business Profile pour extraire les données et générer le JSON-LD côté serveur :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// sync-local-schema.ts\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { google } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'googleapis'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\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\"> ClinicData\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  slug\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:#FFAB70\">  name\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:#FFAB70\">  address\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:#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:#FFAB70\">  postalCode\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:#FFAB70\">  phone\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:#FFAB70\">  lat\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> number\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  lng\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> number\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  regularHours\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> OpeningHours\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  specialHours\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> SpecialHours\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:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> OpeningHours\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  day\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:#FFAB70\">  open\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:#FFAB70\">  close\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:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> SpecialHours\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  date\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:#FFAB70\">  open\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> null\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  close\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> null\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  description\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:#F97583\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> fetchGBPData\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">accountId\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">locationId\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\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\">ClinicData\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\"> auth\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> google.auth.\u003C/span>\u003Cspan style=\"color:#B392F0\">GoogleAuth\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    keyFile: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'./service-account.json'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    scopes: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'https://www.googleapis.com/auth/business.manage'\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:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> mybusiness\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> google.\u003C/span>\u003Cspan style=\"color:#B392F0\">mybusinessbusinessinformation\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({ version: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'v1'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, auth });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\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:#E1E4E8\"> mybusiness.locations.\u003C/span>\u003Cspan style=\"color:#B392F0\">get\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    name: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`locations/${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">locationId\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    readMask: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'name,title,phoneNumbers,storefrontAddress,latlng,regularHours,specialHours'\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:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> data\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> location.data;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> address\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> data.storefrontAddress;\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:#E1E4E8\">    slug: \u003C/span>\u003Cspan style=\"color:#B392F0\">generateSlug\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(address.locality, data.title),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    name: data.title,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    address: address.addressLines.\u003C/span>\u003Cspan style=\"color:#B392F0\">join\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">', '\u003C/span>\u003Cspan style=\"color:#E1E4E8\">),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    city: address.locality,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    postalCode: address.postalCode,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    phone: data.phoneNumbers.primaryPhone,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    lat: data.latlng.latitude,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    lng: data.latlng.longitude,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    regularHours: \u003C/span>\u003Cspan style=\"color:#B392F0\">mapRegularHours\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(data.regularHours),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    specialHours: \u003C/span>\u003Cspan style=\"color:#B392F0\">mapSpecialHours\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(data.specialHours),\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:#F97583\">function\u003C/span>\u003Cspan style=\"color:#B392F0\"> generateJsonLd\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">clinic\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> ClinicData\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\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:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> schema\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    '@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:#9ECBFF\">    '@type'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'VeterinaryCare'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    name: clinic.name,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    telephone: clinic.phone,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    address: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      '@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:#E1E4E8\">      streetAddress: clinic.address,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      addressLocality: clinic.city,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      postalCode: clinic.postalCode,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      addressCountry: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'FR'\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\">    geo: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      '@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:#E1E4E8\">      latitude: clinic.lat,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      longitude: clinic.lng,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    openingHoursSpecification: clinic.regularHours.\u003C/span>\u003Cspan style=\"color:#B392F0\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">h\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:#9ECBFF\">      '@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:#E1E4E8\">      dayOfWeek: h.day,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      opens: h.open,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      closes: h.close,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    })),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    specialOpeningHoursSpecification: clinic.specialHours.\u003C/span>\u003Cspan style=\"color:#B392F0\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">h\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:#9ECBFF\">      '@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:#E1E4E8\">      validFrom: h.date,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      validThrough: h.date,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      opens: h.open \u003C/span>\u003Cspan style=\"color:#F97583\">??\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '00:00'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      closes: h.close \u003C/span>\u003Cspan style=\"color:#F97583\">??\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '00:00'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      description: h.description,\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:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#79B8FF\"> JSON\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#B392F0\">stringify\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(schema, \u003C/span>\u003Cspan style=\"color:#79B8FF\">null\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">2\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\">// Exécution : synchronisation des 23 cliniques\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> syncAll\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\"> loadLocationIds\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(); \u003C/span>\u003Cspan style=\"color:#6A737D\">// depuis votre CMS ou config\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> loc\u003C/span>\u003Cspan style=\"color:#F97583\"> of\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> locations) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> data\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> fetchGBPData\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(loc.accountId, loc.locationId);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> jsonLd\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#B392F0\"> generateJsonLd\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(data);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    await\u003C/span>\u003Cspan style=\"color:#B392F0\"> writeToPage\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(data.slug, jsonLd); \u003C/span>\u003Cspan style=\"color:#6A737D\">// injection dans le template SSR\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    console.\u003C/span>\u003Cspan style=\"color:#B392F0\">log\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`✓ ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">data\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">name\u003C/span>\u003Cspan style=\"color:#9ECBFF\">} — schema synchronisé`\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\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">syncAll\u003C/span>\u003Cspan style=\"color:#E1E4E8\">().\u003C/span>\u003Cspan style=\"color:#B392F0\">catch\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(console.error);\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce script tourne en CI/CD (cron quotidien ou webhook sur mise à jour GBP). Il garantit que le schema du site reflète toujours les données GBP. C'est le seul moyen fiable d'assurer la cohérence pour un réseau de plus de 5 établissements.\u003C/p>\n\u003Ch2>Le contenu local que l'IA ne peut pas synthétiser elle-même\u003C/h2>\n\u003Cp>L'IA excelle à agréger des faits (horaires, adresse, note). Elle est beaucoup moins performante pour synthétiser du contenu expérientiel et spécifique. C'est votre avantage compétitif.\u003C/p>\n\u003Ch3>Pages de services locaux avec profondeur\u003C/h3>\n\u003Cp>Une page \"Chirurgie vétérinaire\" générique est facilement remplaçable par une réponse IA. Une page \"Chirurgie orthopédique pour grands chiens — Clinique Pasteur Montreuil\" avec des détails sur l'équipement spécifique (scanner, salle de réveil dédiée), les tarifs indicatifs, et le processus pré-opératoire ne l'est pas.\u003C/p>\n\u003Cp>La clé : chaque page locale doit contenir au moins un élément d'information qu'aucune autre source en ligne ne possède. L'adresse et les horaires ne suffisent pas — c'est déjà sur GBP. Les éléments différenciants :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Processus spécifiques à l'établissement\u003C/strong> : \"Comment se déroule une première consultation à la clinique Pasteur\" avec un parcours client détaillé.\u003C/li>\n\u003Cli>\u003Cstrong>Contenu visuel authentique\u003C/strong> : photos réelles de l'établissement, pas des photos stock. Les systèmes de vision des LLMs multimodaux commencent à analyser ces images.\u003C/li>\n\u003Cli>\u003Cstrong>FAQ locales véritables\u003C/strong> : pas des FAQ génériques, mais des questions réellement posées par les clients de cet établissement spécifique.\u003C/li>\n\u003C/ul>\n\u003Ch3>Signaux de fraîcheur locale\u003C/h3>\n\u003Cp>Un aspect sous-estimé : les LLMs et les systèmes d'AI Overview intègrent des signaux de fraîcheur. Un site dont la dernière modification visible date de 2024 sera défavorisé par rapport à un site mis à jour régulièrement.\u003C/p>\n\u003Cp>Pour les sites locaux, cela signifie :\u003C/p>\n\u003Cul>\n\u003Cli>Mettre à jour le \u003Ccode>dateModified\u003C/code> dans le schema à chaque modification réelle.\u003C/li>\n\u003Cli>Publier des actualités locales (arrivée d'un nouveau praticien, acquisition d'un équipement).\u003C/li>\n\u003Cli>Maintenir un blog local avec du contenu saisonnier pertinent (\"Précautions pour les chiens en période de canicule — conseils de nos vétérinaires à Montreuil\").\u003C/li>\n\u003C/ul>\n\u003Cp>Google Search Console reste l'outil de diagnostic principal pour vérifier que ces pages sont correctement indexées. Surveillez le rapport \"Pages\" pour détecter les pages locales exclues ou non indexées, et croisez avec le \u003Ca href=\"/blog/how-to-measure-intent-gaps-using-google-search-console-data\">suivi des intent gaps dans GSC\u003C/a> pour identifier les requêtes locales où vous apparaissez sans convertir.\u003C/p>\n\u003Ch2>SSR, performance et crawlabilité : les prérequis techniques du site source de vérité\u003C/h2>\n\u003Cp>Un site local rendu côté client en JavaScript pur est un problème majeur dans le contexte du search IA. Googlebot gère le JavaScript (avec des limites de \u003Ca href=\"/blog/rendering-budget-de-google-combien-de-javascript-est-trop\">rendering budget\u003C/a>), mais les bots IA tiers — GPTBot, Claude, Perplexity — \u003Ca href=\"/blog/llms-et-crawl-comment-les-bots-ia-crawlent-votre-site\">ne le font généralement pas\u003C/a>.\u003C/p>\n\u003Cp>Si votre contenu local (horaires, services, schema JSON-LD) est injecté côté client via un framework SPA, les agents IA qui crawlent votre site ne verront qu'une coquille vide. Ils se rabattront sur GBP, Yelp, ou Reddit pour leurs données.\u003C/p>\n\u003Ch3>Configuration SSR pour les pages locales\u003C/h3>\n\u003Cp>Pour un site Next.js multi-établissements, chaque page locale doit être rendue côté serveur avec les données fraîches :\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/cliniques/[slug]/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\"> { getClinicBySlug } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '@/lib/clinics'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { generateClinicJsonLd } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '@/lib/schema'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { notFound } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'next/navigation'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\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\"> clinics\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> getAllClinics\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\"> clinics.\u003C/span>\u003Cspan style=\"color:#B392F0\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">clinic\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ({ slug: clinic.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:#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:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"color:#FFAB70\">params\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"color:#FFAB70\">slug\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:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> clinic\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> getClinicBySlug\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(params.slug);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">clinic) \u003C/span>\u003Cspan style=\"color:#F97583\">return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {};\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:#E1E4E8\">    title: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">clinic\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">name\u003C/span>\u003Cspan style=\"color:#9ECBFF\">} — Vétérinaire ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">clinic\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">city\u003C/span>\u003Cspan style=\"color:#9ECBFF\">} | VetCliniques IDF`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    description: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">clinic\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">name\u003C/span>\u003Cspan style=\"color:#9ECBFF\">} à ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">clinic\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\">clinic\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">services\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#B392F0\">slice\u003C/span>\u003Cspan style=\"color:#9ECBFF\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#9ECBFF\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">3\u003C/span>\u003Cspan style=\"color:#9ECBFF\">).\u003C/span>\u003Cspan style=\"color:#B392F0\">join\u003C/span>\u003Cspan style=\"color:#9ECBFF\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">', '\u003C/span>\u003Cspan style=\"color:#9ECBFF\">)\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}. Ouvert du lundi au samedi. Rendez-vous en ligne.`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\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://www.vetcliniques-idf.fr/cliniques/${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">params\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">slug\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:#F97583\">export\u003C/span>\u003Cspan style=\"color:#F97583\"> const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> revalidate\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 3600\u003C/span>\u003Cspan style=\"color:#E1E4E8\">; \u003C/span>\u003Cspan style=\"color:#6A737D\">// ISR : revalidation toutes les heures\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\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\"> ClinicPage\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:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"color:#FFAB70\">params\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"color:#FFAB70\">slug\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:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> clinic\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> getClinicBySlug\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(params.slug);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">clinic) \u003C/span>\u003Cspan style=\"color:#B392F0\">notFound\u003C/span>\u003Cspan style=\"color:#E1E4E8\">();\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> jsonLd\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#B392F0\"> generateClinicJsonLd\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(clinic);\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>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#FFAB70\">script\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        type\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"application/ld+json\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        dangerouslySetInnerHTML\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{{ \u003C/span>\u003Cspan style=\"color:#B392F0\">__html\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">JSON\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#B392F0\">stringify\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(jsonLd) }}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      />\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">article\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">h1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>{clinic.name}\u003C/span>\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\">section aria\u003C/span>\u003Cspan style=\"color:#F97583\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\">label\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Informations pratiques\"\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\">address\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            {\u003C/span>\u003Cspan style=\"color:#FFAB70\">clinic\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">address\u003C/span>\u003Cspan style=\"color:#E1E4E8\">}, {\u003C/span>\u003Cspan style=\"color:#FFAB70\">clinic\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">postalCode\u003C/span>\u003Cspan style=\"color:#E1E4E8\">} {\u003C/span>\u003Cspan style=\"color:#FFAB70\">clinic\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">city\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\">address\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\">a href\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`tel:${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">clinic\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">phone\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{clinic.formattedPhone}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">a\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          {\u003C/span>\u003Cspan style=\"color:#6A737D\">/* Horaires rendus en HTML sémantique, pas injectés en JS */\u003C/span>\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          &#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">table\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            &#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">caption\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>Horaires d\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'ouverture&#x3C;/caption\u003C/span>\u003Cspan style=\"color:#FDAEB7;font-style:italic\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            &#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">tbody\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">              {\u003C/span>\u003Cspan style=\"color:#FFAB70\">clinic\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">hours\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\">h\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\">tr key\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{h.day}\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\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>{h.day}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">td\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\">td\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">                    &#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">time\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>{h.open}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">time\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> — \u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">time\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{h.close}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">time\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\">td\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\">tr\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\">tbody\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\">table\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\">\u003Cspan style=\"color:#E1E4E8\">        {\u003C/span>\u003Cspan style=\"color:#6A737D\">/* Contenu riche : services, équipe, FAQ locale */\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\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    &#x3C;/>\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>Points critiques dans cette implémentation :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>revalidate = 3600\u003C/code>\u003C/strong> (ISR) assure que les données sont fraîches sans rebuild complet. Si la synchronisation GBP met à jour la base toutes les 4 heures, réglez \u003Ccode>revalidate\u003C/code> en conséquence.\u003C/li>\n\u003Cli>\u003Cstrong>Les horaires sont dans le HTML\u003C/strong>, pas dans un composant client-only. Les bots IA non-JS les voient directement.\u003C/li>\n\u003Cli>\u003Cstrong>Le schema JSON-LD est injecté dans le HTML initial\u003C/strong>, pas ajouté par un script côté client.\u003C/li>\n\u003C/ul>\n\u003Cp>Si vous migrez d'un framework SPA vers un setup SSR, référez-vous au \u003Ca href=\"/blog/changer-de-framework-next-js-vers-nuxt-ou-l-inverse-sans-perte-seo\">guide de migration Next.js / Nuxt\u003C/a> pour éviter les régressions classiques.\u003C/p>\n\u003Ch2>Gérer les canonicals et la déduplication dans un contexte multi-source\u003C/h2>\n\u003Cp>Un piège fréquent pour les sites multi-établissements : le contenu dupliqué entre pages locales. Quand 23 cliniques proposent les mêmes services avec des descriptions proches, Google peut décider de ne pas indexer certaines pages, ou pire, de les consolider vers une seule URL canonique — \u003Ca href=\"/blog/google-lists-9-scenarios-that-explain-how-it-picks-canonical-urls-via-sejournal-martinibuster\">un comportement documenté par Google lui-même\u003C/a>.\u003C/p>\n\u003Ch3>La règle des 40% de contenu unique\u003C/h3>\n\u003Cp>Chaque page locale doit contenir au minimum 40% de contenu textuel unique par rapport aux autres pages du même type. En pratique, cela signifie :\u003C/p>\n\u003Cul>\n\u003Cli>La description de la clinique, de l'équipe locale, et de l'environnement immédiat sont uniques.\u003C/li>\n\u003Cli>Les descriptions de services partagent un tronc commun, mais intègrent des spécificités locales (équipement disponible, spécialités du praticien).\u003C/li>\n\u003Cli>La FAQ est locale : les questions posées à une clinique de Montreuil ne sont pas les mêmes qu'à une clinique de Versailles.\u003C/li>\n\u003C/ul>\n\u003Cp>Validez cette unicité avec Screaming Frog : crawl complet du site, export des pages \u003Ccode>/cliniques/*/\u003C/code>, et analyse du near-duplicate content via l'onglet \"Content\" > \"Near Duplicates\" avec un seuil de similarité à 60%.\u003C/p>\n\u003Ch3>Impact mesurable\u003C/h3>\n\u003Cp>Pour le réseau de cliniques vétérinaires, après correction des incohérences schema + passage en SSR + enrichissement du contenu local unique :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Avant\u003C/strong> : 14 pages sur 23 indexées (9 exclues pour \"Duplicate without user-selected canonical\" dans GSC).\u003C/li>\n\u003Cli>\u003Cstrong>Après (8 semaines)\u003C/strong> : 22 pages sur 23 indexées. La 23e (une clinique ouverte récemment avec très peu de contenu) reste en \"Crawled — currently not indexed\".\u003C/li>\n\u003Cli>\u003Cstrong>Trafic organique local\u003C/strong> : +34% sur les requêtes \"vétérinaire + [ville]\" (comparaison mois-sur-mois dans GSC, segment par page locale).\u003C/li>\n\u003Cli>\u003Cstrong>Présence dans les AI Overviews\u003C/strong> : le site apparaît comme source citée pour 7 des 23 villes sur les requêtes testées manuellement dans Gemini et ChatGPT. Contre 0 avant les modifications.\u003C/li>\n\u003C/ul>\n\u003Ch2>Configurer votre serveur pour les bots IA locaux\u003C/h2>\n\u003Cp>Les bots IA ne se comportent pas comme Googlebot. Leur gestion dans le \u003Ccode>robots.txt\u003C/code> et au niveau du serveur mérite une attention spécifique, surtout pour les pages locales qui sont votre actif le plus stratégique.\u003C/p>\n\u003Ch3>robots.txt différencié\u003C/h3>\n\u003Cp>Vous voulez que GPTBot, ClaudeBot, et PerplexityBot accèdent à vos pages locales, mais pas nécessairement à votre espace admin, vos pages de checkout, ou vos assets JavaScript internes :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># robots.txt - stratégie différenciée pour bots IA\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">GPTBot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /cliniques/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /services/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /a-propos/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /admin/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /checkout/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /api/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Crawl-delay: \u003C/span>\u003Cspan style=\"color:#F97583\">2\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">ClaudeBot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /cliniques/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /services/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /admin/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /checkout/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /api/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Crawl-delay: \u003C/span>\u003Cspan style=\"color:#F97583\">2\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">PerplexityBot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /cliniques/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /services/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /admin/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /api/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Crawl-delay: \u003C/span>\u003Cspan style=\"color:#F97583\">3\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">Googlebot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: *\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /admin/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003Cspan style=\"color:#79B8FF\">api/internal\u003C/span>\u003Cspan style=\"color:#E1E4E8\">/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Sitemap: https://www.vetcliniques-idf.fr/sitemap-cliniques.xml\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le \u003Ccode>Crawl-delay\u003C/code> est important : les bots IA peuvent être agressifs et consommer des ressources serveur significatives, \u003Ca href=\"/blog/openai-meta-bytedance-lead-ai-bot-traffic-in-publishing-via-sejournal-mattgsouthern\">un phénomène documenté dans les données récentes de crawl IA\u003C/a>. Pour un site de 23 pages locales, ce n'est pas critique. Pour un annuaire avec 5 000 pages de localités, c'est un vrai sujet d'infrastructure.\u003C/p>\n\u003Cp>Pensez aussi à créer un sitemap dédié pour les pages locales (\u003Ccode>sitemap-cliniques.xml\u003C/code>) avec les \u003Ccode>lastmod\u003C/code> à jour. Les bots IA qui respectent le protocole sitemap (GPTBot le fait) utiliseront cette information pour prioriser les pages fraîches.\u003C/p>\n\u003Ch2>La homepage comme hub de confiance locale\u003C/h2>\n\u003Cp>Un aspect souvent négligé : \u003Ca href=\"/blog/your-homepage-matters-again-for-seo-here-s-why\">la homepage redevient stratégique\u003C/a> dans le contexte du search IA. Pour un site multi-établissements, la homepage est le point d'entrée que l'IA consulte en premier pour comprendre l'entité derrière le site.\u003C/p>\n\u003Cp>Votre homepage doit contenir :\u003C/p>\n\u003Cul>\n\u003Cli>Un schema \u003Ccode>Organization\u003C/code> qui relie explicitement l'entité parente à tous les établissements (\u003Ccode>subOrganization\u003C/code> ou \u003Ccode>hasPOS\u003C/code>).\u003C/li>\n\u003Cli>Une liste navigable de tous les établissements avec des liens vers les pages individuelles.\u003C/li>\n\u003Cli>Des signaux de confiance visibles en HTML (pas uniquement en image) : certifications, labels, affiliations professionnelles.\u003C/li>\n\u003C/ul>\n\u003Cp>Les agents IA qui \u003Ca href=\"/blog/how-ai-agents-see-your-website-and-how-to-build-for-them-via-sejournal-slobodanmanic\">crawlent votre site pour construire une compréhension de votre business\u003C/a> commencent presque toujours par la homepage. Si elle ne contient pas de marqueurs structurels clairs, l'agent ne fera pas le lien entre vos établissements et votre marque.\u003C/p>\n\u003Ch2>Monitorer les divergences avant que l'IA ne les exploite\u003C/h2>\n\u003Cp>Le plus gros risque dans ce modèle, c'est la dérive silencieuse. Un collaborateur met à jour les horaires sur GBP mais pas sur le site. Un développeur fait un deploy qui casse le schema JSON-LD d'une page locale. Une migration de CMS perd le \u003Ccode>sameAs\u003C/code> qui reliait le site aux fiches tierces.\u003C/p>\n\u003Cp>Ces régressions sont invisibles à l'œil nu. Elles ne génèrent pas d'erreur 500, pas d'alerte dans GSC. Mais elles dégradent votre statut de source de vérité aux yeux des systèmes IA.\u003C/p>\n\u003Cp>La vérification manuelle ne passe pas à l'échelle. Pour un réseau de 23 établissements, c'est gérable trimestriellement. Pour un réseau de franchise avec 200+ points de vente, c'est impossible sans automatisation. Un outil de monitoring comme Seogard détecte automatiquement les régressions de structured data — un schema \u003Ccode>LocalBusiness\u003C/code> qui disparaît après un déploiement, un \u003Ccode>telephone\u003C/code> qui change sans raison, un \u003Ccode>openingHoursSpecification\u003C/code> incohérent avec la version précédente.\u003C/p>\n\u003Cp>Complétez ce monitoring avec une vérification régulière du \u003Ca href=\"https://search.google.com/test/rich-results\">Rich Results Test de Google\u003C/a> pour chaque page locale, et une validation du schema via le \u003Ca href=\"https://validator.schema.org/\">Schema Markup Validator\u003C/a> pour détecter les erreurs syntaxiques avant qu'elles n'atteignent la production.\u003C/p>\n\u003Ch2>Le site comme point de décision, pas comme point d'information\u003C/h2>\n\u003Cp>L'insight fondamental de ce basculement vers le search IA local : votre site ne sera bientôt plus la première source d'information pour l'utilisateur. L'IA lui aura déjà donné les horaires, l'adresse, la note. Quand l'utilisateur arrive sur votre site, il a déjà les faits. Il vient pour décider et agir.\u003C/p>\n\u003Cp>Cela change radicalement ce que vos pages locales doivent prioriser :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Les CTAs de conversion\u003C/strong> (prise de rendez-vous, appel, itinéraire) doivent être immédiatement accessibles, pas après 3 scrolls.\u003C/li>\n\u003Cli>\u003Cstrong>Les éléments de confiance différenciants\u003C/strong> (photos de l'équipe, certifications, témoignages patients) doivent être au-dessus de la ligne de flottaison.\u003C/li>\n\u003Cli>\u003Cstrong>Le contenu informatif de base\u003C/strong> (horaires, adresse) reste nécessaire pour la cohérence schema, mais\u003C/li>\n\u003C/ul>",null,12,[18,19,20,21,22],"local SEO","AI search","structured data","source of truth","agentic search","Votre site web, source de vérité du search local IA","Thu Apr 16 2026 18:02:48 GMT+0000 (Coordinated Universal Time)",[26,40,54],{"_id":27,"slug":28,"__v":6,"author":7,"canonical":29,"category":10,"createdAt":30,"date":12,"description":31,"image":15,"imageAlt":15,"readingTime":16,"tags":32,"title":38,"updatedAt":39},"69e07b73aa6b273b0c6f9b74","google-search-console-glitch-gives-seos-a-scare-via-sejournal-martinibuster","https://seogard.io/blog/google-search-console-glitch-gives-seos-a-scare-via-sejournal-martinibuster","2026-04-16T06:02:27.256Z","Analyse technique du bug Google Search Console qui a affolé les SEOs. Comment vérifier vos données, automatiser les alertes et éviter les faux positifs.",[33,34,35,36,37],"google search console","glitch","monitoring SEO","API GSC","données search","Bug GSC : quand un glitch déclenche la panique SEO","Thu Apr 16 2026 06:02:27 GMT+0000 (Coordinated Universal Time)",{"_id":41,"slug":42,"__v":6,"author":7,"canonical":43,"category":10,"createdAt":44,"date":12,"description":45,"image":15,"imageAlt":15,"readingTime":16,"tags":46,"title":52,"updatedAt":53},"69e0b3caaa6b273b0c9ca959","march-2026-google-core-update-more-volatile-than-december-here-s-what-changed","https://seogard.io/blog/march-2026-google-core-update-more-volatile-than-december-here-s-what-changed","2026-04-16T10:02:50.898Z","Le core update de mars 2026 a redistribué ~80% des top résultats. Analyse technique, données, code et stratégies de diagnostic pour les SEO avancés.",[47,48,49,50,51],"march 2026 google core update","core update","SERP volatility","SEO technique","Google algorithm","March 2026 Google Core Update : analyse technique des shifts","Thu Apr 16 2026 10:02:50 GMT+0000 (Coordinated Universal Time)",{"_id":55,"slug":56,"__v":6,"author":7,"canonical":57,"category":10,"createdAt":58,"date":12,"description":59,"image":15,"imageAlt":15,"readingTime":16,"tags":60,"title":66,"updatedAt":67},"69e0fa30aa6b273b0cd4f4b3","your-ai-visibility-strategy-doesn-t-work-outside-english-via-sejournal-duaneforrester","https://seogard.io/blog/your-ai-visibility-strategy-doesn-t-work-outside-english-via-sejournal-duaneforrester","2026-04-16T15:03:12.593Z","Le biais linguistique des LLMs crée des trous de visibilité IA en dehors de l'anglais. Audit technique, hreflang, données structurées et monitoring pour y remédier.",[61,62,63,64,65],"AI visibility","multilingual SEO","hreflang","LLM","search generative experience","AI Visibility multilingue : pourquoi votre stratégie échoue hors anglais","Thu Apr 16 2026 15:03:12 GMT+0000 (Coordinated Universal Time)"]