Events aus einem eigenen CRM senden
Eine Entwickler-Referenz für die Conversion API. Sende ein Webhook (Postback) aus deinem eigenen CRM oder Backend, sobald sich eine Pipeline-Stufe ändert – LeadJourney ordnet es dem Ad-Klick zu. Inklusive Endpoint, Authentifizierung, vollständiger Payload-Referenz und kopierfertiger Beispiel-Requests in cURL, Node.js, PHP und Python.
Wenn du ein selbst programmiertes oder internes CRM betreibst, gibt es keinen fertigen Konnektor zum Anklicken – du sendest die Events selbst. Das Prinzip ist simpel: Definiere einen Trigger in deinem CRM (eine neue Lead-Zeile, eine Opportunity wechselt auf Won, eine Zahlung geht ein) und sende beim Auslösen ein HTTP-Webhook – auch Postback genannt – an die Conversion API von LeadJourney. LeadJourney ordnet dieses Event dem Ad-Klick zu, der den Lead erzeugt hat, sodass ein Meilenstein in deiner Pipeline zu einer attribuierten Conversion wird.
Dieser Artikel ist so geschrieben, dass du ihn einem Entwickler in die Hand geben kannst. Er enthält den exakten Endpoint, die Authentifizierung, jedes Payload-Feld und kopierfertige Requests in vier Sprachen.
Bevor du startest
Zwei Dinge müssen zuerst stehen:
- Das Tracking läuft. Events werden dem Besucher zugeordnet, der auf deine Anzeige geklickt hat – Klicks müssen also zuerst erfasst werden. Siehe Tracking-Skript installieren (und die Entwickler-Hinweise unter Auf einer selbst programmierten Website installieren).
- Mindestens ein Event existiert. Lege die Events, die du senden willst, im
Events Manager an – jeder Workspace startet mit
LeadundWonClient. Der Event-Name ist dertype, den du in der Payload sendest.
Deine Zugangsdaten holen
Öffne Einstellungen → Events → Conversion API. Dieser Tab enthält die drei Werte, die deine Integration braucht:
| Zugangsdatum | Was es ist |
|---|---|
| Workspace-ID | Deine eindeutige Workspace-Kennung. Sie steckt bereits in der Webhook-URL (siehe unten), du sendest sie also selten separat. |
| Postback Secret | Dein Authentifizierungs-Secret (beginnt mit pb_…). Das ist der „Authorization Code“ – behandle ihn wie ein Passwort. Über Regenerate kannst du ihn erneuern, falls er je durchsickert. |
| Webhook-URL | Der vollständige Endpoint, an den Events gehen – sieht aus wie https://api.leadjourney.io/api/v1/postback/DEINE-WORKSPACE-ID. |
Das Secret bleibt auf deinem Server
Das Postback Secret gewährt Schreibzugriff auf die Conversions deines Workspaces. Halte es in einer serverseitigen Umgebungsvariable – niemals in Browser-Code, einer Mobile-App oder einem öffentlichen Repository. Dein CRM/Backend hält das Secret und führt den Aufruf aus; der Browser sieht es nie.
Aufbau eines Requests
Jedes Event ist ein einzelnes POST mit einem JSON-Body, authentifiziert mit deinem Postback
Secret. Kopiere die exakte Webhook-URL aus dem Conversion-API-Tab – sie enthält bereits deine
Workspace-ID.
curl -X POST "https://api.leadjourney.io/api/v1/postback/DEINE-WORKSPACE-ID" \
-H "Authorization: Bearer DEIN_POSTBACK_SECRET" \
-H "Content-Type: application/json" \
-d '{
"type": "Lead",
"click_id": "DEINE_CLICK_ID",
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe"
}'Das ist der ganze Vertrag: URL + Authorization-Header + JSON-Body. Alles Weitere auf dieser
Seite ist nur Detail rund um diese drei Teile.
Authentifizierung
Es gibt zwei Wege, das Postback Secret zu senden. Beide sind gleichwertig – nimm den, den deine Plattform unterstützt.
Wenn deine Plattform keine eigenen Header senden kann (manche CRMs und No-Code-Tools, z. B.
HubSpot-Workflows), übergib das Secret stattdessen als token-Query-Parameter. Body und alles
Übrige bleiben gleich.
curl -X POST "https://api.leadjourney.io/api/v1/postback/DEINE-WORKSPACE-ID?token=DEIN_POSTBACK_SECRET" \
-H "Content-Type: application/json" \
-d '{ "type": "Lead", "email": "[email protected]" }'Nutze das nur, wenn die Header-Form nicht möglich ist – Tokens in URLs tauchen eher in Proxy- und Server-Logs auf.
Payload-Referenz
Der Body ist JSON. type ist immer erforderlich, und jedes Event braucht mindestens einen
Identifier (click_id, email oder phone), damit LeadJourney es einem Lead zuordnen kann.
| Feld | Erforderlich | Beschreibung |
|---|---|---|
type | Erforderlich | Name des Event-Typs – muss zu einem Event im Events Manager passen (z. B. Lead, WonClient). |
click_id | Bedingt | Die Klick-UUID des Leads. Erforderlich, wenn email und phone fehlen. |
email | Bedingt | Die E-Mail des Leads. Erforderlich, wenn click_id und phone fehlen. |
phone | Bedingt | Die Telefonnummer des Leads. Erforderlich, wenn click_id und email fehlen. |
revenue | Optional | Umsatzwert (erforderlich für WonClient-Events). |
cash_collected | Optional | Tatsächlich eingenommener Betrag. |
first_name | Optional | Vorname des Leads. |
last_name | Optional | Nachname des Leads. |
custom_fields | Optional | Ein Objekt mit deinen eigenen Custom Fields (vorher anlegen). |
Immer einen Identifier senden
Sende mit jedem Event eine click_id, eine email oder eine phone. Die click_id ist am
stärksten – sie verknüpft das Event mit der exakten Kampagne, Ad Set und Anzeige. Ohne Identifier
kann LeadJourney das Event keinem Klick zuordnen und es nicht attribuieren. Siehe
Wie Events einem Lead zugeordnet werden.
Zusätzliche CRM-Daten senden (Custom Fields)
Um Attribute wie Branche, Deal-Größe oder Tarif mitzuschicken, lege das Feld zuerst unter
Einstellungen → Events → Custom Fields an und verschachtele seinen exakten Key unter
custom_fields im selben Webhook – kein neuer Endpoint:
{
"type": "WonClient",
"email": "[email protected]",
"revenue": 1499.00,
"custom_fields": {
"industry": "Software",
"company_size": 100,
"deal_size": 1499.00
}
}Die vollständige Anleitung findest du unter Custom Fields.
Den Trigger in deinem CRM definieren
Das ist der Teil, der bei einem selbst programmierten System einzigartig ist. Bei einem nativen Konnektor beobachtet LeadJourney das CRM für dich; hier entscheidest du die Momente und löst den Aufruf aus.
Die Click-ID beim Anlegen des Leads erfassen
Wenn ein Besucher über einen getrackten Link kommt, speichert das Tracking-Skript seine Click-ID
im Browser unter localStorage.getItem('clickId'). Speichere diesen Wert auf dem Lead-Datensatz,
sobald der Lead entsteht – schicke ihn als verstecktes Feld mit deinem Anmelde-/Lead-Formular oder
lies ihn in deinem Formular-Handler aus.
Die Click-ID am Lead zu persistieren ist das, was jedes spätere Event dieses Leads (qualifiziert,
gebucht, gewonnen) dieselbe click_id mitgeben lässt – so hängt der gesamte Funnel an einem Klick.
Falls du sie nicht erfassen kannst, greife auf email / phone zurück – darauf matcht LeadJourney
ebenfalls.
Jede Pipeline-Stufe einem Event zuordnen
Wähle die Meilensteine deiner Pipeline und lege fest, welches LeadJourney-Event jeder auslöst. Für einen vertriebsgetriebenen Funnel typischerweise:
| Dein CRM-Trigger | Zu sendender Event-type | Zusätzliche Felder |
|---|---|---|
| Neue Lead-Zeile / Formular abgeschickt | Lead | email, Name |
| Lead vom Vertrieb qualifiziert | QualifiedLead | – |
| Call/Demo gebucht | BookedCall | – |
| Interessent ist zum Call erschienen | ShowedUp | – |
| Deal auf Won gesetzt / Zahlung erfasst | WonClient | revenue (und cash_collected) |
Der type muss zu einem Event passen, das du im Events Manager angelegt hast. Siehe
Übliche Events nach Geschäftstyp für
SaaS-, Lead-Gen- und E-Commerce-Vorlagen.
Das Webhook aus deinem Backend auslösen
Klinke dich dort ein, wo die Statusänderung im Code passiert – ein Datenbank-Trigger, ein
ORM-Callback, die Service-Methode, die einen Deal abschließt, ein Payment-Webhook-Handler – und sende
ein POST pro Meilenstein. Halte das Secret in einer Umgebungsvariable.
curl -X POST "https://api.leadjourney.io/api/v1/postback/DEINE-WORKSPACE-ID" \
-H "Authorization: Bearer $LJ_POSTBACK_SECRET" \
-H "Content-Type: application/json" \
-d '{
"type": "WonClient",
"click_id": "'"$CLICK_ID"'",
"email": "[email protected]",
"revenue": 1499.00
}'await fetch("https://api.leadjourney.io/api/v1/postback/DEINE-WORKSPACE-ID", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.LJ_POSTBACK_SECRET}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
type: "WonClient",
click_id: lead.clickId, // die beim Anlegen des Leads gespeicherte Click-ID
email: lead.email,
revenue: deal.amount,
}),
});$ch = curl_init("https://api.leadjourney.io/api/v1/postback/DEINE-WORKSPACE-ID");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("LJ_POSTBACK_SECRET"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"type" => "WonClient",
"click_id" => $lead->click_id,
"email" => $lead->email,
"revenue" => $deal->amount,
]),
]);
curl_exec($ch);
curl_close($ch);import os, requests
requests.post(
"https://api.leadjourney.io/api/v1/postback/DEINE-WORKSPACE-ID",
headers={
"Authorization": f"Bearer {os.environ['LJ_POSTBACK_SECRET']}",
"Content-Type": "application/json",
},
json={
"type": "WonClient",
"click_id": lead.click_id,
"email": lead.email,
"revenue": deal.amount,
},
timeout=10,
)Duplikate und Aktualisierungen behandeln
Versuche nicht, im eigenen Code zu deduplizieren – überlass das dem Events Manager. Jedes Event hat einen Modus, der bestimmt, wie wiederholte Postbacks für denselben Lead behandelt werden:
- Doppelte Postbacks ignorieren – nur der erste zählt (z. B. ein
Leadpro Person, auch wenn dein Trigger zweimal feuert). - Conversion mit neuen Daten aktualisieren – bestehendes Event aktualisieren, wenn sich ein Wert
ändert (z. B. der
revenueeines Deals wird korrigiert). - Neue Conversion anlegen – jedes Postback erfassen (z. B. Wiederkäufe).
Lege das pro Event beim Anlegen fest – siehe die Modus-Tabelle in Events & der Events Manager. So kann dein CRM gefahrlos erneut senden, ohne deine Zahlen aufzublähen.
Fehlerbehandlung & Retries
- Sende den Body als
application/jsonund lies den HTTP-Status. Ein 2xx bedeutet, das Event wurde angenommen; behandle jeden Nicht-2xx als Fehler und wiederhole mit kurzem Backoff (dein CRM feuert eventuell, bevor das Netzwerk bereit ist). - Setze ein Request-Timeout, damit ein langsamer Aufruf nie die auslösende Aktion blockiert. Feuere das Postback nach Möglichkeit aus einem Background-Job oder einer Queue.
- Bevorzuge die Event-Modi oben gegenüber eigener Dedupe-Logik, damit ein wiederholter Aufruf keine doppelte Conversion erzeugt.
Testen & prüfen
Einen Klick zum Zuordnen erzeugen
Öffne deine Seite über einen getrackten Link – einen mit lj_*-Parametern, z. B. eine Test-Ad-URL
oder ein mit dem UTM Builder gebauter Link – damit eine
Click-ID gespeichert wird und das Event etwas hat, an das es andocken kann.
Ein Test-Event senden
Feuere ein Postback (das cURL oben genügt). Innerhalb von Momenten steigt in Einstellungen → Events der Total-Zähler des Events, Last Received aktualisiert sich, und der Status springt von Created auf Active.
Den rohen Aufruf inspizieren
Öffne das API-Postbacks-Log, um Statuscode, die gesendete Roh-Payload und ob ein Klick, eine E-Mail oder Telefonnummer gematcht wurde zu sehen. Hier debuggst du ein Postback, das nicht ankommt.
Event hängt auf „Created“ / „Never“?
Die Events erreichen LeadJourney nicht. Prüfe die Webhook-URL (enthält sie deine Workspace-ID?),
ob das Authorization: Bearer …-Secret korrekt und aktuell ist, ob der JSON-type exakt zum
Event-Namen passt und ob du einen Identifier gesendet hast. Das API-Postbacks-Log zeigt den genauen
Fehlergrund.
FAQ
Verwandte Artikel
Events & der Events Manager
Events anlegen, ihren Modus wählen und die Conversion-API-Zugangsdaten finden.
Custom Fields
Zusätzliche CRM-Daten mit jedem Event senden und als Report-Dimension nutzen.
Anmeldungen in deiner App tracken
Ein durchgespieltes Beispiel, inkl. Click-ID durch Google-/Microsoft-SSO.
API-Postbacks-Log
Jeden Aufruf, Status und Payload prüfen und bestätigen, dass er gematcht hat.
Apps
Verbinde externe Apps, damit ihre Events als Conversions in LeadJourney fließen – Stripe-Zahlungen, Calendly- und Cal.com-Buchungen sowie CRM-Aktivität aus HubSpot, Attio, Close und Pipedrive – automatisch den Kampagnen zugeordnet, die sie gebracht haben.
Stripe verbinden
Verbinde dein Stripe-Konto in wenigen Minuten – ohne API-Keys, ohne von Hand verdrahtete Webhooks. Einmal autorisieren, dann Stripe-Events wie erfolgreiche Zahlungen, Abos und Erstattungen direkt auf deine Conversions abbilden.