Publié le 1 mars 2026 SEO Technique

Peut-on avoir plusieurs boutiques Shopify ?

Sommaire de l'article

Introduction

Si vousêtes un entrepreneur en ligne ou un passionné de commerce numérique, vous avez probablement déj à entendu parler de Shopify. Cependant, une question revient très souvent : peut-on avoir plusieurs boutiques Shopify avec le même compte et la même adresse e-mail ? La réponse est clairement oui. Il est tout à fait possible de gérer plusieurs boutiques Shopify, à condition de bien comprendre le fonctionnement des abonnements, les limites pratiques et les implications stratégiques.

Comme toute décision impliquant un investissement de temps, d’énergie et d’argent, il est essentiel de bien maîtriser les avantages, les risques et l’organisation nécessaire avant de lancer plusieurs boutiques Shopify. Une mauvaise anticipation peut rapidement entraîner un surcoût, une charge de travail ingérable ou des problèmes de cohérence de marque.

Dans cet article complet et professionnel, nous allons explorer en profondeur la possibilité de gérer plusieurs boutiques Shopify : principes de base, aspects techniques, coûts, bonnes pratiques de gestion, SEO, organisation de l’inventaire, mais aussi les particularités de Shopify Plus pour les structures plus avancées. Vous aurez ainsi toutes les informations nécessaires pour décider si une stratégie multi‑boutiques est pertinente pour votre projet e‑commerce.

Peut-on avoir plusieurs boutiques Shopify avec un seul compte ?

Shopify permet de gérer plusieurs boutiques, même si, techniquement, chaque boutique reste une entité distincte avec son propre abonnement. Vous pouvez utiliser la même adresse e‑mail pour créer et administrer plusieurs boutiques, ce qui facilite la gestion au quotidien.

En pratique :

  • vous pouvez créer autant de boutiques « classiques » que vous le souhaitez, tant que vous payez un abonnement pour chacune d’elles ;
  • chaque boutique possède son administration indépendante (produits, thèmes, clients, commandes, apps, paramètres) ;
  • vous pouvez utiliser la même adresse e‑mail pour accéder à toutes vos boutiques, puis basculer de l’une à l’autre via l’interface Shopify.

Il n’existe pas de limite générale unique de Shopify au nombre de boutiques que vous pouvez posséder. La véritable limite est plutôt pratique : votre capacité à gérer efficacement toutes ces boutiques, vos ressources humaines, votre organisation et votre budget.

Comprendre le fonctionnement des abonnements multi‑boutiques

Shopify ne facture pas « par compte utilisateur » mais par boutique. Cela signifie que :

  • chaque boutique a son propre abonnement (Basic, Shopify, Advanced, ou un contrat spécifique type Shopify Plus) ;
  • les frais mensuels de chaque boutique sont facturés séparément ;
  • les frais de transaction, les commissions de paiement et les coûts d’applications sontégalement propres à chaque boutique.

Par conséquent, si vous exploitez plusieurs boutiques, vous devez intégrer dans vos calculs de rentabilité le coût récurrent de chaque boutique, ainsi que leséventuels coûts additionnels :

  • abonnement mensuel à Shopify ;
  • abonnements aux applications (apps) installées dans chaque boutique ;
  • frais de passerelles de paiement (Shopify Payments ou autres) ;
  • éventuels frais de thèmes et de développements sur mesure.

Pour les grandes entreprises ou les marques internationales, Shopify Plus propose un modèle différent qui inclut un certain nombre de boutiques dans la même licence, ce que nous détaillerons plus bas.

Concepts clés

Qu’est-ce qu’une boutique Shopify ?

Une boutique Shopify est un magasin en ligne complet hébergé sur la plateforme Shopify. Elle permet de vendre des produits ou services via un site web e‑commerce, des canaux sociaux, des marketplaces ou même des points de vente physiques (avec Shopify POS).

Chaque boutique inclut notamment :

  • un catalogue produits (fiches produits, variantes, prix, stocks) ;
  • un back‑office pour gérer commandes, clients, remises, codes promotionnels, contenu, etc. ;
  • un thème (design) avec des possibilités de personnalisation ;
  • des intégrations avec des applications (logistique, marketing, avis clients, comptabilité, etc.) ;
  • une gestion des paiements (Shopify Payments, PayPal, carte bancaire, etc.) et de la facturation.

Lorsque vous créez une seconde boutique, vous obtenez en réalité un deuxième environnement complet, isolé du premier. Les clients, les produits, les paramètres de taxes et de livraison ne sont pas partagés par défaut entre vos boutiques classiques, sauf si vous mettez en place des outils ou processus de synchronisation.

Pourquoi avoir plusieurs boutiques Shopify ?

Gérer plusieurs boutiques Shopify peutêtre une stratégie très pertinente dans plusieurs cas de figure :

  • Diversification des produits ou des marques : séparer des univers de produits très différents (par exemple, une marque de cosmétique naturelle et une marque d’accessoires high‑tech) dans des boutiques distinctes permet de clarifier le positionnement et l’image de chaque marque.
  • Segmentation des audiences : si vous visez des publics très différents (B2B/B2C, débutants/experts, jeunes/seniors), des boutiques séparées peuvent vous donner plus de liberté pour adapter ton, design, offres et messages marketing.
  • Expansion internationale : certaines entreprises choisissent de lancer une boutique par pays ou par région, avec langue, devise, moyens de paiement et conditions juridiques adaptés à chaque marché.
  • Organisation interne : pour des groupes ou holdings, il peutêtre plus simple de séparer les activités en plusieurs boutiques correspondant à des entités juridiques différentes, notamment pour la comptabilité, la fiscalité ou la gestion des stocks.
  • Tests et optimisation : créer une boutique « test » pour expérimenter un nouveau concept, un nouveau design ou une nouvelle gamme de produits sans impacter votre boutique principale.

Types de configurations possibles avec plusieurs boutiques

Lorsque vous commencez à multiplier les boutiques Shopify, plusieurs configurations sont possibles. Il est important de comprendre qu’il ne s’agit pas de « sous‑boutiques » techniques au sens strict, mais bien de boutiques distinctes, que vous pouvez organiser de manière stratégique.

  • Boutiques indépendantes : chaque boutique a son propre domaine (ou sous‑domaine), sa propre identité visuelle, son propre catalogue, sa base clients, ses paramètres et ses apps. C’est la configuration la plus courante pour séparer des marques ou des pays.
  • Boutiques par pays ou région : vous créez une boutique pour la France, une autre pour la Belgique, une pour le Canada, etc., chacune avec ses propres devises, taxes, modes de livraison et langues dominantes.
  • Boutiques par typologie de clients : une boutique grand public (B2C) et une boutique réservée aux professionnels (B2B), avec des catalogues, des remises et des conditions de paiement différents.
  • Boutiques de test ou de pré‑lancement : une boutique réservée à voséquipes internes, ou à un cercle restreint de testeurs, pour valider produits, ergonomie et tunnel de commande avant un déploiement à grandeéchelle.

On parle parfois de « boutique principale avec sous‑boutiques » d’un point de vue stratégique, mais techniquement, chaque boutique reste un back‑office séparé. Il n’existe pas, dans la version standard de Shopify, de hiérarchie native entre une boutique « parente » et des « enfants » au sens d’une arborescence technique unique.

Limites et possibilités : combien de boutiques Shopify peut-on avoir ?

Pour un marchand qui utilise les offres classiques de Shopify (Basic, Shopify, Advanced), il n’existe pas de limite stricte fixée à un très petit nombre de boutiques. Vous pouvez exploiter plusieurs boutiques tant que vous souscrivez à un abonnement pour chacune et que vousêtes capable de les gérer.

Certains prestataires ou ressources parlent de limites trèsélevées (comme plusieurs centaines de boutiques possibles avec la même adresse e‑mail). Dans la pratique, la majorité des entreprises se situe dans une fourchette bien plus raisonnable, souvent entre 2 et 10 boutiques, car au‑del à, la gestion opérationnelle devient complexe sans outils adaptés.

Pour les entreprises qui ont des besoins avancés en matière de multi‑boutiques, Shopify Plus apporte des fonctionnalités et une structure tarifaire spécifiques, notamment :

  • un nombre de boutiques incluses dans la licence ;
  • des possibilités de clonage de boutique pour déployer rapidement un nouveau site à partir d’un modèle existant ;
  • une gestion plus avancée de l’international, des langues et des catalogues.

Shopify Plus et la gestion multi‑boutiques avancée

Shopify Plus est l’offre destinée aux entreprises à fort volume, aux grandes marques et aux groupes qui ont des besoins de personnalisation, de performance et de multi‑canal plus poussés. Dans ce cadre, la gestion multi‑boutiques est souvent au cœur de la stratégie.

Une licence Shopify Plus inclut généralement jusqu’à 10 boutiques dans le même contrat, ce qui permet :

  • de créer plusieurs déclinaisons de la même marque pour différents pays ou segments de clientèle ;
  • d’avoir une boutique dédiée aux tests ou aux lancements privés ;
  • de simplifier la relation contractuelle avec Shopify, avec une facturation globale.

Au‑del à des boutiques incluses dans la licence, il est possible d’ajouter des boutiques supplémentaires moyennant un coût mensuel additionnel par boutique. Cela reste cependant réservé aux projets dont le volume d’affaires justifie ce type d’infrastructure.

Il est important de noter que, même dans Shopify Plus, chaque boutique reste séparée au niveau opérationnel : vous disposez d’instances distinctes, avec leurs propres paramètres, même si vous pouvez mutualiser certainséléments et automatiser de nombreux flux grâce à des outils avancés (API, applications, middleware, etc.).

Bonnes pratiques pour gérer plusieurs boutiques Shopify

Optimiser le contenu de chaque boutique

Lorsque vous gérez plusieurs boutiques Shopify, l’optimisation du contenu est essentielle pouréviter la confusion, maximiser l’expérience utilisateur et améliorer votre référencement naturel (SEO).

  • Contenu unique par boutique : évitez de copier‑coller exactement les mêmes textes (descriptions, pages, articles de blog) d’une boutique à l’autre. Adaptez le contenu à la langue, au marché, à l’intention de recherche et au positionnement.
  • Optimisation SEO spécifique : définissez pour chaque boutique une stratégie de mots‑clés distincte (par pays, langue, segment, problème client). Optimisez les balises </code>, les méta‑descriptions, les titres <code><h1></code> à <code><h3 id="les-url-et-le-maillage-interne-en-fonction-des-requetes-cibles-de-chaque-marche-adaptation-culturell"></code>, les URL et le maillage interne en fonction des requêtes cibles de chaque marché.</li> <li><strong>Adaptation culturelle et linguistique</strong> : pour une boutique française, le ton, les références culturelles et les exemples doiventêtre différents de ceux d’une boutique canadienne francophone ou d’une boutique en anglais. Le simple fait de traduire mot à mot n’est pas suffisant.</li> <li><strong>Mise à jour régulière</strong> : mettez à jour fréquemment les fiches produits, les pages catégories et le blog pour refléter les nouveautés, les saisons, les promotions et l’actualité de la marque.</li> </ul> <h3>Améliorer la structure de chaque boutique</h3> <p>La structure de vos boutiques influence directement les performances SEO et le taux de conversion. Avec plusieurs boutiques, l’enjeu est encore plus fort, car une mauvaise organisation se répercute en chaîne.</p> <ul> <li><strong>Navigation intuitive</strong> : chaque boutique doit proposer un menu clair, des filtres pertinents et un chemin d’accès rapide aux produits. Évitez les arborescences trop profondes ou trop complexes.</li> <li><strong>Catégories logiques</strong> : structurez vos produits en catégories et sous‑catégories cohérentes pour chaque marché. Un même produit peutêtre rangé différemment selon la culture ou la manière dont les clients recherchent l’information.</li> <li><strong>Pages de confiance</strong> : pour chaque boutique, créez des pages solides sur la livraison, les retours, les garanties, les conditions générales de vente et la politique de confidentialité. Adaptez‑les si nécessaire à la réglementation locale.</li> <li><strong>Tunnel de commande optimisé</strong> : testez régulièrement le processus d’achat sur chacune de vos boutiques pour repérer les frictions (moyens de paiement, champs de formulaire, messages d’erreur, performance mobile).</li> </ul> <h3 id="creer-du-contenu-de-qualite-pour-chaque-boutique">Créer du contenu de qualité pour chaque boutique</h3> <p>Le contenu reste un levier puissant pour se distinguer, en particulier lorsque vous gérez plusieurs boutiques dans un même secteur ou sur des marchés proches.</p> <ul> <li><strong>Descriptions produit détaillées</strong> : rédigez des fiches complètes, claires et orientées bénéfices clients, tout en intégrant naturellement vos mots‑clés principaux et secondaires.</li> <li><strong>Images haute qualité</strong> : utilisez des visuels cohérents avec l’identité de la boutique (ambiance, couleur, style). Pensez à compresser les images pour préserver la vitesse de chargement.</li> <li><strong>Vidéos et démonstrations</strong> : lorsque c’est pertinent, ajoutez des vidéos de démonstration, des tutoriels ou des témoignages clients adaptés à la langue et au marché ciblé par la boutique.</li> <li><strong>Contenuéditorial</strong> : un blog, des guides d’achat, des comparatifs ou des fiches conseils spécifiques à chaque boutique renforcent l’autorité de la marque et améliorent le SEO.</li> </ul> <h3 id="gestion-d-inventaire-avec-plusieurs-boutiques">Gestion d’inventaire avec plusieurs boutiques</h3> <p>La gestion des stocks devient rapidement un enjeu majeur dès que vous exploitez plusieurs boutiques Shopify, surtout si certaines références sont partagées entre plusieurs sites.</p> <ul> <li><strong>Synchronisation des stocks</strong> : mettez en place des outils de gestion d’inventaire capables de synchroniser vos stocks entre boutiques lorsque vous vendez les mêmes produits sur plusieurs sites. Celaévite les surventes et les ruptures.</li> <li><strong>Alertes de stock</strong> : configurez des alertes internes en cas de seuil critique pour anticiper les réapprovisionnements, surtout si plusieurs boutiques consomment le même stock physique.</li> <li><strong>Emplacements multiples</strong> : utilisez les fonctionnalités d’emplacements (entrepôts, magasins physiques, centres logistiques) pour suivre précisément la disponibilité des produits par zone géographique.</li> <li><strong>Organisation logistique</strong> : définissez clairement, pour chaque boutique, les entrepôts et transporteurs utilisés, ainsi que les délais de livraison affichés aux clients.</li> </ul> <h2 id="organisation-equipe-et-processus-avec-plusieurs-boutiques">Organisation, équipe et processus avec plusieurs boutiques</h2> <p>Au‑del à de la technique, la clé d’une stratégie multi‑boutiques réussie réside dans l’<strong>organisation interne</strong> et des processus clairs.</p> <ul> <li><strong>Rôles et permissions</strong> : attribuez des rôles précis aux membres de votreéquipe sur chaque boutique (gestion produits, service client, marketing, développement). Shopify permet de créer des comptes collaborateurs avec des droits spécifiques.</li> <li><strong>Procédures documentées</strong> : formalisez des procédures pour la création de produits, la mise en ligne de nouvelles collections, la gestion des promotions et le traitement des retours, afin de garder une cohérence entre les boutiques.</li> <li><strong>Calendrierséditoriaux</strong> : planifiez vos lancements, campagnes marketing et mises à jour de contenu pour chaque boutique, en tenant compte des saisons, jours fériés etévénements locaux.</li> <li><strong>Suivi des performances</strong> : analysez séparément les indicateurs clés (trafic, taux de conversion, panier moyen, récurrence d’achat) de chaque boutique. Évitez de mélanger les données, au risque de perdre en lisibilité.</li> </ul> <h2 id="seo-et-multi-boutiques-shopify">SEO et multi‑boutiques Shopify</h2> <p>Le fait d’avoir plusieurs boutiques a un impact direct sur votre stratégie SEO. Mal géré, cela peut diluer votre autorité ou créer des problèmes de contenu dupliqué. Bien géré, cela permet d’<strong>occuper plus d’espace dans les résultats de recherche</strong> et d’adresser précisément chaque marché.</p> <p>Points à surveiller :</p> <ul> <li><strong>Canibalisation entre boutiques</strong> : si deux de vos boutiques ciblent la même langue, le même pays et les mêmes mots‑clés, elles risquent de se concurrencer dans les résultats de recherche.</li> <li><strong>Localisation du site</strong> : utilisez des domaines ou sous‑domaines cohérents avec chaque marché (par exemple, un domaine en <code>.fr</code> pour la France, un <code>.com</code> plus global, etc.).</li> <li><strong>Structure des liens</strong> : soignez vos liens internes au sein de chaque boutique et, si pertinent, créez des liens entre vos boutiques en expliquant clairement leurs différences (par exemple, liens vers une boutique B2B depuis une boutique B2C).</li> <li><strong>Performances techniques</strong> : optimisez la vitesse de chargement, la compatibilité mobile et l’accessibilité de chacune de vos boutiques. Ces critères sont de plus en plus importants pour le SEO.</li> </ul> <h2 id="couts-et-rentabilite-d-un-ecosysteme-multi-boutiques">Coûts et rentabilité d’unécosystème multi‑boutiques</h2> <p>Multiplier les boutiques Shopify augmente mécaniquement vos <strong>coûts fixes</strong>. Avant de créer une nouvelle boutique, évaluez précisément :</p> <ul> <li>le coût mensuel de l’abonnement Shopify pour la nouvelle boutique ;</li> <li>leséventuels coûts d’applications supplémentaires nécessaires (traduction, synchronisation de stocks, avis clients, etc.) ;</li> <li>le temps homme pour la gestion quotidienne (service client, ajout de produits, préparation des commandes) ;</li> <li>les dépenses marketing (publicités, influence, SEO, contenu) propres à cette nouvelle boutique.</li> </ul> <p>Une boutique supplémentaire a du sens si elle permet :</p> <ul> <li>d’<strong>augmenter significativement votre chiffre d’affaires</strong> (nouveau pays, nouvelle marque, nouveau segment) ;</li> <li>d’<strong>améliorer votre marge</strong> en ciblant mieux un public prêt à payer plus cher ;</li> <li>de <strong>réduire le risque</strong> en diversifiant vos canaux et marchés.</li> </ul> <h2 id="questions-frequentes-sur-les-multiples-boutiques-shopify">Questions fréquentes sur les multiples boutiques Shopify</h2> <h3 id="peut-on-utiliser-la-meme-adresse-e-mail-pour-plusieurs-boutiques-shopify-nbsp">Peut-on utiliser la même adresse e‑mail pour plusieurs boutiques Shopify ?</h3> <p>Oui. Vous pouvez utiliser la <strong>même adresse e‑mail</strong> pour créer et administrer plusieurs boutiques Shopify. C’est même une pratique répandue chez les entrepreneurs qui gèrent plusieurs projets. Vous pourrez ensuite basculer d’une boutique à l’autre depuis l’interface d’administration Shopify.</p> <h3 id="y-a-t-il-une-limite-au-nombre-de-boutiques-que-l-on-peut-posseder-nbsp">Y a‑t‑il une limite au nombre de boutiques que l’on peut posséder ?</h3> <p>Il n’existe pas de limite unique très basse imposée par Shopify à tous les marchands. En pratique, vous pouvez créer plusieurs boutiques, chacune avec son propre abonnement. Pour les très grands comptes, Shopify Plus propose une licence incluant plusieurs boutiques, avec la possibilité d’en ajouter d’autres moyennant un coût supplémentaire.</p> <p>La véritable limite vient surtout de votre <strong>capacité de gestion</strong> : plus vous avez de boutiques, plus la coordination (contenu, stocks, marketing, service client) devient complexe.</p> <h3 id="dois-je-creer-une-nouvelle-boutique-ou-simplement-ajouter-des-langues-et-des-marches-nbsp">Dois‑je créer une nouvelle boutique ou simplement ajouter des langues et des marchés ?</h3> <p>Shopify propose aujourd’hui des fonctionnalités avancées pour gérer <strong>plusieurs marchés dans une seule boutique</strong> (langues, devises, règles de prix par marché). Dans certains cas, une seule boutique multilingue et multi‑marchés peut suffire etêtre plus simple à gérer.</p> <p>La création d’une boutique entièrement distincte est généralement justifiée lorsque :</p> <ul> <li>vous lancez une <strong>marque différente</strong> ;</li> <li>vous avez besoin de <strong>catalogues produits très différents</strong> ;</li> <li>vous devez séparer <strong>les entités juridiques</strong> (par exemple, une filiale par pays) ;</li> <li>vous souhaitez un <strong>positionnement, un design ou une stratégie marketing radicalement distincts</strong>.</li> </ul> <h3 id="comment-gerer-la-tva-les-taxes-et-la-conformite-avec-plusieurs-boutiques-nbsp">Comment gérer la TVA, les taxes et la conformité avec plusieurs boutiques ?</h3> <p>Chaque boutique Shopify possède ses propres paramètres de <strong>taxes</strong>, ce qui vous permet d’adapter la configuration à la législation locale de chaque pays ou région. Lorsque vos boutiques correspondent à des entités juridiques différentes, cela faciliteégalement la séparation de la comptabilité.</p> <p>En revanche, cette flexibilité implique d’être particulièrement rigoureux sur :</p> <ul> <li>la configuration des taux de TVA ou taxes locales dans chaque boutique ;</li> <li>la génération et l’archivage des factures ;</li> <li>la remontée des données vers votre outil comptable ou votre expert‑comptable.</li> </ul> <h3 id="puis-je-dupliquer-une-boutique-shopify-pour-en-creer-une-nouvelle-nbsp">Puis-je dupliquer une boutique Shopify pour en créer une nouvelle ?</h3> <p>Il est possible de <strong>cloner partiellement</strong> une boutique Shopify pour accélérer la création d’une nouvelle boutique : exporter/importer le catalogue produits, réutiliser un thème, reprendre certaines structures de pages, etc. Certaines applications ou services d’intégrateurs facilitent ces duplications.</p> <p>Sur Shopify Plus, la duplication de boutiques est encore plus poussée grâce à des outils et des flux dédiés, ce qui permet de déployer rapidement de nouveaux sites pour d’autres marchés ou d’autres déclinaisons de la même marque.</p> <h2 id="quand-est-il-pertinent-d-ouvrir-plusieurs-boutiques-shopify-nbsp">Quand est-il pertinent d’ouvrir plusieurs boutiques Shopify ?</h2> <p>Ouvrir une nouvelle boutique ne doit pasêtre une décision prise à la légère. Avant de multiplier les sites, posez‑vous ces questions :</p> <ul> <li>Mon <strong>catalogue</strong> est‑il suffisamment différent pour justifier une boutique séparée ?</li> <li>Mon <strong>public cible</strong> est‑il distinct (langue, attentes, pouvoir d’achat, culture) ?</li> <li>Monéquipe a‑t‑elle la <strong>capacité de gestion</strong> (temps, compétences, budget) pour une boutique supplémentaire ?</li> <li>Cette boutique peut‑elle générer un <strong>chiffre d’affaires additionnel significatif</strong> ou une meilleure marge ?</li> </ul> <p>Dans de nombreux cas, il est plus judicieux de <strong>consolider et optimiser</strong> une première boutique (amélioration SEO, optimisation du taux de conversion, extension du catalogue, meilleure logistique) avant de se lancer dans une stratégie multi‑boutiques.</p> <h2 id="conclusion-pratique">Conclusion pratique</h2> <p>Oui, vous pouvez tout à fait avoir <strong>plusieurs boutiques Shopify</strong> avec la même adresse e‑mail et au sein d’un mêmeécosystème d’entreprise. Chaque boutique est cependant associée à son propre abonnement, à ses propres paramètres et à ses propres coûts. Pour les entreprises plus avancées, Shopify Plus offre des fonctionnalités et une structure tarifaire adaptées à une gestion multi‑boutiques à grandeéchelle.</p> <p>La clé du succès ne réside pas seulement dans la possibilité technique, mais dans la <strong>stratégie</strong>, l’<strong>organisation</strong> et la <strong>rentabilité</strong> de chaque boutique. Avant de multiplier les sites, définissez clairement vos objectifs, vos marchés cibles et vos ressources, puis construisez pas à pas unécosystème Shopify cohérent, performant et durable.</p> </div> <!-- Articles similaires --> <div class="mt-12 pt-8 border-t border-gray-200"> <h2 class="text-2xl font-bold text-gray-900 mb-6 flex items-center gap-2"> <i class="fas fa-newspaper text-purple-600"></i> Articles similaires </h2> <div class="grid gap-4"> <a href="/blog/comment-avoir-plusieurs-boutiques-shopify/" class="block p-4 bg-white rounded-lg border border-gray-200 hover:border-purple-300 hover:shadow-md transition"> <span class="text-purple-600 font-semibold hover:text-purple-800">Comment avoir plusieurs boutiques Shopify</span> </a> <a href="/blog/combien-de-boutiques-par-compte-shopify-guide-complet-2025/" class="block p-4 bg-white rounded-lg border border-gray-200 hover:border-purple-300 hover:shadow-md transition"> <span class="text-purple-600 font-semibold hover:text-purple-800">Combien de boutiques par compte Shopify&nbsp;? Guide complet 2025</span> </a> <a href="/blog/que-peut-on-vendre-sur-shopify-guide-complet-2025/" class="block p-4 bg-white rounded-lg border border-gray-200 hover:border-purple-300 hover:shadow-md transition"> <span class="text-purple-600 font-semibold hover:text-purple-800">Que peut-on vendre sur Shopify ? Guide Complet 2025</span> </a> </div> </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="peut-on-avoir-plusieurs-boutiques-shopify"> <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 = 'peut-on-avoir-plusieurs-boutiques-shopify'; // 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>