Eingehende Webhooks
Erhalten Sie Ereignisse von externen Plattformen und vergeben Sie automatisch Seeds an Ihre Kunden. Eingehende Webhooks ermöglichen es Ihnen, jedes Drittanbiete
📥 Eingehende Webhooks
Erhalten Sie automatisch Ereignisse von externen Plattformen und vergeben Sie Samen an Ihre Kunden. Eingehende Webhooks ermöglichen es Ihnen, jedes Drittanbieter-Tool — Quiz-Apps, Formulare, Bewertungsplattformen, Zapier, Make und mehr — mit Ihrem LoyaltyTree-Loyalitätsprogramm zu verbinden.

So funktioniert es
Das System der eingehenden Webhooks verwendet ein Quellen- & Codes-Modell:
- Erstellen Sie eine Quelle — Eine Quelle repräsentiert eine externe Plattform oder ein Tool (z.B. "Typeform", "Zapier", "Meine Quiz-App"). Jede Quelle erhält eine eindeutige Webhook-URL und einen geheimen Schlüssel zur Sicherheit.
- Fügen Sie Codes zur Quelle hinzu — Jeder Code definiert eine spezifische Aktion, die Samen vergibt (z.B. "quiz_completed", "form_submitted", "birthday_claimed"). Sie legen fest, wie viele Samen jeder Code vergibt, mit optionalen Limits.
- POST-Anfragen senden — Ihre externe Plattform sendet eine POST-Anfrage an die Webhook-URL mit dem Code und den Kundeninformationen. LoyaltyTree findet oder erstellt den Kunden und vergibt die Samen automatisch.
Externe Plattform → POST an Webhook-URL → LoyaltyTree validiert & vergibt Samen → Kundenbalance aktualisiert
Erste Schritte
Schritt 1: Erstellen Sie eine Webhook-Quelle
Navigieren Sie zu Stores → [Ihr Geschäft] → Integrationen → Eingehende Webhooks. Klicken Sie auf + Quelle hinzufügen und geben Sie ihr einen Namen, der die externe Plattform beschreibt (z.B. "Typeform-Quiz" oder "Zapier-Automatisierung").
Wenn die Quelle erstellt wurde, erhalten Sie:
- Webhook-URL — Der Endpunkt, an den Ihre externe Plattform Anfragen sendet
- Webhook-Geheimnis — Ein geheimer Schlüssel zum Signieren von Anfragen (empfohlen zur Sicherheit)

Schritt 2: Codes hinzufügen
Jeder Code repräsentiert eine spezifische Aktion, die Sie belohnen möchten. Klicken Sie auf + Code hinzufügen in Ihrer Quelle, um einen zu erstellen.
| Feld | Erforderlich | Beschreibung |
|---|---|---|
| Code | Ja | Der genaue Wert, der im Webhook-Payload gesendet wird (z.B. quiz_completed). Dies muss mit dem übereinstimmen, was Ihre externe Plattform sendet. |
| Anzeigename | Ja | Ein benutzerfreundlicher Name, der im Admin-Dashboard und in der Transaktionshistorie angezeigt wird (z.B. "Quiz abgeschlossen"). |
| Beschreibung | Nein | Eine optionale Notiz für Ihr Team, wann dieser Code verwendet wird. |
| Anzahl der Samen | Ja | Wie viele Samen bei jeder Auslösung dieses Codes vergeben werden. Standardmäßig 1. |
| Max. Samen/Kunde | Nein | Die maximale Gesamtzahl an Samen, die ein einzelner Kunde von diesem Code verdienen kann. Leer lassen für unbegrenzt. Sobald ein Kunde dieses Limit erreicht, werden weitere Webhook-Anrufe für ihn erfolgreich zurückgegeben, aber 0 Samen vergeben. |
| Cooldown (Stunden) | Nein | Minimale Stunden zwischen Auszeichnungen für denselben Kunden bei diesem Code. Verhindert Missbrauch, indem die Häufigkeit, mit der ein Kunde Samen verdienen kann, begrenzt wird. Leer lassen für keinen Cooldown. |
| Aktiviert | — | Umschalten, um diesen Code zu aktivieren oder zu deaktivieren, ohne ihn zu löschen. Deaktivierte Codes geben einen 403-Fehler zurück. |
Schritt 3: Konfigurieren Sie Ihre externe Plattform
Richten Sie Ihre externe Plattform (Zapier, Typeform, benutzerdefinierte App usw.) so ein, dass sie eine POST-Anfrage an Ihre Webhook-URL sendet, wann immer die Aktion erfolgt. Siehe den Abschnitt Request Format unten für das genaue Payload-Format.
Codes & Limits erklärt
Codes und ihre Limits arbeiten zusammen, um Ihnen präzise Kontrolle darüber zu geben, wie Samen vergeben werden:
Anzahl der Samen
Jeder Code hat eine feste Anzahl an Samen. Jedes Mal, wenn der Webhook mit diesem Code ausgelöst wird, erhält der Kunde genau so viele Samen. Wenn Sie beispielsweise "quiz_completed" auf 5 Samen setzen, vergibt jeder qualifizierte Webhook-Aufruf 5 Samen.
Max. Samen pro Kunde
Dies setzt ein Lebenszeitlimit pro Kunde pro Code. Es sind die insgesamt Samen, die dieser Kunde von diesem spezifischen Code verdienen kann, nicht die Anzahl der Male, die er ihn auslösen kann.
quiz_completed mit Anzahl der Samen = 5 und Max. Samen/Kunde = 15.
- 1. Quiz abgeschlossen → +5 Samen (insgesamt: 5) ✅
- 2. Quiz abgeschlossen → +5 Samen (insgesamt: 10) ✅
- 3. Quiz abgeschlossen → +5 Samen (insgesamt: 15) ✅
- 4. Quiz abgeschlossen → +0 Samen (Limit erreicht) — gibt Erfolg zurück, aber keine Samen vergeben
Cooldown (Stunden)
Setzt eine minimale Wartezeit zwischen Samenvergaben für denselben Kunden bei demselben Code. Der Cooldown-Timer beginnt nach der letzten erfolgreichen Vergabe.
daily_visit mit Anzahl der Samen = 2 und Cooldown = 24 Stunden.
- Montag 10 Uhr → +2 Samen ✅
- Montag 15 Uhr → +0 Samen (Cooldown aktiv, versuchen Sie es in 19 Stunden erneut)
- Dienstag 11 Uhr → +2 Samen ✅
Request Format
Sendet eine POST-Anfrage an Ihre Webhook-URL mit folgendem JSON-Body:
{
"code": "your_code_here",
"customer": {
"email": "customer@example.com",
"shopify_customer_id": "12345",
"first_name": "Jane",
"last_name": "Smith"
},
"metadata": {
"quiz_score": 95,
"source_page": "spring-quiz"
}
}
| Feld | Erforderlich | Beschreibung |
|---|---|---|
code |
Ja | Der Codewert, der mit einem Ihrer konfigurierten Codes übereinstimmt (z.B. quiz_completed) |
customer.email |
Ja* | E-Mail-Adresse des Kunden. Wird verwendet, um den Kunden zu finden oder zu erstellen. Erforderlich für neue Kunden. |
customer.shopify_customer_id |
Nein* | Die Shopify-ID des Kunden. Kann anstelle der E-Mail verwendet werden, um bestehende Kunden zu identifizieren. |
customer.first_name |
Nein | Vorname des Kunden. Wird verwendet, wenn neue Kunden erstellt werden. |
customer.last_name |
Nein | Nachname des Kunden. Wird verwendet, wenn neue Kunden erstellt werden. |
metadata |
Nein | Zusätzliche Daten, die Sie mit der Transaktion speichern möchten (z.B. Quiz-Ergebnisse, Seiteninformationen). Wird als JSON gespeichert und ist in Protokollen sichtbar. |
* Mindestens eines von email oder shopify_customer_id ist erforderlich. E-Mail ist erforderlich, wenn der Kunde noch nicht in LoyaltyTree existiert.
HMAC-Signaturverifizierung (empfohlen)
Um zu überprüfen, dass die Anfragen tatsächlich von Ihrer Plattform kommen (und nicht von jemandem, der Ihre Webhook-URL gefunden hat), signieren Sie Ihre Anfragen mit HMAC-SHA256.
- Nehmen Sie den rohen JSON-Anfrage-Body als String
- Erstellen Sie einen HMAC-SHA256-Hash mit Ihrem Webhook-Geheimnis als Schlüssel
- Fügen Sie den hex-kodierten Hash in einen der unterstützten Header ein
Unterstützte Signatur-Header (LoyaltyTree überprüft alle diese):
X-Webhook-SignatureX-Hub-Signature-256X-Signature
Der Signaturwert kann entweder der rohe hex-Hash oder mit sha256= vorangestellt sein (beide Formate werden akzeptiert).
Alternative: Plain Token-Authentifizierung
Wenn HMAC-Signierung in Ihrer Plattform nicht möglich ist, können Sie Ihr Webhook-Geheimnis als einfachen Token im X-Token-Header übergeben. LoyaltyTree vergleicht es direkt mit Ihrem Geheimnis.
Beispiel: Signieren mit Node.js
const crypto = require('crypto');
const payload = JSON.stringify({
code: 'quiz_completed',
customer: { email: 'jane@example.com' }
});
const signature = crypto
.createHmac('sha256', 'your_webhook_secret')
.update(payload)
.digest('hex');
fetch('https://loyaltytree.eco/webhooks/inbound/YOUR_SOURCE_ID', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Webhook-Signature': signature
},
body: payload
});
Beispiel: Signieren mit Python
import hmac, hashlib, json, requests
payload = json.dumps({
"code": "quiz_completed",
"customer": {"email": "jane@example.com"}
})
signature = hmac.new(
b'your_webhook_secret',
payload.encode('utf-8'),
hashlib.sha256
).hexdigest()
requests.post(
'https://loyaltytree.eco/webhooks/inbound/YOUR_SOURCE_ID',
headers={
'Content-Type': 'application/json',
'X-Webhook-Signature': signature
},
data=payload
)
Beispiel: Verwendung von cURL (zum Testen)
curl -X POST https://loyaltytree.eco/webhooks/inbound/YOUR_SOURCE_ID \
-H "Content-Type: application/json" \
-H "X-Token: your_webhook_secret" \
-d '{"code":"quiz_completed","customer":{"email":"jane@example.com"}}'
Antwortformat
Erfolgreiche Antwort (200)
{
"success": true,
"seeds_awarded": 5,
"transaction_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"customer_id": "f0e1d2c3-b4a5-6789-0123-456789abcdef"
}
Erfolgreich, aber begrenzt (200)
Wenn ein Cooldown oder ein Maximal-Samen-Limit die Vergabe verhindert, erhalten Sie dennoch eine 200-Antwort, jedoch mit 0 Samen und einer Erklärung:
{
"success": true,
"seeds_awarded": 0,
"message": "Cooldown aktiv. Versuchen Sie es in 18 Stunde(n) erneut."
}
// oder
{
"success": true,
"seeds_awarded": 0,
"message": "Maximale Samen (15) bereits für diesen Code vergeben."
}
Fehlerantworten
| HTTP-Status | Fehler | Bedeutung |
|---|---|---|
| 400 | Fehlendes erforderliches Feld: code |
Das Feld code wurde nicht im Anfrage-Body enthalten |
| 400 | Fehlendes erforderliches Feld: customer.email oder customer.shopify_customer_id |
Es wurde kein Kundenbezeichner bereitgestellt |
| 400 | Unbekannter Code: xyz |
Der gesendete Code stimmt nicht mit einem konfigurierten Code für diese Quelle überein |
| 401 | Ungültige Webhook-Signatur oder Token |
Die HMAC-Signatur oder der Token stimmen nicht überein. Überprüfen Sie Ihr Webhook-Geheimnis. |
| 403 | Webhook-Quelle ist deaktiviert |
Die Quelle wurde im Admin-Dashboard deaktiviert |
| 403 | Code ist deaktiviert: xyz |
Der spezifische Code wurde deaktiviert |
| 404 | Webhook-Quelle nicht gefunden |
Die Quell-ID in der URL existiert nicht. Überprüfen Sie die Webhook-URL. |
Anwendungsbeispiele
🧩 Quiz-Abschluss
Belohnen Sie Kunden für den Abschluss eines Quiz auf Ihrer Seite (erstellt mit Typeform, Google Forms usw.).
- Code:
quiz_completed - Samen: 10
- Max. Samen: 10 (einmalig)
- Cooldown: keiner
📋 Umfrageantwort
Vergeben Sie Samen, wenn ein Kunde eine Umfrage nach dem Kauf ausfüllt.
- Code:
survey_completed - Samen: 5
- Max. Samen: 25 (bis zu 5 Umfragen)
- Cooldown: 168 Stunden (einmal pro Woche)
🎂 Geburtstagsbelohnung
Vergeben Sie Samen am Geburtstag eines Kunden über Ihre Marketingplattform.
- Code:
birthday_reward - Samen: 25
- Max. Samen: keine (jährlich)
- Cooldown: 8760 Stunden (365 Tage)
📸 Instagram-Tag
Belohnen Sie Kunden, die Ihre Marke auf Instagram taggen (verifiziert durch Ihr Social-Media-Team oder -Tool).
- Code:
instagram_tag - Samen: 15
- Max. Samen: 60 (bis zu 4 Tags)
- Cooldown: 72 Stunden (einmal alle 3 Tage)
Verbindung mit Zapier
Zapier ist eine der beliebtesten Möglichkeiten, LoyaltyTree mit Hunderten anderer Apps zu verbinden. Wir bauen eine dedizierte LoyaltyTree-Integration im Zapier App Store, die die Einrichtung noch einfacher macht — suchen Sie danach im Zapier-Marktplatz.
Wir fügen LoyaltyTree als native Zapier-App hinzu. Sobald sie verfügbar ist, können Sie nach "LoyaltyTree" im Zapier-App-Verzeichnis suchen und es direkt verbinden — keine Webhook-Konfiguration erforderlich. Bleiben Sie dran!
In der Zwischenzeit können Sie die Aktion Webhooks von Zapier verwenden, um sofort zu verbinden:
- Erstellen Sie einen Zap mit Ihrem gewünschten Trigger (z.B. "Neue Typeform-Antwort")
- Fügen Sie einen Aktionsschritt hinzu: Webhooks von Zapier → POST
- Setzen Sie die URL auf Ihre LoyaltyTree eingehende Webhook-URL
- Setzen Sie den Payload-Typ auf JSON
- Ordnen Sie die Felder zu:
code→ Ihr Codewert (z.B. "quiz_completed")customer.email→ die E-Mail des Befragten aus dem Trigger
- Unter Headers fügen Sie
X-Tokenmit Ihrem Webhook-Geheimniswert hinzu - Testen und aktivieren Sie Ihren Zap
Verbindung mit Make (Integromat)
Sie können auch das Modul HTTP / Make a request von Make verwenden, um Webhooks an LoyaltyTree zu senden. Konfigurieren Sie es auf die gleiche Weise wie Zapier — setzen Sie die URL, fügen Sie den JSON-Body mit code und customer hinzu und fügen Sie Ihr Geheimnis im X-Token-Header ein.
Webhook-Protokolle
Jeder eingehende Webhook-Aufruf wird protokolliert und ist im Abschnitt Eingehende Webhooks Ihrer Integrationsseite sichtbar. Die Protokolle zeigen:
- Zeitstempel – Wann der Webhook empfangen wurde
- Quelle – Welche Quelle ihn empfangen hat
- Status – Erfolg oder Misserfolg
- Details – Verwendeter Code, vergebene Samen oder Fehlermeldung
- Payload – Der gesamte Anfrage-Body (verschlüsselt im Ruhezustand)
Verwenden Sie die Protokolle, um zu überprüfen, ob Ihre Integration korrekt funktioniert und um Probleme zu beheben.
Fehlerbehebung
401 "Ungültige Webhook-Signatur" erhalten
- Stellen Sie sicher, dass Sie den genauen JSON-Body-String signieren, den Sie senden (keine zusätzlichen Leerzeichen oder Umformatierungen)
- Überprüfen Sie, ob Sie das richtige Webhook-Geheimnis verwenden (Sie können es im Admin-Dashboard anzeigen)
- Wenn HMAC-Signierung nicht möglich ist, verwenden Sie den
X-Token-Header mit Ihrem Geheimnis als einfachem Wert - Sie können das Geheimnis bei Bedarf aus den Quelleneinstellungen neu generieren
400 "Unbekannter Code" erhalten
- Der
code-Wert in Ihrer Anfrage muss genau übereinstimmen mit einem Code, den Sie im Admin-Dashboard konfiguriert haben - Codes sind groß-/kleinschreibungssensitiv:
Quiz_Completedist anders alsquiz_completed - Überprüfen Sie, ob der Code aktiviert ist (nicht deaktiviert)
0 Samen vergeben
- Überprüfen Sie, ob der Kunde das Max. Samen/Kunde-Limit für diesen Code erreicht hat
- Überprüfen Sie, ob der Cooldown noch aktiv ist — die Antwortnachricht sagt Ihnen, wie viele Stunden Sie warten müssen
- Beide geben HTTP 200 mit
seeds_awarded: 0und einer Erklärung immessage-Feld zurück
Kunde wird nicht erstellt
- Neue Kunden benötigen eine E-Mail-Adresse. Wenn Sie nur
shopify_customer_idsenden, muss der Kunde bereits in LoyaltyTree existieren. - Wenn sowohl E-Mail als auch Shopify-ID bereitgestellt werden, sucht LoyaltyTree zuerst nach der E-Mail, dann nach der Shopify-ID und erstellt einen neuen Kunden nur, wenn keine Übereinstimmung vorliegt.
Sicherheit
- Jede Quelle erhält ein einzigartiges 64-Zeichen-Webhooks-Geheimnis, das automatisch generiert und im Ruhezustand verschlüsselt ist
- Geheimnisse können jederzeit aus den Quelleneinstellungen neu generiert werden (das alte Geheimnis funktioniert sofort nicht mehr)
- Anfrage-Payloads sind in den Protokollen verschlüsselt für die Privatsphäre
- Die Signaturverifizierung verwendet zeit-sicheren Vergleich, um Timing-Angriffe zu verhindern
- Quellen und Codes können einzeln deaktiviert werden, ohne sie zu löschen