Documentation

Guides techniques pour votre intégration – multicanal, widgets, API et Shopware.

Multicanal / Établissements

Grâce à la fonction établissements, vous pouvez collecter et analyser les avis séparément par agence, canal de vente ou région. Chaque établissement possède son propre nom, un slug, un domaine facultatif et une langue par défaut.

Limites par formule : FREE = 1 établissement, STARTER = 2, PRO = 10, ENTERPRISE = 100

Quand utiliser les établissements ?

Les établissements sont idéaux si vous :

  • exploitez plusieurs agences ou succursales
  • avez plusieurs boutiques en ligne ou domaines
  • souhaitez séparer les avis par région ou par service
  • souhaitez intégrer un widget distinct par établissement sur le site correspondant

Gérer les établissements

Sous Paramètres → Établissements, vous pouvez créer, modifier et supprimer des établissements.

  • Nom : nom affiché (p. ex. « Agence Lyon Centre »)
  • Slug : identifiant unique, généré automatiquement à partir du nom
  • Domaine : facultatif – l'URL du site de l'établissement
  • Langue : langue par défaut de cet établissement
  • Établissement par défaut : l'établissement marqué par défaut est utilisé pour les nouveaux avis sans attribution explicite

Lorsque vous supprimez un établissement, tous les avis associés sont conservés – ils perdent seulement leur attribution.

Comment les avis sont-ils attribués à un établissement ?

Il existe trois façons :

  1. Automatiquement via le formulaire d'avis : si votre entreprise a plusieurs établissements, une liste « Quel établissement souhaitez-vous évaluer ? » apparaît sur la page de profil – le client choisit lui-même.
  2. Via les invitations : lors de l'envoi d'une invitation, vous pouvez définir l'établissement. L'avis est alors attribué automatiquement.
  3. Via l'API : transmettez le locationId lors de la création d'un avis.

Widgets par établissement

Dans l'éditeur de widgets, sous Paramètres → Filtre d'établissement, vous pouvez limiter un widget à un établissement précis. Le widget n'affiche alors que les avis de cet établissement.

Par exemple, le site de votre agence de Lyon peut n'afficher que les avis de Lyon, et celui de Marseille uniquement ceux de Marseille.

Référence API

Créer un établissement :

POST /api/locations
{
  "name": "Boutique en ligne FR",
  "slug": "shop-fr",
  "domain": "https://www.ma-boutique.fr",
  "language": "fr"
}

Créer un avis attribué à un établissement :

POST /api/reviews
{
  "companyId": "...",
  "locationId": "clx...",
  "rating": 5,
  "content": "Service excellent !",
  "reviewerName": "Jean Dupont"
}

Filtrer les avis par établissement :

GET /api/reviews?companyId=...&locationId=...
// Renvoie uniquement les avis de l'établissement indiqué
// Sans locationId, tous les avis sont renvoyés

Créer un widget avec filtre d'établissement :

POST /api/widget
{
  "companyId": "...",
  "locationId": "clx...",
  "name": "Widget agence Lyon",
  "type": "CAROUSEL",
  "config": { "maxReviews": 5 }
}

Widgets multilingues

Le widget intégré prend en charge 5 langues : Deutsch, English, Français, Español et Italiano. Tous les textes de l'interface (boutons, indications de temps, champs de formulaire) s'affichent automatiquement dans la langue détectée.

Détection de la langue (priorité)

  1. Attribut data-lang sur le conteneur du widget (explicite)
  2. Champ locale dans la configuration du widget (tableau de bord)
  3. document.documentElement.lang (langue HTML de la page)
  4. Valeur par défaut : de

Option 1 : explicitement via un attribut HTML

Idéal pour les boutiques multilingues où la langue de chaque page est connue :

HTML
<!-- Widget allemand -->
<div data-zoom-widget="WIDGET_ID" data-lang="de"></div>

<!-- Widget anglais -->
<div data-zoom-widget="WIDGET_ID" data-lang="en"></div>

<!-- Widget français -->
<div data-zoom-widget="WIDGET_ID" data-lang="fr"></div>

<script src="https://zoom.reviews/widget.js" async></script>

Option 2 : automatiquement via la langue de la boutique

Si le template de votre boutique définit correctement l'attribut lang sur la balise <html>, le widget détecte la langue automatiquement :

HTML
<html lang="fr">
  ...
  <div data-zoom-widget="WIDGET_ID"></div>
  <script src="https://zoom.reviews/widget.js" async></script>
</html>

Option 3 : via la configuration du tableau de bord

Sous Widgets → Modifier → Paramètres, vous pouvez définir une langue fixe par widget. C'est utile si vous créez un widget distinct pour chaque boutique ou canal linguistique.

Exemple Shopware / Twig

Twig (Shopware 6)
{# Dans votre template de thème #}
<div data-zoom-widget="WIDGET_ID" 
     data-lang="{{ app.request.locale[:2] }}"></div>
<script src="https://zoom.reviews/widget.js" async></script>

Contrôle d'intégrité (SRI)

Si vos règles de sécurité l'exigent, vous pouvez intégrer une version fixe avec Subresource Integrity au lieu du widget.js qui se met à jour automatiquement. Avant de l'exécuter, le navigateur vérifie alors par hachage que le script correspond exactement à la version publiée, et le bloque sinon.

HTML
<div data-zoom-widget="WIDGET_ID"></div>
<script src="https://zoom.reviews/widget/v1.js"
        integrity="sha384-b+jQQNJZZso+gHv6OrEFQWf3CnUlnPR95LwStglzZ9EDIhLlhwIEMunoVr+X1GKT"
        crossorigin="anonymous" async></script>

Les versions fixes ne reçoivent ni mises à jour automatiques ni correctifs. Lorsque nous publions une nouvelle version, vous devez remplacer le snippet vous-même. Nous vous informons par e-mail de chaque changement afin que vous puissiez remplacer le snippet à temps. Le snippet actuel se trouve toujours sous Widgets → Code d'intégration.

Disponible à partir de Pro

Invitations à laisser un avis (après achat)

Envoyez automatiquement des invitations à laisser un avis à vos clients après leur achat. Les e-mails sont multilingues (DE/EN/FR/ES/IT) et contiennent un lien personnalisé.

Disponible à partir de : formule Pro (100 invitations/jour) · Enterprise (1 000 invitations/jour)

Créer une invitation

POST /api/review-invitations
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json

{
  "email": "client@example.com",
  "customerName": "Jean Dupont",
  "orderId": "ORD-10042",
  "orderDate": "2026-07-28T14:30:00Z",
  "locale": "fr",
  "locationId": "clx...",
  "delayDays": 7
}
ParamètreObligatoireDescription
emailOuiAdresse e-mail du client
customerNameOuiNom du client
orderIdNonNuméro de commande (pour l'association)
localeNonLangue de l'e-mail (de/en/fr/es/it)
locationIdNonID de l'établissement pour l'attribution
delayDaysNonDélai en jours (0 = immédiat, par défaut : 7)

Invitations groupées (jusqu'à 100 à la fois)

POST /api/review-invitations
{
  "invitations": [
    { "email": "a@example.com", "customerName": "Anna", "locale": "de" },
    { "email": "b@example.com", "customerName": "Bob", "locale": "en" },
    { "email": "c@example.com", "customerName": "Claire", "locale": "fr" }
  ]
}

Déroulement pour le client

  1. Le client reçoit un e-mail personnalisé avec un lien vers l'avis
  2. Le lien ouvre votre page d'avis avec le nom prérempli
  3. L'avis est automatiquement marqué comme vérifié (sans captcha)
  4. Le jeton ne peut être utilisé qu'une seule fois

Lister les invitations

GET /api/review-invitations?status=SENT&page=1
// Status: PENDING, SENT, OPENED, COMPLETED, EXPIRED
Disponible à partir de Enterprise

Webhooks sortants

Recevez des notifications en temps réel sur les nouveaux avis et invitations. Les webhooks sont signés avec HMAC-SHA256.

Formule Enterprise uniquement. Jusqu'à 10 endpoints webhook par entreprise.

Événements disponibles

ÉvénementDescription
review.createdNouvel avis soumis
review.approvedAvis approuvé
review.rejectedAvis refusé
invitation.sentInvitation envoyée
invitation.completedInvitation terminée (avis soumis)

Créer un webhook

POST /api/webhooks/outgoing
{
  "url": "https://your-server.com/webhooks/zoom-reviews",
  "events": ["review.created", "review.approved"]
}

La réponse contient un secret (affiché une seule fois !) qui sert à vérifier la signature.

Format du payload

POST vers votre URL
// Headers:
// X-Webhook-Signature: <HMAC-SHA256 of body>
// X-Webhook-Event: review.created
// X-Webhook-Timestamp: 2026-07-29T18:30:00.000Z

{
  "event": "review.created",
  "data": {
    "id": "clx...",
    "rating": 5,
    "reviewerName": "Jean Dupont",
    "source": "WIDGET",
    "locationId": "clx..."
  },
  "timestamp": "2026-07-29T18:30:00.000Z"
}

Vérifier la signature

Node.js
const crypto = require('crypto');

function verifyWebhook(body, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(body)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signature)
  );
}

Gestion

Sous Paramètres → Webhooks (bientôt disponible) ou via l'API :

  • GET /api/webhooks/outgoing — Lister tous les endpoints
  • PATCH /api/webhooks/outgoing — Modifier l'URL, les événements ou le statut
  • DELETE /api/webhooks/outgoing?id=... — Supprimer un endpoint
Disponible à partir de Pro

Intégration Shopware 6

Invitations automatiques à laisser un avis après la finalisation d'une commande dans votre boutique Shopware 6. L'intégration détecte automatiquement la langue de la commande et le canal de vente.

Aperçu

Étape 1

Configurer l'URL du webhook dans Shopware

Étape 2

Choisir un événement du Flow Builder

Étape 3

Régler le délai et la langue

Méthode A : Shopware Flow Builder (recommandée)

  1. Dans l'administration Shopware, allez dans Paramètres → Flow Builder
  2. Créez un nouveau flow avec le déclencheur Order placed ou Order status changed → Completed
  3. Ajoutez une action Send HTTP request
  4. Méthode : POST
  5. URL : votre URL de webhook (voir les paramètres d'intégration)
  6. Content-Type : application/json

Méthode B : appeler directement l'API REST

Vous pouvez aussi appeler directement l'API d'invitations depuis un plugin personnalisé ou une app :

POST /api/review-invitations
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json

{
  "email": "{{ order.orderCustomer.email }}",
  "customerName": "{{ order.orderCustomer.firstName }} {{ order.orderCustomer.lastName }}",
  "orderId": "{{ order.orderNumber }}",
  "locale": "fr",
  "delayDays": 7
}

Multiboutique / multicanal

Si vous exploitez plusieurs canaux de vente Shopware :

  • Créez dans Zoom.Reviews un établissement par canal de vente
  • Transmettez le locationId dans la requête API
  • Les avis sont alors collectés séparément et affichés par canal

Détection de la langue

L'intégration Shopware détecte automatiquement la langue de la commande à partir du champ locale. Langues prises en charge : de, en, fr, es, it. À défaut, la langue par défaut configurée est utilisée.

Intégrer le widget dans le thème Shopware

Template Twig (p. ex. footer.html.twig)
{# Widget avec détection automatique de la langue #}
<div data-zoom-widget="WIDGET_ID" 
     data-lang="{{ app.request.locale[:2] }}">
</div>
<script src="https://zoom.reviews/widget.js" async></script>

Astuce : créez un widget distinct avec le locationId correspondant pour chaque canal de vente. Ainsi, chaque boutique n'affiche que ses propres avis.

Prêt pour l'intégration ?

Commencez gratuitement et intégrez vos premiers avis en quelques minutes.

Commencer gratuitement