Rückgaben und Stornos
Eine Provision zurücknehmen, wenn eine Bestellung zurückkommt.
Schickt ein Kunde eine Bestellung zurück, storniert sie oder wird die Zahlung zurückgebucht, soll dafür keine Provision fließen. Auf dieser Seite lernst du, wie dein Shop das mit einem Storno meldet: eine Anfrage pro Bestellung, und das gebuchte Geld geht dorthin zurück, woher es kam.
Kurz gesagt:
- Sende
POST https://cli.gs/api/v1/track/reversalmit derorderIdund einemreason. - Ein Storno nimmt die ganze Provision zurück und schreibt Provision und Netzwerkgebühr deinem Guthaben gut.
- Er funktioniert, bis die Provision für eine Auszahlung festgeschrieben ist. Danach lautet die Antwort
409 CONVERSION_FINAL. - Stornos dürfen wiederholt werden und werden wie Conversion-Meldungen signiert.
Was ein Storno bewirkt
- War die Provision gebucht, wird sie vom Guthaben des Publishers abgezogen, egal ob sie gerade vorläufig oder verfügbar ist. Provision und Netzwerkgebühr werden deinem Guthaben gutgeschrieben.
- War die Conversion nie gebucht, etwa weil sie noch zur Prüfung geparkt war, ändert sich nur ihr Status.
- Der Status der Conversion wird
REVERSED, und der Publisher wird benachrichtigt. Hast du eine Status-Rückmeldung eingerichtet, erhält dein Shopconversion.reversed.
Wie lange ein Storno möglich ist
Ein Storno ist möglich, solange die Conversion offen, freigegeben, fällig oder in Prüfung ist. Sobald ihre Provision für eine Publisher-Auszahlung festgeschrieben ist, ist sie endgültig. Die Anfrage wird dann mit 409 CONVERSION_FINAL abgelehnt.
Melde Rückgaben also zügig. Wähle eine Haltefrist, die dein Rückgaberecht abdeckt: siehe Bedingungen und Provisionsregeln. Die Haltefrist ist die Wartezeit zwischen Freigabe und Auszahlung.
Die Anfrage
POST https://cli.gs/api/v1/track/reversal
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json| Feld | Pflicht | Bedeutung |
|---|---|---|
orderId | eines von beiden | Die Bestellnummer, mit der du die Conversion gemeldet hast |
conversionId | eines von beiden | Alternativ die conversionId aus unserer Antwort auf die Meldung |
reason | ja | Warum die Provision zurückgenommen wird (siehe unten) |
eventType | nein | SALE (Standard), LEAD oder SIGNUP, falls dieselbe Bestellnummer für mehrere Ereignistypen gemeldet wurde |
note | nein | Freitext bis 2.000 Zeichen, wird bei der Conversion unter Conversions angezeigt |
Sende entweder orderId oder conversionId. Stornos werden genauso signiert wie Conversion-Meldungen: siehe Signierte Anfragen.
Gründe
reason | Verwende ihn, wenn |
|---|---|
RETURN | die Ware zurückgeschickt wurde |
CANCELLED | die Bestellung vor oder nach dem Versand storniert wurde |
CHARGEBACK | die Zahlung zurückgebucht wurde |
DUPLICATE | die Bestellung doppelt unter verschiedenen Nummern gemeldet wurde |
FRAUD | die Bestellung betrügerisch war |
TEST | eine echte (nicht als Test markierte) Meldung nur ein Test war |
ORDER_UPDATE | die Bestellung durch eine andere ersetzt wurde |
POLICY_VIOLATION | der Publisher gegen die Programmbedingungen verstoßen hat |
OTHER | nichts davon passt; erkläre es in note |
Ein Storno nimmt immer die ganze Provision zurück. Teilrückgaben werden nicht unterstützt. Kommt nur ein Teil einer Bestellung zurück, entscheide nach deinen Bedingungen, ob du die ganze Conversion stornierst.
Beispiele
cURL
curl -X POST https://cli.gs/api/v1/track/reversal \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "orderId": "100234", "reason": "RETURN", "note": "Retoure vom 12.10." }'Node.js
// Call this from your refund or cancellation handler.
async function reportReversal(orderId, reason, note) {
const res = await fetch("https://cli.gs/api/v1/track/reversal", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CLIGS_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ orderId: String(orderId), reason, note }),
signal: AbortSignal.timeout(5000),
});
const data = await res.json().catch(() => ({}));
if (res.ok) return data; // { ok: true, conversionId, status, duplicate }
if (res.status === 404) return null; // no conversion for this order: nothing to reverse
if (res.status === 409) {
console.warn("Commission already final", data.conversionId);
return null;
}
if (res.status >= 500 || res.status === 429) throw new Error("retry later");
throw new Error(`cli.gs refused the reversal: ${res.status} ${data.error}`);
}
// await reportReversal("100234", "RETURN", "Retoure vom 12.10.");In WooCommerce eignen sich die Hooks woocommerce_order_status_refunded und woocommerce_order_status_cancelled für diesen Aufruf. Rufe ihn bei Bestellungen mit _cligs_ref auf.
Antworten
{ "ok": true, "conversionId": "cmg3x1q2w0001abcd9876efgh", "status": "REVERSED", "duplicate": false }| HTTP | Body | Bedeutung |
|---|---|---|
| 200 | ok: true, duplicate: false | Jetzt storniert |
| 200 | ok: true, duplicate: true | War schon storniert oder abgelehnt. Nichts geändert |
| 400 | error: "invalid payload" oder "orderId or conversionId is required" | Anfrage korrigieren, z. B. ein unbekannter reason |
| 401 | z. B. "invalid api key" | Schlüssel und Signatur prüfen |
| 404 | error: "CONVERSION_UNKNOWN" | Keine Conversion mit dieser Bestellnummer in diesem Programm. Oft kam der Verkauf gar nicht über einen Publisher-Link, das ist in Ordnung |
| 409 | error: "CONVERSION_FINAL" | Die Provision ist für eine Auszahlung festgeschrieben und endgültig. Später wird nichts mehr verrechnet |
Wie Conversion-Meldungen dürfen auch Stornos wiederholt werden. Test-Conversions lassen sich nicht stornieren; sie haben ohnehin nie Geld bewegt.
Weiter
Wenn manche Shopseiten deinen Server nicht aufrufen können, lies über das Tracking-Pixel als Fallback.