37 — Custom Webhook (Zapier, Make, n8n, eigene Systeme)
Aktualisiert am 1. Juni 2026
37 — Custom Webhook (Zapier, Make, n8n, eigene Systeme)
Der Custom-Webhook-Endpoint ermöglicht jeder beliebigen Quelle, Sales an PartnerDesk zu pushen — egal ob Zapier/Make/n8n, ein eigener Server oder ein nicht nativ unterstützter Payment-Provider.
Webhook-URL
POST https://<tenant-slug>.partnerdesk.io/api/webhooks/<tenant-slug>/custom
Authentifizierung
X-Webhook-Signature: sha256=<HMAC-SHA256(payload, secret)>
Das Secret konfigurieren Sie in Admin → „Zahlungsanbieter" → Custom.
Standardisiertes JSON-Schema
{
"event": "transaction.created | transaction.refunded",
"externalId": "ext-tx-12345",
"partnerId": "P-001",
"campaignSlug": "summer-promo",
"productName": "Subscription",
"productId": "prod-abc",
"grossAmount": "199.00",
"netAmount": "167.23",
"taxAmount": "31.77",
"taxRate": "19.00",
"currency": "EUR",
"transactionDate": "2026-05-21T10:00:00Z",
"isRecurring": false,
"recurringNumber": 1,
"customer": {
"externalId": "cust-001",
"email": "kunde@example.com",
"firstName": "Max",
"lastName": "Mustermann"
}
}
Event-Typen
| Event | Effekt |
|---|---|
transaction.created |
Neue Transaction + MLM-Provisionen |
transaction.refunded |
Bestehende TX (via externalId) auf refunded |
Affiliate-Identifikation
Bei Custom-Webhook ist die partnerId explizit im Body — die übliche 5-stufige Resolution (Cookie/Fingerprint) wird übersprungen. Sie kennen Ihren Partner besser als jede Heuristik.
Falls partnerId fehlt: TX landet als STATUS_UNASSIGNED, Admin kann manuell zuordnen.
Use-Cases
Zapier
Trigger: New Row in Google Sheets
Action: Webhooks by Zapier → POST → ...
Body (JSON):
{
"event": "transaction.created",
"externalId": "{{1.Row Number}}",
"partnerId": "{{1.Partner_ID}}",
...
}
Make (Integromat)
Analog: HTTP-Module → POST → Body mit Mapped Fields.
Eigener Server
$payload = json_encode([...]);
$signature = 'sha256=' . hash_hmac('sha256', $payload, $secret);
$ch = curl_init('https://tenant.partnerdesk.io/api/webhooks/tenant/custom');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
"X-Webhook-Signature: $signature",
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
Nicht-unterstützte Provider
Z. B. Shopify oder WooCommerce — Sie schreiben einen kleinen Adapter, der das jeweilige Provider-Format ins PartnerDesk-Schema übersetzt und per Custom-Webhook sendet.
Signatur erstellen — Test-Snippet
In Bash:
PAYLOAD='{"event":"transaction.created",...}'
SECRET='your-secret-here'
SIGNATURE="sha256=$(echo -n "$PAYLOAD" | openssl dgst -sha256 -hmac "$SECRET" | cut -d' ' -f2)"
curl -X POST \
-H "Content-Type: application/json" \
-H "X-Webhook-Signature: $SIGNATURE" \
-d "$PAYLOAD" \
https://tenant.partnerdesk.io/api/webhooks/tenant/custom
Idempotenz
externalId ist der Idempotenz-Key. Zweimaliges Senden mit derselben externalId → zweiter Request wird als skipped quittiert.
Verwandte Kapitel
- 30 — Webhook-Übersicht
- 131 — Outgoing-Webhooks (umgekehrte Richtung)
Technische Tiefen-Doku: ../057-custom-webhook-handler.md