Dokumentation
Technische Anleitungen für deine Integration – Multi-Channel, Widgets, API und Shopware.
Multi-Channel / Standorte
Mit der Standort-Funktion kannst du Bewertungen getrennt nach Filiale, Verkaufskanal oder Region sammeln und auswerten. Jeder Standort hat einen eigenen Namen, Slug, eine optionale Domain und eine Standardsprache.
Plan-Limits: FREE = 1 Standort, STARTER = 2, PRO = 10, ENTERPRISE = 100
Wann Standorte nutzen?
Standorte sind ideal, wenn du:
- mehrere Filialen oder Niederlassungen betreibst
- verschiedene Online-Shops oder Domains hast
- Bewertungen nach Region oder Abteilung trennen möchtest
- pro Standort ein eigenes Widget auf der jeweiligen Website einbetten möchtest
Standorte verwalten
Unter Einstellungen → Standorte kannst du Standorte anlegen, bearbeiten und löschen.
- Name: Anzeigename (z.B. „Filiale Berlin Mitte“)
- Slug: Eindeutige Kennung, wird automatisch aus dem Namen generiert
- Domain: Optional – die Website-URL des Standorts
- Sprache: Standardsprache für diesen Standort
- Standard-Standort: Der als Standard markierte Standort wird bei neuen Reviews ohne explizite Zuordnung verwendet
Beim Löschen eines Standorts bleiben alle zugeordneten Bewertungen erhalten – sie verlieren lediglich die Standort-Zuordnung.
Wie werden Bewertungen einem Standort zugeordnet?
Es gibt drei Wege:
- Automatisch über das Bewertungsformular: Hat dein Unternehmen mehrere Standorte, erscheint auf der Profilseite ein Dropdown „Welchen Standort möchtest du bewerten?“ – der Kunde wählt den Standort selbst aus.
- Über Review-Einladungen: Beim Versenden einer Einladung kannst du den Standort festlegen. Die Bewertung wird dann automatisch zugeordnet.
- Per API: Übergib beim Erstellen eines Reviews die
locationId.
Widgets pro Standort
Im Widget-Builder unter Einstellungen → Standort-Filter kannst du ein Widget auf einen bestimmten Standort beschränken. Das Widget zeigt dann ausschließlich Bewertungen dieses Standorts an.
So kannst du z.B. auf der Website deiner Berliner Filiale nur die Berliner Bewertungen anzeigen und auf der Münchener Seite nur die Münchener.
API-Referenz
Standort erstellen:
{
"name": "Online-Shop DE",
"slug": "shop-de",
"domain": "https://www.mein-shop.de",
"language": "de"
}Review mit Standort-Zuordnung erstellen:
{
"companyId": "...",
"locationId": "clx...",
"rating": 5,
"content": "Toller Service!",
"reviewerName": "Max Mustermann"
}Reviews nach Standort filtern:
// Liefert nur Reviews des angegebenen Standorts
// Ohne locationId werden alle Reviews zurückgegebenWidget mit Standort-Filter erstellen:
{
"companyId": "...",
"locationId": "clx...",
"name": "Widget Filiale Berlin",
"type": "CAROUSEL",
"config": { "maxReviews": 5 }
}Widget-Mehrsprachigkeit
Das eingebettete Widget unterstützt 5 Sprachen: Deutsch, English, Français, Español und Italiano. Alle UI-Texte (Buttons, Zeitangaben, Formularfelder) werden automatisch in der erkannten Sprache angezeigt.
Sprach-Erkennung (Priorität)
data-lang-Attribut am Widget-Container (explizit)locale-Feld in der Widget-Konfiguration (Dashboard)document.documentElement.lang(HTML-Sprache der Seite)- Fallback:
de
Variante 1: Explizit per HTML-Attribut
Ideal für mehrsprachige Shops, wo die Sprache pro Seite bekannt ist:
<!-- Deutsches Widget -->
<div data-zoom-widget="WIDGET_ID" data-lang="de"></div>
<!-- Englisches Widget -->
<div data-zoom-widget="WIDGET_ID" data-lang="en"></div>
<!-- Französisches Widget -->
<div data-zoom-widget="WIDGET_ID" data-lang="fr"></div>
<script src="https://zoom.reviews/widget.js" async></script>Variante 2: Automatisch per Shop-Sprache
Wenn dein Shop-Template das lang-Attribut am <html>-Tag korrekt setzt, erkennt das Widget die Sprache automatisch:
<html lang="fr">
...
<div data-zoom-widget="WIDGET_ID"></div>
<script src="https://zoom.reviews/widget.js" async></script>
</html>Variante 3: Per Dashboard-Konfiguration
Unter Widgets → Bearbeiten → Einstellungen kannst du eine feste Sprache pro Widget setzen. Das ist nützlich, wenn du für jeden Shop oder Sprachkanal ein eigenes Widget erstellst.
Shopware / Twig Beispiel
{# In deinem Theme-Template #}
<div data-zoom-widget="WIDGET_ID"
data-lang="{{ app.request.locale[:2] }}"></div>
<script src="https://zoom.reviews/widget.js" async></script>Integritätsprüfung (SRI)
Wenn deine Sicherheitsrichtlinien es verlangen, kannst du statt des selbst-aktualisierenden widget.js eine feste Version mit Subresource Integrity einbinden. Der Browser prüft dann vor dem Ausführen per Hash, dass das Skript exakt dem veröffentlichten Stand entspricht, und blockiert es sonst.
<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>Feste Versionen erhalten keine automatischen Updates oder Fehlerbehebungen. Wenn wir eine neue Version veröffentlichen, musst du das Snippet selbst austauschen. Wir informieren dich bei Änderungen per E-Mail, damit du das Snippet rechtzeitig austauschen kannst. Das jeweils aktuelle Snippet findest du unter Widgets → Einbettungscode.
Review-Einladungen (Post-Purchase)
Sende automatisch Review-Einladungen an deine Kunden nach dem Kauf. Die E-Mails sind mehrsprachig (DE/EN/FR/ES/IT) und enthalten einen personalisierten Link.
Verfügbar ab: Pro-Plan (100 Einladungen/Tag) · Enterprise (1.000 Einladungen/Tag)
Einzelne Einladung erstellen
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{
"email": "kunde@example.com",
"customerName": "Max Mustermann",
"orderId": "ORD-10042",
"orderDate": "2026-07-28T14:30:00Z",
"locale": "de",
"locationId": "clx...",
"delayDays": 7
}| Parameter | Pflicht | Beschreibung |
|---|---|---|
| Ja | E-Mail-Adresse des Kunden | |
| customerName | Ja | Name des Kunden |
| orderId | Nein | Bestellnummer (zur Zuordnung) |
| locale | Nein | Sprache der E-Mail (de/en/fr/es/it) |
| locationId | Nein | Standort-ID für die Zuordnung |
| delayDays | Nein | Verzögerung in Tagen (0 = sofort, Standard: 7) |
Batch-Einladungen (bis zu 100 auf einmal)
{
"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" }
]
}Ablauf für den Kunden
- Kunde erhält personalisierte E-Mail mit Review-Link
- Link führt zu deiner Review-Seite mit vorbefülltem Namen
- Review wird automatisch als verifiziert markiert (kein Captcha)
- Token kann nur einmal verwendet werden
Einladungen auflisten
// Status: PENDING, SENT, OPENED, COMPLETED, EXPIREDOutgoing Webhooks
Erhalte Echtzeit-Benachrichtigungen über neue Reviews und Einladungen. Webhooks werden per HMAC-SHA256 signiert.
Nur Enterprise-Plan. Maximal 10 Webhook-Endpoints pro Unternehmen.
Verfügbare Events
| Event | Beschreibung |
|---|---|
| review.created | Neue Review eingereicht |
| review.approved | Review genehmigt |
| review.rejected | Review abgelehnt |
| invitation.sent | Einladung versendet |
| invitation.completed | Einladung abgeschlossen (Review eingereicht) |
Webhook erstellen
{
"url": "https://your-server.com/webhooks/zoom-reviews",
"events": ["review.created", "review.approved"]
}Antwort enthält ein secret (nur einmal sichtbar!), das zur Signatur-Verifizierung dient.
Payload-Format
// 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": "Max Mustermann",
"source": "WIDGET",
"locationId": "clx..."
},
"timestamp": "2026-07-29T18:30:00.000Z"
}Signatur verifizieren
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)
);
}Verwaltung
Unter Einstellungen → Webhooks (kommt bald) oder per API:
GET /api/webhooks/outgoing— Alle Endpoints auflistenPATCH /api/webhooks/outgoing— URL/Events/Status ändernDELETE /api/webhooks/outgoing?id=...— Endpoint löschen
Shopware 6 Integration
Automatische Review-Einladungen nach Bestellabschluss in deinem Shopware-6-Shop. Die Integration erkennt automatisch die Bestell-Sprache und den Sales Channel.
Übersicht
Schritt 1
Webhook-URL in Shopware konfigurieren
Schritt 2
Flow Builder Event wählen
Schritt 3
Verzögerung & Sprache einstellen
Methode A: Shopware Flow Builder (empfohlen)
- Geh in deinem Shopware-Admin zu Einstellungen → Flow Builder
- Erstelle einen neuen Flow mit Trigger:
Order placedoderOrder status changed → Completed - Füge eine Send HTTP request-Aktion hinzu
- Methode:
POST - URL: deine Webhook-URL (siehe Integrations-Einstellungen)
- Content-Type:
application/json
Methode B: REST-API direkt aufrufen
Alternativ kannst du aus einem Custom Plugin oder einer App direkt die Review-Einladungs-API aufrufen:
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{
"email": "{{ order.orderCustomer.email }}",
"customerName": "{{ order.orderCustomer.firstName }} {{ order.orderCustomer.lastName }}",
"orderId": "{{ order.orderNumber }}",
"locale": "de",
"delayDays": 7
}Multi-Shop / Multi-Channel
Wenn du mehrere Shopware Sales Channels betreibst:
- Erstelle in Zoom.Reviews einen Standort pro Sales Channel
- Übergib die
locationIdin der API-Anfrage - Reviews werden dann getrennt gesammelt und pro Kanal angezeigt
Sprach-Erkennung
Die Shopware-Integration erkennt automatisch die Bestellsprache aus dem locale-Feld der Bestellung. Unterstützt: de, en, fr, es, it. Fallback auf die konfigurierte Standard-Sprache.
Widget im Shopware-Theme einbinden
{# Widget mit automatischer Spracherkennung #}
<div data-zoom-widget="WIDGET_ID"
data-lang="{{ app.request.locale[:2] }}">
</div>
<script src="https://zoom.reviews/widget.js" async></script>Tipp: Erstelle pro Sales Channel ein eigenes Widget mit der entsprechenden locationId. So zeigt jeder Shop nur seine eigenen Reviews an.
Bereit für die Integration?
Starte kostenlos und binde deine ersten Bewertungen in wenigen Minuten ein.