Article SEO SEO Technique

SEO Local Service Insurance Assurance de service Concept

SEO Local pour les Assureurs : Assurance de service et stratégie de visibilité locale

Introduction

L’optimisation pour les moteurs de recherche (SEO) est devenue une stratégie essentielle pour les entreprises du secteur de l’assurance, qu’il s’agisse d’assureurs, de courtiers, d’agences générales ou d’insurtechs. Avec l’évolution des usages digitaux, la montée en puissance des parcours omnicanaux et l’augmentation de la concurrence en ligne, il est crucial de se concentrer sur le SEO local pour les assurances. Une stratégie locale efficace permet non seulement d’améliorer la visibilité dans une zone géographique précise, mais aussi de renforcer la confiance des prospects et des clients envers vos services.

Dans cet article, nous explorons en profondeur le concept d’assurance de service appliqué au SEO local pour les professionnels de l’assurance. Nous verrons comment structurer votre présence locale, comment transformer cette visibilité en rendez-vous qualifiés et en contrats signés, et comment articuler votre stratégie de contenu avec vos engagements de service. Nous détaillerons également des bonnes pratiques, des exemples concrets et des outils indispensables pour optimiser efficacement votre site web et vos points de présence locaux.

Qu’est-ce que le SEO local pour les assurances ?

Définition du SEO local appliqué au secteur de l’assurance

Le SEO local pour les assurances regroupe l’ensemble des actions visant à faire apparaître vos agences, cabinets ou offres d’assurance dans les résultats de recherche géolocalisés. L’objectif est de capter les internautes qui recherchent un service d’assurance dans une zone précise (ville, quartier, département, région) et de les orienter vers le bon point de contact : agence physique, conseiller dédié, tunnel de souscription en ligne, formulaire de devis ou prise de rendez-vous.

Concrètement, il s’agit d’optimiser :

  • Votre site web principal et vos pages locales (pages agences, pages par ville ou par région).
  • Vos profils d’établissement (notamment Google Business Profile, ex-Google My Business).
  • Vos signaux locaux (coordonnées cohérentes, avis clients, citations locales, liens depuis des sites de proximité, etc.).

Par exemple, une entreprise d’assurance automobile située à Paris peut travailler des expressions comme « assurance voiture Paris 15 », « assureur auto Paris centre » ou « assurance jeune conducteur Paris » afin d’améliorer son positionnement dans les résultats de recherche locaux, tant sur Google que sur d’autres moteurs.

Assurance de service et expérience client locale

La notion d’assurance de service dans un contexte SEO local ne renvoie pas à un produit d’assurance en tant que tel, mais à un engagement de qualité de service visible et vérifiable en ligne. Pour un assureur, cela peut inclure :

  • Des délai de réponse clairs pour les demandes de devis, les questions et les déclarations de sinistre.
  • Des engagements de prise en charge (par exemple, rappel en moins de 2 heures ouvrées, rendez-vous en agence sous 48 heures, accompagnement spécifique en cas de sinistre grave).
  • Une transparence sur les canaux de contact : téléphone, e-mail, RDV physique, visio, chat, espace client en ligne.
  • Une cohérence entre la promesse digitale et la réalité du terrain (horaires tenus, accueil en agence, suivi personnalisé, accompagnement après-vente).

Intégrer ces engagements dans vos contenus SEO locaux renforce la crédibilité de votre marque, augmente le taux de clics sur vos résultats locaux et favorise la conversion (appel, demande de devis, prise de rendez-vous) sans avoir à recourir systématiquement à des campagnes payantes.

Importance stratégique du positionnement local pour les assureurs

Un marché de l’assurance solide, de plus en plus digitalisé

Le marché français de l’assurance affiche une solidité et une rentabilité confirmées ces dernières années, avec des niveaux de solvabilité globalement élevés et une progression des primes en assurance de biens et de responsabilité comme en assurance de personnes. L’assurance vie reste le placement privilégié des ménages, avec des encours dépassant largement les 2 600 milliards d’euros et une collecte nette particulièrement dynamique ces dernières années.

Parallèlement, la digitalisation des parcours s’accélère. Les assureurs français présentent un niveau de couverture fonctionnelle digitale supérieur à la moyenne européenne, avec une part croissante des clients utilisant les services en ligne pour la consultation de contrats, les demandes de devis, la gestion des sinistres et le suivi des remboursements. Une grande majorité d’assurés exprime le souhait de pouvoir combiner simplicité digitale et accompagnement humain, en particulier pour la souscription et la gestion des sinistres.

Pourquoi le SEO local est devenu incontournable

Dans ce contexte, le SEO local assurance joue un rôle décisif pour plusieurs raisons :

  • Les recherches liées à l’assurance de proximité (ville, quartier, département) restent nombreuses, en particulier pour l’auto, l’habitation, la santé, la prévoyance et la protection des professionnels.
  • Une part importante des nouveaux contrats passe par une combinaison de recherche en ligne et de contact local : l’internaute se renseigne en ligne, compare, puis prend contact avec une agence ou un conseiller.
  • Le référencement local permet de rentabiliser le maillage d’agences ou de bureaux de proximité, en leur amenant des prospects qualifiés issus du web.
  • Les avis locaux et la réputation en ligne deviennent un élément clé de différenciation entre assureurs, à garanties et tarifs comparables.

Un bon positionnement local peut ainsi avoir un impact direct sur le volume de leads, la qualité des prospects (plus ciblés géographiquement et par type de besoin) et la fidélisation, car un client qui trouve facilement son interlocuteur local et bénéficie d’un service fluide a plus de raisons de rester.

Fondamentaux du SEO local pour une compagnie ou un cabinet d’assurance

Optimiser le contenu local

Pour améliorer votre optimisation SEO locale, il est indispensable de produire un contenu à la fois pertinent pour le client et lisible par les moteurs de recherche. Dans le secteur de l’assurance, cela implique :

  • Des pages locales dédiées pour chaque agence, bureau ou zone de chalandise importante.
  • Des descriptions détaillées des services proposés : auto, habitation, santé, prévoyance, assurance de prêt, solutions pour les professionnels, assurances spécialisées, etc.
  • L’intégration claire des coordonnées : adresse postale complète, numéro de téléphone, e-mail, liens vers l’espace client, plan d’accès, horaires d’ouverture mis à jour.
  • L’utilisation de mots-clés locaux dans les titres, les intertitres et les paragraphes, en restant naturel : « assurance habitation Lyon 3 », « courtier en assurance professionnelle Bordeaux », « assurance santé famille Lille », etc.
  • La mise en avant des engagements de service locaux : accompagnement en cas de sinistre, proximité avec les professionnels du territoire, compréhension des risques locaux (inondations, catastrophes naturelles, risques industriels, etc.).

Des contenus éditoriaux plus longs, tels que des guides pratiques ou des articles pédagogiques ciblés par ville ou par région, peuvent également renforcer le positionnement : par exemple, un guide sur « bien choisir son assurance habitation à Marseille en zone exposée aux inondations » ou « assurance flotte auto pour les artisans à Toulouse ».

Structurer votre site pour la performance locale

Une structure web claire et bien organisée est essentielle pour une performance optimale en SEO local assurance. Quelques principes structurants :

  • Créer une arborescence dédiée aux agences : par exemple, un répertoire /agences/ville/ ou /assurance/ville/ permettant de regrouper toutes les pages locales.
  • Éviter les contenus dupliqués en personnalisant chaque page locale (équipe, photos, spécificités du territoire, partenaires locaux, risques propres à la zone).
  • Mettre en place un maillage interne logique entre les pages produits (auto, habitation, santé…) et les pages locales correspondantes.
  • Assurer une navigation simple vers le contact : boutons de prise de rendez-vous, formulaires courts, numéro cliquable sur mobile, lien direct vers l’agence la plus proche.
  • Optimiser la vitesse de chargement et l’ergonomie mobile, indispensables pour le référencement local et l’expérience utilisateur.

Balises, données structurées et signaux techniques

Pour renforcer votre visibilité locale, il est pertinent de travailler les éléments techniques suivants :

  • Balises </strong> et <strong><meta description></strong> intégrant le type d’assurance, le nom de la ville et parfois le quartier.</li> <li>Balises de <strong>titres H1, H2, H3</strong> organisant le contenu autour des besoins de l’assuré et du territoire.</li> <li>Implémentation de <strong>données structurées de type LocalBusiness</strong> (schema.org) pour chaque agence ou point de vente : nom, adresse, téléphone, horaires, géolocalisation.</li> <li>Utilisation de <strong>balisage pour les avis</strong> (aggregateRating) lorsque cela est conforme aux règles des moteurs de recherche.</li> </ul> <p>Ces éléments techniques ne remplacent pas le contenu, mais ils aident les moteurs à mieux comprendre la nature locale de votre offre et à associer vos pages aux requêtes d’assurance dans votre zone de chalandise.</p> <h2 id="assurance-de-service-nbsp-transformer-la-visibilite-locale-en-valeur">Assurance de service : transformer la visibilité locale en valeur</h2> <h3 id="du-contrat-d-assurance-au-contrat-de-service-augmente">Du contrat d’assurance au contrat de service augmenté</h3> <p>Le marché de l’assurance évolue vers des <strong>contrats augmentés par les services</strong>. Au-delà des garanties traditionnelles, les offres intègrent de plus en plus de services de prévention, d’accompagnement, de bien-être, de téléconsultation, de gestion de crise ou de conseil personnalisé. Cette évolution est particulièrement visible en santé, en prévoyance, en auto connectée, en assurance habitation et en assurance des professionnels.</p> <p>Pour un assureur qui travaille son <strong>SEO local</strong>, cette tendance est une opportunité :</p> <ul> <li>Les contenus locaux peuvent expliquer <strong>les services concrets associés aux contrats</strong> : assistance 24/7, services de dépannage, accompagnement psychologique, aide administrative après un sinistre, mise en relation avec des artisans locaux, etc.</li> <li>Les pages agences peuvent mettre en avant la <strong>capacité d’accompagnement humain</strong> : rendez-vous personnalisés, diagnostics de risques sur site pour les professionnels, ateliers de prévention en partenariat avec des acteurs locaux.</li> <li>Les avis clients peuvent refléter la <strong>qualité du service rendu</strong>, et pas seulement le prix ou le niveau de garantie.</li> </ul> <h3 id="aligner-promesse-digitale-et-realite-operationnelle">Aligner promesse digitale et réalité opérationnelle</h3> <p>Pour que l’<strong>assurance de service</strong> soit crédible, les engagements mis en avant dans votre stratégie SEO locale doivent être tenus dans la réalité. Cela implique :</p> <ul> <li>De <strong>coordonner marketing, réseau et opérations</strong> afin que les engagements affichés sur les pages locales et les fiches d’établissement soient bien connus et respectés par les équipes en agence.</li> <li>De mettre à jour régulièrement les <strong>horaires, canaux de contact et délais moyens de réponse</strong>, surtout en cas de changement d’organisation ou de situation exceptionnelle (événements climatiques majeurs, fermeture exceptionnelle, travaux, etc.).</li> <li>De traiter les <strong>avis clients</strong> (positifs et négatifs) de manière structurée, avec des réponses professionnelles, transparentes et orientées solution.</li> </ul> <p>Un SEO local efficace ne se limite pas à obtenir un bon classement : il vise à générer des contacts réellement satisfaits, susceptibles de devenir des clients fidèles et des prescripteurs locaux.</p> <h2 id="bonnes-pratiques-seo-locales-pour-les-professionnels-de-l-assurance">Bonnes pratiques SEO locales pour les professionnels de l’assurance</h2> <h3 id="travailler-ses-profils-locaux-google-business-profile-et-autres">Travailler ses profils locaux (Google Business Profile et autres)</h3> <p>Les <strong>profils d’établissement</strong> sont l’un des piliers de la visibilité locale. Pour une agence ou un cabinet d’assurance, il est indispensable de :</p> <ul> <li>Revendiquer et vérifier chaque profil d’établissement.</li> <li>Renseigner avec précision : nom de l’agence, spécialités, adresse, téléphone, horaires, URL du site ou de la page locale.</li> <li>Choisir des <strong>catégories pertinentes</strong> (assureur, courtier en assurance, assurance automobile, assurance habitation, etc.).</li> <li>Publier régulièrement des <strong>posts</strong> (actualités, conseils, opérations locales, informations sur les événements climatiques ou les périodes de forte demande).</li> <li>Encourager les <strong>avis clients</strong> authentiques et y répondre systématiquement.</li> </ul> <p>Ces actions renforcent à la fois la visibilité dans le pack local (les résultats avec carte) et la confiance des utilisateurs.</p> <h3 id="produire-un-contenu-de-qualite-pedagogique-et-localise">Produire un contenu de qualité, pédagogique et localisé</h3> <p>La production de contenu reste au cœur du <strong>SEO local assurance</strong>. Pour vous démarquer, vous pouvez :</p> <ul> <li>Publier des <strong>articles éducatifs</strong> sur les risques et les garanties, adaptés au territoire : zones inondables, risques climatiques, densité urbaine, typologie de logements, tissus d’entreprises, etc.</li> <li>Créer des <strong>guides thématiques</strong> pour des profils d’assurés précis : jeunes conducteurs, familles, seniors, artisans, professions libérales, TPE/PME locales.</li> <li>Mettre en avant des <strong>cas concrets</strong> (dans le respect de la confidentialité) : accompagnement après un sinistre, réactivité sur un dossier complexe, prévention mise en place avec un client professionnel.</li> <li>Proposer des <strong>FAQ locales</strong> répondant aux questions fréquentes des assurés de votre zone (franchise en cas de catastrophe naturelle locale, spécificités d’assurance pour les copropriétés, obligations légales pour les professionnels de la région, etc.).</li> </ul> <p>N’oubliez pas d’intégrer naturellement vos mots-clés locaux dans ces contenus, sans sur-optimisation : l’objectif est d’être utile pour l’internaute, tout en donnant des signaux clairs aux moteurs de recherche.</p> <h3 id="synergie-seo-local-publicite-locale-et-reseaux-sociaux">Synergie SEO local, publicité locale et réseaux sociaux</h3> <p>Le SEO local ne fonctionne pas en vase clos. Pour maximiser l’impact, il est pertinent de le combiner avec :</p> <ul> <li>Des <strong>campagnes publicitaires locales</strong> (search, display ou social) ciblant votre zone de chalandise pour renforcer la notoriété et soutenir vos pages locales.</li> <li>Une présence active sur les <strong>réseaux sociaux</strong> mettant en avant la vie de l’agence, les actions de prévention, les partenariats locaux et les engagements sociétaux.</li> <li>Des <strong>relations presse locales</strong> (articles dans la presse régionale, interventions dans des événements locaux) qui peuvent générer des liens de qualité vers vos pages.</li> </ul> <p>Cette approche combinée renforce votre empreinte locale globale et augmente la probabilité que vos pages SEO locales soient consultées par des prospects prêts à passer à l’action.</p> <h2 id="outils-et-ressources-utiles-pour-piloter-le-seo-local-en-assurance">Outils et ressources utiles pour piloter le SEO local en assurance</h2> <h3 id="outils-de-suivi-et-d-analyse">Outils de suivi et d’analyse</h3> <p>Plusieurs outils reconnus permettent de suivre et d’optimiser votre présence locale :</p> <ul> <li><strong>Google Search Console</strong> : indispensable pour surveiller la performance de vos pages locales, identifier les requêtes associées, corriger les erreurs techniques et suivre l’évolution de votre visibilité.</li> <li><strong>Google Analytics</strong> ou équivalent : pour analyser le trafic sur vos pages agences et vos pages produits, évaluer les conversions (formulaires, appels, clics vers les outils de prise de rendez-vous) et comprendre le comportement des utilisateurs.</li> <li><strong>Screaming Frog</strong> (ou tout autre crawler SEO) : utile pour auditer le SEO technique de l’ensemble de votre site, détecter les erreurs de liens, les contenus dupliqués, les pages orphelines et les problèmes de balisage.</li> <li><strong>Ahrefs</strong>, SEMrush ou outils similaires : pour analyser la concurrence, identifier les mots-clés locaux pertinents, repérer les opportunités de liens locaux et suivre vos positions.</li> <li>Outils spécialisés de <strong>suivi de positions locales</strong> : ils permettent de mesurer votre visibilité sur un périmètre précis (ville, quartier) et de comparer vos performances à celles d’autres acteurs locaux.</li> </ul> <h3 id="ressources-pour-approfondir-le-seo-local-en-assurance">Ressources pour approfondir le SEO local en assurance</h3> <p>Pour aller plus loin, il est recommandé de consulter :</p> <ul> <li>Les <strong>guides officiels dédiés aux bonnes pratiques pour les sites web</strong> édités par les principaux moteurs de recherche.</li> <li>Les <strong>publications d’organismes professionnels de l’assurance</strong> qui présentent les tendances de marché, l’évolution des attentes des assurés et les enjeux de digitalisation.</li> <li>Des <strong>webinaires</strong>, formations et conférences sur le marketing digital pour les assureurs, courtiers et agents généraux.</li> <li>Les <strong>communautés professionnelles</strong> dédiées au marketing de l’assurance, où sont partagés retours d’expérience et bonnes pratiques sur le SEO local, la publicité et les parcours clients.</li> </ul> <h2 id="faq-seo-local-et-assurance-de-service">FAQ – SEO local et assurance de service</h2> <dl> <dt><strong>Quels sont les principaux avantages du SEO local pour un assureur ?</strong></dt> <dd> Le SEO local permet d’<strong>améliorer la visibilité</strong> de vos agences ou de votre cabinet dans votre zone de chalandise, de <strong>renforcer la confiance</strong> grâce aux avis et aux contenus de proximité, et d’<strong>attirer davantage de prospects qualifiés</strong> : des personnes réellement situées dans votre territoire et en recherche active de solutions d’assurance adaptées. </dd> <dt><strong>Comment démarrer une stratégie de SEO local assurance ?</strong></dt> <dd> Pour commencer, identifiez vos <strong>zones prioritaires</strong> (villes, arrondissements, départements) et les <strong>produits phares</strong> à promouvoir localement. Créez ou optimisez vos <strong>pages locales</strong> en y intégrant du contenu utile, des coordonnées complètes, des appels à l’action clairs et des engagements de service. Travaillez ensuite vos <strong>profils d’établissement</strong>, vos avis clients et votre maillage interne pour orienter les internautes vers la bonne agence ou le bon interlocuteur. </dd> <dt><strong>Quel est le rôle de Google Business Profile dans le SEO local assurance ?</strong></dt> <dd> Google Business Profile (anciennement Google My Business) est un <strong>levier central</strong> de la visibilité locale. Il permet à vos agences d’apparaître dans le pack local, sur Google Maps et dans les résultats de recherche géolocalisés, avec des informations clés : adresse, horaires, téléphone, site web, photos, avis, questions-réponses. Un profil bien rempli, régulièrement mis à jour et alimenté en avis clients renforce la crédibilité de votre marque et augmente le nombre d’appels et de visites en agence. </dd> <dt><strong>Le SEO local suffit-il à lui seul pour développer une agence d’assurance ?</strong></dt> <dd> Le SEO local est un <strong>pilier important</strong> du développement, mais il s’intègre dans une stratégie plus globale. Les résultats les plus solides sont obtenus lorsque le référencement local est combiné avec <strong>l’animation du réseau d’agences</strong>, la qualité du service rendu, la recommandation, les <strong>campagnes de communication locales</strong> et une présence active sur les canaux digitaux (site, réseaux sociaux, e-mailing, comparateurs, etc.). </dd> <dt><strong>Comment mesurer l’efficacité de mon SEO local assurance ?</strong></dt> <dd> Vous pouvez suivre plusieurs indicateurs : <strong>trafic organique local</strong> sur vos pages agences et vos pages produits, <strong>nombre d’appels et de formulaires</strong> issus de ces pages, taux de prise de rendez-vous, volume et note moyenne des <strong>avis clients</strong>, évolution de vos <strong>positions locales</strong> sur les mots-clés stratégiques, ainsi que le nombre de <strong>contrats ou rendez-vous</strong> que vos équipes attribuent directement aux contacts générés par le web. </dd> </dl> </div> <!-- CTA Section --> <div class="mt-12 pt-8 border-t border-gray-200"> <div class="bg-gradient-to-r from-purple-600 to-blue-600 rounded-xl p-8 text-center text-white"> <h3 class="text-2xl font-bold mb-4">Besoin d'aide avec votre SEO ?</h3> <p class="mb-6 text-purple-100">Notre équipe d'experts peut vous aider à optimiser votre site e-commerce</p> <div class="flex flex-col sm:flex-row gap-4 justify-center"> <a href="/seo-ecommerce" class="bg-white text-purple-600 px-8 py-3 rounded-lg font-semibold hover:bg-purple-50 transition inline-block"> Découvrir nos services SEO </a> <a href="/#contact" class="bg-purple-800 text-white px-8 py-3 rounded-lg font-semibold hover:bg-purple-900 transition inline-block"> Nous contacter </a> </div> </div> </div> </article> <!-- Section Commentaires --> <div class="mt-12 max-w-4xl mx-auto bg-white rounded-2xl shadow-xl p-8 md:p-12"> <h2 class="text-3xl font-bold text-gray-900 mb-6 flex items-center gap-3"> <i class="fas fa-comments text-purple-600"></i> Commentaires </h2> <!-- Liste des commentaires approuvés --> <div id="comments-list" class="mb-8 space-y-6"> <!-- Les commentaires approuvés seront chargés ici via JavaScript --> </div> <!-- Formulaire de commentaire --> <div class="border-t border-gray-200 pt-8"> <h3 class="text-xl font-semibold text-gray-900 mb-4">Laisser un commentaire</h3> <form id="comment-form" class="space-y-4"> <input type="hidden" id="article-slug" value="seo-local-service-insurance-assurance-de-service-concept"> <div class="grid md:grid-cols-2 gap-4"> <div> <label for="comment-name" class="block text-sm font-medium text-gray-700 mb-2">Nom *</label> <input type="text" id="comment-name" name="name" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-600 focus:border-transparent"> </div> <div> <label for="comment-email" class="block text-sm font-medium text-gray-700 mb-2">Email *</label> <input type="email" id="comment-email" name="email" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-600 focus:border-transparent"> </div> </div> <div> <label for="comment-message" class="block text-sm font-medium text-gray-700 mb-2">Message *</label> <textarea id="comment-message" name="message" rows="5" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-600 focus:border-transparent"></textarea> </div> <div class="text-sm text-gray-600"> <i class="fas fa-info-circle text-purple-600"></i> Votre commentaire sera soumis à modération avant publication. </div> <button type="submit" class="bg-gradient-to-r from-purple-600 to-blue-600 text-white px-8 py-3 rounded-lg font-semibold hover:from-purple-700 hover:to-blue-700 transition inline-flex items-center gap-2"> <i class="fas fa-paper-plane"></i> Publier le commentaire </button> </form> <div id="comment-status" class="mt-4 hidden"></div> </div> </div> <!-- Navigation Articles --> <div class="mt-12 max-w-4xl mx-auto"> <a href="/blog" class="inline-flex items-center gap-2 text-purple-600 hover:text-purple-800 transition font-semibold"> <i class="fas fa-arrow-left"></i> Retour au blog </a> </div> </div> </section> <!-- Script pour les commentaires --> <script> const articleSlug = 'seo-local-service-insurance-assurance-de-service-concept'; // Charger les commentaires approuvés async function loadComments() { try { const response = await fetch(`/gestion-commentaires/get-comments.php?slug=${articleSlug}`); const data = await response.json(); const commentsList = document.getElementById('comments-list'); if (data.success && data.comments.length > 0) { commentsList.innerHTML = data.comments.map(comment => ` <div class="border-l-4 border-purple-600 pl-4 py-2"> <div class="flex items-center gap-2 mb-2"> <strong class="text-gray-900">${comment.name}</strong> <span class="text-sm text-gray-500">•</span> <span class="text-sm text-gray-500">${new Date(comment.date).toLocaleDateString('fr-FR')}</span> </div> <p class="text-gray-700">${comment.message}</p> </div> `).join(''); } else { commentsList.innerHTML = '<p class="text-gray-500 italic">Aucun commentaire pour le moment. Soyez le premier à commenter !</p>'; } } catch (error) { console.error('Erreur lors du chargement des commentaires:', error); } } // Gérer la soumission du formulaire document.getElementById('comment-form').addEventListener('submit', async function(e) { e.preventDefault(); const formData = { slug: articleSlug, name: document.getElementById('comment-name').value, email: document.getElementById('comment-email').value, message: document.getElementById('comment-message').value }; const submitBtn = this.querySelector('button[type="submit"]'); const originalText = submitBtn.innerHTML; submitBtn.disabled = true; submitBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Envoi en cours...'; try { const response = await fetch('/gestion-commentaires/submit-comment.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData) }); const result = await response.json(); const messageDiv = document.getElementById('comment-status'); if (result.success) { messageDiv.className = 'mt-4 p-4 bg-green-100 border border-green-400 text-green-700 rounded-lg'; messageDiv.textContent = 'Merci ! Votre commentaire a été soumis et sera publié après modération.'; messageDiv.classList.remove('hidden'); this.reset(); } else { messageDiv.className = 'mt-4 p-4 bg-red-100 border border-red-400 text-red-700 rounded-lg'; messageDiv.textContent = result.message || 'Une erreur est survenue. Veuillez réessayer.'; messageDiv.classList.remove('hidden'); } } catch (error) { const messageDiv = document.getElementById('comment-status'); messageDiv.className = 'mt-4 p-4 bg-red-100 border border-red-400 text-red-700 rounded-lg'; messageDiv.textContent = 'Erreur de connexion. Veuillez réessayer plus tard.'; messageDiv.classList.remove('hidden'); } finally { submitBtn.disabled = false; submitBtn.innerHTML = originalText; } }); // Charger les commentaires au chargement de la page loadComments(); </script> <footer class="bg-gray-950 text-gray-400 py-12"> <div class="container mx-auto px-6"> <div class="flex flex-col md:flex-row justify-between items-center"> <div class="mb-6 md:mb-0 flex items-start gap-4"> <img src="/images/logo.png" alt="Logo VRAIVEX" class="h-32 w-32 md:h-40 md:w-40 object-contain"> <div> <a href="#" class="text-2xl font-bold block"> <span class="gradient-text">VRAIVEX</span> </a> <p class="mt-2 text-sm">Automatisation, IA et SEO au service de la performance e-commerce</p> </div> </div> <div class="flex flex-col items-center md:items-end"> <div class="grid grid-cols-2 md:flex md:flex-wrap gap-3 md:space-x-6 mb-4 text-center md:text-right"> <a href="/#about" class="hover:text-white transition text-sm">À propos</a> <a href="/#services" class="hover:text-white transition text-sm">Services</a> <a href="/#prestations" class="hover:text-white transition text-sm">Prestations</a> <a href="/#bestsellers" class="hover:text-white transition text-sm">Best Sellers</a> <a href="/#realisations" class="hover:text-white transition text-sm">Réalisations</a> <a href="/#brands" class="hover:text-white transition text-sm">Nos Sites</a> <a href="/creation-site-ecommerce" class="hover:text-white transition text-sm">Création Sites</a> <a href="/seo-ecommerce" class="hover:text-white transition text-sm">SEO E-commerce</a> <a href="/partenaires" class="hover:text-white transition text-sm">Partenaires</a> <a href="/#contact" class="hover:text-white transition text-sm">Contact</a> </div> <p class="text-sm text-center md:text-right">© 2026 VRAIVEX. Tous droits réservés.</p> </div> </div> </div> </footer> <!-- Back to Top Button --> <button id="backToTop" class="fixed bottom-8 right-8 bg-gradient-to-r from-purple-600 to-blue-600 text-white p-4 rounded-full shadow-lg hover:shadow-xl transform hover:scale-110 transition-all duration-300 z-50 hidden"> <i class="fas fa-arrow-up text-xl"></i> </button> <script> // Header scroll effect window.addEventListener('scroll', function() { const header = document.getElementById('header'); if (window.scrollY > 100) { header.classList.add('header-scrolled'); } else { header.classList.remove('header-scrolled'); } }); // Smooth scrolling for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); document.querySelector(this.getAttribute('href')).scrollIntoView({ behavior: 'smooth' }); }); }); // Mobile menu toggle const mobileMenuButton = document.getElementById('mobileMenuButton'); const mobileMenu = document.getElementById('mobileMenu'); const menuIcon = document.getElementById('menuIcon'); if (mobileMenuButton && mobileMenu) { mobileMenuButton.addEventListener('click', function() { mobileMenu.classList.toggle('hidden'); // Toggle icon between bars and times if (mobileMenu.classList.contains('hidden')) { menuIcon.classList.remove('fa-times'); menuIcon.classList.add('fa-bars'); } else { menuIcon.classList.remove('fa-bars'); menuIcon.classList.add('fa-times'); } }); // Close menu when clicking on a link const mobileLinks = mobileMenu.querySelectorAll('a'); mobileLinks.forEach(link => { link.addEventListener('click', function() { mobileMenu.classList.add('hidden'); menuIcon.classList.remove('fa-times'); menuIcon.classList.add('fa-bars'); }); }); } // Brands Carousel const brandsCarousel = document.getElementById('brandsCarousel'); const brandsContainer = document.getElementById('brandsContainer'); const brandsPrevBtn = document.getElementById('brandsPrevBtn'); const brandsNextBtn = document.getElementById('brandsNextBtn'); const brandsPrevBtnMobile = document.getElementById('brandsPrevBtnMobile'); const brandsNextBtnMobile = document.getElementById('brandsNextBtnMobile'); if (brandsContainer && brandsCarousel) { let currentIndex = 0; const cards = brandsContainer.querySelectorAll('.brand-card'); const gap = 24; const cardsPerView = { mobile: 1, tablet: 2, desktop: 3, large: 4 }; function getCardsPerView() { const w = window.innerWidth; if (w >= 1280) return cardsPerView.large; if (w >= 1024) return cardsPerView.desktop; if (w >= 768) return cardsPerView.tablet; return cardsPerView.mobile; } function getCardWidth() { const cpv = getCardsPerView(); const cw = brandsCarousel.offsetWidth; return (cw - gap * (cpv - 1)) / cpv; } function updateCarousel() { const cpv = getCardsPerView(); const cardW = getCardWidth(); const maxIdx = Math.max(0, cards.length - cpv); currentIndex = Math.min(currentIndex, maxIdx); const offset = currentIndex * (cardW + gap); brandsContainer.style.transform = `translateX(-${offset}px)`; const atStart = currentIndex === 0; const atEnd = currentIndex >= maxIdx; [brandsPrevBtn, brandsPrevBtnMobile].forEach(function(btn) { if (btn) { btn.style.opacity = atStart ? '0.4' : '1'; btn.style.pointerEvents = atStart ? 'none' : 'auto'; } }); [brandsNextBtn, brandsNextBtnMobile].forEach(function(btn) { if (btn) { btn.style.opacity = atEnd ? '0.4' : '1'; btn.style.pointerEvents = atEnd ? 'none' : 'auto'; } }); if (document.getElementById('brandsCounter')) { document.getElementById('brandsCounter').textContent = (currentIndex + 1) + ' / ' + (maxIdx + 1); } } function nextSlide() { const cpv = getCardsPerView(); const maxIdx = Math.max(0, cards.length - cpv); if (currentIndex < maxIdx) { currentIndex++; updateCarousel(); } } function prevSlide() { if (currentIndex > 0) { currentIndex--; updateCarousel(); } } if (brandsNextBtn) brandsNextBtn.addEventListener('click', nextSlide); if (brandsPrevBtn) brandsPrevBtn.addEventListener('click', prevSlide); if (brandsNextBtnMobile) brandsNextBtnMobile.addEventListener('click', nextSlide); if (brandsPrevBtnMobile) brandsPrevBtnMobile.addEventListener('click', prevSlide); function setCardWidths() { const cardW = getCardWidth(); cards.forEach(function(card) { card.style.width = cardW + 'px'; card.style.minWidth = cardW + 'px'; card.style.flexShrink = '0'; }); } let touchStartX = 0; let touchEndX = 0; brandsCarousel.addEventListener('touchstart', function(e) { touchStartX = e.changedTouches[0].screenX; }, { passive: true }); brandsCarousel.addEventListener('touchend', function(e) { touchEndX = e.changedTouches[0].screenX; const diff = touchStartX - touchEndX; if (Math.abs(diff) > 50) { diff > 0 ? nextSlide() : prevSlide(); } }, { passive: true }); setCardWidths(); updateCarousel(); let resizeTimeout; window.addEventListener('resize', function() { clearTimeout(resizeTimeout); resizeTimeout = setTimeout(function() { setCardWidths(); currentIndex = 0; updateCarousel(); }, 250); }); } </script> <script> // Header scroll effect window.addEventListener('scroll', function() { const header = document.getElementById('header'); if (window.scrollY > 50) { header.classList.add('header-scrolled'); } else { header.classList.remove('header-scrolled'); } }); // Scroll animations const observerOptions = { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }; const observer = new IntersectionObserver(function(entries) { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('visible'); } }); }, observerOptions); // Observe all fade-in-up elements document.querySelectorAll('.fade-in-up').forEach(el => { observer.observe(el); }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); // Counter animation for stats function animateCounter(element, target, duration = 2000) { let start = 0; const increment = target / (duration / 16); const timer = setInterval(() => { start += increment; if (start >= target) { element.textContent = target + (element.textContent.includes('+') ? '+' : '') + (element.textContent.includes('K') ? 'K€' : ''); clearInterval(timer); } else { element.textContent = Math.floor(start) + (element.textContent.includes('+') ? '+' : '') + (element.textContent.includes('K') ? 'K€' : ''); } }, 16); } // Observe stats section const statsObserver = new IntersectionObserver(function(entries) { entries.forEach(entry => { if (entry.isIntersecting && !entry.target.classList.contains('animated')) { entry.target.classList.add('animated'); const statsCards = entry.target.querySelectorAll('.stats-card'); statsCards.forEach((card, index) => { setTimeout(() => { card.style.opacity = '0'; card.style.transform = 'translateY(20px)'; setTimeout(() => { card.style.transition = 'all 0.6s ease'; card.style.opacity = '1'; card.style.transform = 'translateY(0)'; }, 100); }, index * 100); }); } }); }, { threshold: 0.3 }); const statsSection = document.querySelector('section.bg-gradient-to-r'); if (statsSection) { statsObserver.observe(statsSection); } </script> <script> // Gestion du formulaire de contact const contactForm = document.getElementById('contact-form'); const formMessage = document.getElementById('form-message'); const submitBtn = document.getElementById('submit-btn'); if (contactForm) { contactForm.addEventListener('submit', async function(e) { e.preventDefault(); // Désactiver le bouton pendant l'envoi submitBtn.disabled = true; submitBtn.textContent = 'Envoi en cours...'; // Récupérer les données du formulaire const formData = new FormData(contactForm); try { // Vérifier que les données sont bien dans le FormData const formDataObj = { name: formData.get('name'), email: formData.get('email'), subject: formData.get('subject'), message: formData.get('message') }; console.log('Données du formulaire:', formDataObj); // Vérifier que tous les champs sont remplis if (!formDataObj.name || !formDataObj.email || !formDataObj.subject || !formDataObj.message) { formMessage.classList.remove('hidden'); formMessage.className = 'mb-6 p-4 rounded-lg bg-red-600 text-white'; formMessage.textContent = 'Veuillez remplir tous les champs du formulaire.'; submitBtn.disabled = false; submitBtn.textContent = 'Envoyer le message'; return; } // Essayer d'abord avec JSON (plus fiable) // Siça ne fonctionne pas, on essaiera avec FormData let response; try { // Méthode 1 : Envoyer en JSON (plus fiable selon les forums) response = await fetch('gestion-formulaire-contact/send-email-json.php', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(formDataObj) }); } catch (jsonError) { console.warn('Erreur avec JSON, essai avec FormData:', jsonError); // Méthode 2 : Fallback avec FormData response = await fetch('send-email.php', { method: 'POST', body: formData }); } // Lire le texte de la réponse d'abord pour déboguer const responseText = await response.text(); console.log('Réponse serveur:', responseText.substring(0, 500)); // Vérifier si la réponse est OK if (!response.ok) { // Essayer de parser le JSON d'erreur try { const errorResult = JSON.parse(responseText); // Afficher le message d'erreur du serveur directement à l'utilisateur formMessage.classList.remove('hidden'); formMessage.className = 'mb-6 p-4 rounded-lg bg-red-600 text-white'; formMessage.textContent = errorResult.message || `Erreur ${response.status}: ${response.statusText}`; submitBtn.disabled = false; submitBtn.textContent = 'Envoyer le message'; return; // Sortir de la fonction pour ne pas continuer } catch (e) { throw new Error(`Erreur HTTP ${response.status}: ${response.statusText}. Réponse: ${responseText.substring(0, 200)}`); } } // Vérifier si PHP n'est pas exécuté (le serveur renvoie le code PHP brut) if (responseText.trim().startsWith('<?php') || responseText.includes('<?php')) { console.error('ERREUR: PHP n\'est pas exécuté par le serveur. Le code PHP est renvoyé brut.'); console.error('Le serveur web n\'est pas configuré pour exécuter PHP.'); // Utiliser la solution de secours : sauvegarder dans localStorage const messageData = { name: formData.get('name'), email: formData.get('email'), subject: formData.get('subject'), message: formData.get('message'), timestamp: new Date().toISOString() }; // Sauvegarder dans localStorage comme solution de secours const savedMessages = JSON.parse(localStorage.getItem('vraivex_messages') || '[]'); savedMessages.push(messageData); localStorage.setItem('vraivex_messages', JSON.stringify(savedMessages)); // Afficher un message spécial formMessage.classList.remove('hidden'); formMessage.className = 'mb-6 p-4 rounded-lg bg-yellow-600 text-white'; formMessage.innerHTML = '⚠️ PHP n\'est pas configuré sur le serveur. Votre message aété sauvegardé localement. <br>Veuillez nous contacter directement à <strong>contact@vraivex.fr</strong> ou consulter les messages sauvegardés dans la console du navigateur.'; // Afficher les messages sauvegardés dans la console console.log('Messages sauvegardés localement:', savedMessages); console.log('Pour consulter les messages, tapez dans la console: JSON.parse(localStorage.getItem("vraivex_messages"))'); return; // Sortir de la fonction } // Essayer de parser le JSON let result; try { result = JSON.parse(responseText); } catch (parseError) { console.error('Erreur de parsing JSON:', parseError); console.error('Réponse reçue:', responseText.substring(0, 500)); throw new Error('Le serveur a renvoyé une réponse invalide. Vérifiez la console pour plus de détails.'); } // Afficher le message de résultat formMessage.classList.remove('hidden'); if (result.success) { formMessage.className = 'mb-6 p-4 rounded-lg bg-green-600 text-white'; formMessage.textContent = 'Message envoyé avec succès ! Nous vous répondrons dans les plus brefs délais.'; contactForm.reset(); } else { formMessage.className = 'mb-6 p-4 rounded-lg bg-red-600 text-white'; let errorMsg = result.message || 'Une erreur est survenue. Veuillez réessayer.'; // Afficher le message de debug en développement (à retirer en production) if (result.debug) { console.error('Erreur détaillée:', result.debug); } formMessage.textContent = errorMsg; } } catch (error) { formMessage.classList.remove('hidden'); formMessage.className = 'mb-6 p-4 rounded-lg bg-red-600 text-white'; // Message d'erreur plus détaillé pour le débogage let errorMsg = 'Une erreur est survenue lors de la communication avec le serveur. '; errorMsg += 'Veuillez réessayer plus tard ou nous contacter directement à contact@vraivex.fr'; // En mode développement, afficher plus de détails if (error.message) { console.error('Erreur détaillée:', error); console.error('Message:', error.message); console.error('Stack:', error.stack); } formMessage.textContent = errorMsg; } finally { // Réactiver le bouton submitBtn.disabled = false; submitBtn.textContent = 'Envoyer le message'; // Masquer le message après 5 secondes setTimeout(() => { formMessage.classList.add('hidden'); }, 5000); } }); } // Back to Top Button functionality const backToTopButton = document.getElementById('backToTop'); // Show/hide button based on scroll position window.addEventListener('scroll', () => { if (window.pageYOffset > 300) { backToTopButton.classList.remove('hidden'); } else { backToTopButton.classList.add('hidden'); } }); // Smooth scroll to top when clicked backToTopButton.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); </script> </body> </html>