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:

  1. 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.
  2. Über Review-Einladungen: Beim Versenden einer Einladung kannst du den Standort festlegen. Die Bewertung wird dann automatisch zugeordnet.
  3. 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:

POST /api/locations
{
  "name": "Online-Shop DE",
  "slug": "shop-de",
  "domain": "https://www.mein-shop.de",
  "language": "de"
}

Review mit Standort-Zuordnung erstellen:

POST /api/reviews
{
  "companyId": "...",
  "locationId": "clx...",
  "rating": 5,
  "content": "Toller Service!",
  "reviewerName": "Max Mustermann"
}

Reviews nach Standort filtern:

GET /api/reviews?companyId=...&locationId=...
// Liefert nur Reviews des angegebenen Standorts
// Ohne locationId werden alle Reviews zurückgegeben

Widget mit Standort-Filter erstellen:

POST /api/widget
{
  "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)

  1. data-lang-Attribut am Widget-Container (explizit)
  2. locale-Feld in der Widget-Konfiguration (Dashboard)
  3. document.documentElement.lang (HTML-Sprache der Seite)
  4. Fallback: de

Variante 1: Explizit per HTML-Attribut

Ideal für mehrsprachige Shops, wo die Sprache pro Seite bekannt ist:

HTML
<!-- 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
<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

Twig (Shopware 6)
{# 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.

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>

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.

Verfügbar ab Pro

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

POST /api/review-invitations
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
}
ParameterPflichtBeschreibung
emailJaE-Mail-Adresse des Kunden
customerNameJaName des Kunden
orderIdNeinBestellnummer (zur Zuordnung)
localeNeinSprache der E-Mail (de/en/fr/es/it)
locationIdNeinStandort-ID für die Zuordnung
delayDaysNeinVerzögerung in Tagen (0 = sofort, Standard: 7)

Batch-Einladungen (bis zu 100 auf einmal)

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" }
  ]
}

Ablauf für den Kunden

  1. Kunde erhält personalisierte E-Mail mit Review-Link
  2. Link führt zu deiner Review-Seite mit vorbefülltem Namen
  3. Review wird automatisch als verifiziert markiert (kein Captcha)
  4. Token kann nur einmal verwendet werden

Einladungen auflisten

GET /api/review-invitations?status=SENT&page=1
// Status: PENDING, SENT, OPENED, COMPLETED, EXPIRED
Verfügbar ab Enterprise

Outgoing 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

EventBeschreibung
review.createdNeue Review eingereicht
review.approvedReview genehmigt
review.rejectedReview abgelehnt
invitation.sentEinladung versendet
invitation.completedEinladung abgeschlossen (Review eingereicht)

Webhook erstellen

POST /api/webhooks/outgoing
{
  "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

POST an deine 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": "Max Mustermann",
    "source": "WIDGET",
    "locationId": "clx..."
  },
  "timestamp": "2026-07-29T18:30:00.000Z"
}

Signatur verifizieren

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)
  );
}

Verwaltung

Unter Einstellungen → Webhooks (kommt bald) oder per API:

  • GET /api/webhooks/outgoing — Alle Endpoints auflisten
  • PATCH /api/webhooks/outgoing — URL/Events/Status ändern
  • DELETE /api/webhooks/outgoing?id=... — Endpoint löschen
Verfügbar ab Pro

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)

  1. Geh in deinem Shopware-Admin zu Einstellungen → Flow Builder
  2. Erstelle einen neuen Flow mit Trigger: Order placed oder Order status changed → Completed
  3. Füge eine Send HTTP request-Aktion hinzu
  4. Methode: POST
  5. URL: deine Webhook-URL (siehe Integrations-Einstellungen)
  6. 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:

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": "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 locationId in 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

Twig-Template (z.B. footer.html.twig)
{# 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.

Kostenlos starten