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 :
- 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.
- Via les invitations : lors de l'envoi d'une invitation, vous pouvez définir l'établissement. L'avis est alors attribué automatiquement.
- Via l'API : transmettez le
locationIdlors 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 :
{
"name": "Boutique en ligne FR",
"slug": "shop-fr",
"domain": "https://www.ma-boutique.fr",
"language": "fr"
}Créer un avis attribué à un établissement :
{
"companyId": "...",
"locationId": "clx...",
"rating": 5,
"content": "Service excellent !",
"reviewerName": "Jean Dupont"
}Filtrer les avis par établissement :
// Renvoie uniquement les avis de l'établissement indiqué
// Sans locationId, tous les avis sont renvoyésCréer un widget avec filtre d'établissement :
{
"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é)
- Attribut
data-langsur le conteneur du widget (explicite) - Champ
localedans la configuration du widget (tableau de bord) document.documentElement.lang(langue HTML de la page)- 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 :
<!-- 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 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
{# 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.
<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.
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
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ètre | Obligatoire | Description |
|---|---|---|
| Oui | Adresse e-mail du client | |
| customerName | Oui | Nom du client |
| orderId | Non | Numéro de commande (pour l'association) |
| locale | Non | Langue de l'e-mail (de/en/fr/es/it) |
| locationId | Non | ID de l'établissement pour l'attribution |
| delayDays | Non | Délai en jours (0 = immédiat, par défaut : 7) |
Invitations groupées (jusqu'à 100 à la fois)
{
"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
- Le client reçoit un e-mail personnalisé avec un lien vers l'avis
- Le lien ouvre votre page d'avis avec le nom prérempli
- L'avis est automatiquement marqué comme vérifié (sans captcha)
- Le jeton ne peut être utilisé qu'une seule fois
Lister les invitations
// Status: PENDING, SENT, OPENED, COMPLETED, EXPIREDWebhooks 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énement | Description |
|---|---|
| review.created | Nouvel avis soumis |
| review.approved | Avis approuvé |
| review.rejected | Avis refusé |
| invitation.sent | Invitation envoyée |
| invitation.completed | Invitation terminée (avis soumis) |
Créer un webhook
{
"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
// 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
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 endpointsPATCH /api/webhooks/outgoing— Modifier l'URL, les événements ou le statutDELETE /api/webhooks/outgoing?id=...— Supprimer un endpoint
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)
- Dans l'administration Shopware, allez dans Paramètres → Flow Builder
- Créez un nouveau flow avec le déclencheur
Order placedouOrder status changed → Completed - Ajoutez une action Send HTTP request
- Méthode :
POST - URL : votre URL de webhook (voir les paramètres d'intégration)
- 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 :
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
locationIddans 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
{# 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.