Testen und Diagnose
Testmodus, der Diagnosebereich und alle Fehlercodes.
Bevor echte Kunden kommen, spiel deine Integration einmal vom Klick bis zur Meldung durch. Auf dieser Seite lernst du, wie der Testmodus funktioniert, wie du von Anfang bis Ende testest, wo die Diagnose auf der Integrationsseite steht und was jeder Fehlercode bedeutet. Mit dem Testmodus geht das alles, ohne Geld zu bewegen.
Kurz gesagt:
- Ergänze eine Conversion-Meldung um
"test": true. Sie durchläuft jede Prüfung, bewegt aber nie Geld. - Ein Test braucht einen echten ref-Code. Das Programm muss also live sein, und du brauchst einen Publisher-Link.
- Letzte Ablehnungen auf der Integrationsseite listet abgelehnte Meldungen mit Code und Lösung.
- Eine abgelehnte Meldung antwortet mit einem Code in
error: 403 beiREF_PROGRAM_MISMATCH, 422 bei den anderen.
Testmodus
Ergänze eine Conversion-Meldung um "test": true. Die Meldung durchläuft jede Prüfung einer echten: API-Schlüssel, Signatur, ref-Code, Cookie-Fenster, Betrag und Provisionsregeln. Dann:
- wird sie als Test-Conversion erfasst, die nie Geld bewegt. Es wird kein Guthaben reserviert, und der Publisher verdient nichts;
- zeigt die Antwort die Provision, die eine echte Meldung eingebracht hätte, mit
"test": trueund dem StatusREJECTED; - erscheint sie unter Test-Conversions auf der Integrationsseite, nicht in deiner Conversion-Liste oder den Statistiken;
- erhält dein Endpunkt
conversion.recordedmit"test": true, wenn du eine Status-Rückmeldung eingerichtet hast.
Test-Conversions haben einen eigenen Nummernraum. Ein Test blockiert also nie die echte Conversion mit derselben Bestellnummer. Wiederholst du einen Test mit derselben orderId, kommt das erste Ergebnis mit "duplicate": true zurück. Nimm für jeden Durchlauf eine neue Bestellnummer.
Von Anfang bis Ende testen
Ein Test braucht einen echten ref-Code, und den gibt es erst nach einem echten Klick. Das Programm muss also live sein, also freigeschaltet. Außerdem brauchst du einen Publisher-Link dafür, etwa von einem Publisher, den du angenommen hast.
- Öffne den Publisher-Link im Browser. Du landest in deinem Shop mit
?ref=...in der Adresszeile. - Prüfe, dass dein Shop den Code gespeichert hat. Siehe ref-Code erfassen.
- Gib eine Bestellung auf, oder löse deinen Meldecode mit
test: trueaus. - Prüfe die Antwort und die Liste Test-Conversions auf der Integrationsseite.
Die API von Hand ausprobieren
Kopiere den ref-Code aus der Adresszeile und sende ihn mit cURL:
curl -i -X POST https://cli.gs/api/v1/track/conversion \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"ref": "PASTE_REF_CODE_HERE",
"orderId": "TEST-0001",
"amount": "149.99",
"currency": "EUR",
"customerType": "NEW",
"test": true
}'Eine funktionierende Einrichtung antwortet mit 201 Created:
{ "ok": true, "conversionId": "cmg3x1q2w0001abcd9876efgh", "status": "REJECTED", "commission": 12, "duplicate": false, "confirmed": false, "test": true }Signierst du Anfragen, teste mit der signierten Variante aus Signierte Anfragen, bevor du Unsignierte Anfragen ablehnen einschaltest.
Der Diagnosebereich
Unten auf der Integrationsseite findest du vier Blöcke:
- Integrationsstatus zeigt zwei Prüfungen. Die Link-Prüfung öffnet einmal täglich deine Ziel-URL wie ein Besucher. Sie prüft, ob der ref-Parameter deine Weiterleitungen übersteht. Shop-Meldungen vergleicht stündlich die Conversions deines Shops mit den protokollierten Fehlern und den gesendeten Klicks.
- Letzte Ablehnungen listet Meldungen deines Shops, die wir nicht annehmen konnten, die neuesten zuerst. Jeder Eintrag zeigt Code, Zeit, ref-Code und was zu tun ist.
- Test-Conversions listet deine letzten Testmeldungen mit Betrag und Provision.
- An deinen Shop gesendete Postbacks listet Zustellungen an deine Status-Rückmeldung mit Status, Versuchen und letztem HTTP-Code.

Ablehnungen, die sich deinem Programm nicht zuordnen lassen, stehen dort nicht, etwa ein ref-Code, den es gar nicht gibt. Die API-Antwort enthält den Code aber immer. Protokolliere also die Antworten, die dein Shop erhält.
Fehlercodes
Eine abgelehnte Conversion-Meldung wird mit dem Code in error beantwortet: HTTP 403 für REF_PROGRAM_MISMATCH, HTTP 422 für die anderen. Dieselben Codes erscheinen unter Letzte Ablehnungen.
| Code | Bedeutung | Was tun |
|---|---|---|
BAD_SIGNATURE | Der ref-Code hat seine eingebaute Prüfung nicht bestanden: Er wurde verändert, abgeschnitten oder erfunden. Es geht um den Code, nicht um deine HMAC-Signatur | Code genau so speichern und senden, wie er in ?ref= ankam |
REF_UNKNOWN | Der ref-Code hat die richtige Form, aber es gibt keinen Klick mit diesem Code | Prüfen, dass du den gespeicherten Code sendest, keinen Platzhalter oder alten Testwert |
REF_PROGRAM_MISMATCH | Der Code gehört zu einem Klick auf ein anderes Programm | Den API-Schlüssel des Programms verwenden, zu dem der Link gehört. Jedes Programm braucht seinen eigenen Schlüssel |
INVALID_OCCURRED_AT | occurredAt liegt in der Zukunft oder vor dem Klick | Echten Bestellzeitpunkt mit Zeitzone senden; Serveruhr synchron halten |
REF_EXPIRED | Der Klick ist älter als das Cookie-Fenster des Programms; es ist keine Provision fällig | Nichts zu tun, wenn der Verkauf wirklich spät kam. Meldest du spät, sende occurredAt |
PROGRAM_INACTIVE | Das Programm war beim Eingang der Meldung nicht aktiv | Meldungen werden angenommen, solange das Programm freigeschaltet oder pausiert ist |
INVALID_BASKET | Der Betrag war nicht lesbar, negativ oder unplausibel hoch | Mit Punkt als Dezimaltrennzeichen senden, z. B. 49.90 |
DUPLICATE | Dieselbe Meldung ohne Bestellnummer kam zweimal innerhalb einer Minute; die zweite wurde ignoriert | Immer orderId senden. Mit Bestellnummer werden Wiederholungen stattdessen mit 200 und duplicate: true beantwortet |
INVALID_EVENT | Unbekannter eventType beim Tracking-Pixel | SALE, LEAD oder SIGNUP verwenden. Bei der API ist das ein 400 invalid payload |
INTERNAL | Ein Fehler bei uns | Du musst nichts tun; wir sind informiert. Meldung später wiederholen |
Weitere Antworten
Diese Antworten erscheinen nicht unter Letzte Ablehnungen:
| HTTP | error | Was tun |
|---|---|---|
| 400 | invalid payload (mit issues) oder invalid json body | Anfrage korrigieren; issues nennt das Feld |
| 401 | missing bearer token, invalid api key | Authorization: Bearer <Schlüssel> mit einem gültigen Schlüssel senden |
| 401 | programme not active | Der Schlüssel gehört zu einem Entwurf oder einem abgelehnten oder archivierten Programm |
| 401 | signature required, invalid signature, stale or missing timestamp, invalid nonce, nonce already used | Siehe Signierte Anfragen |
| 404 | CONVERSION_UNKNOWN | Storno für eine Bestellung, zu der wir keine Conversion haben |
| 409 | CONVERSION_FINAL | Storno für eine Provision, die schon für eine Auszahlung festgeschrieben ist |
| 429 | rate limit exceeded | Mehr als 600 Anfragen pro Minute pro Schlüssel; langsamer senden und wiederholen |
Checkliste vor dem Livegang
- Der ref-Code wird auf jeder Landingpage erfasst, übersteht Weiterleitungen und wird an der Bestellung gespeichert.
- Dein Server meldet jede bezahlte Bestellung mit
orderId, Nettobetrag undcurrency. Bei 5xx oder Timeout wiederholt er. - Eine Test-Conversion zeigt unter Test-Conversions die Provision, die du erwartest.
- Rückgaben und Stornierungen lösen einen Storno aus.
- Anfragen sind signiert, und Unsignierte Anfragen ablehnen ist eingeschaltet.
- Dein Shop sendet bei echten Bestellungen kein
"test": truemehr.
Weiter
Sobald echte Conversions eintreffen, prüfst du sie unter Conversions: siehe Conversions prüfen.