Integrationen

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 Lead und WonClient. Der Event-Name ist der type, 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:

ZugangsdatumWas es ist
Workspace-IDDeine eindeutige Workspace-Kennung. Sie steckt bereits in der Webhook-URL (siehe unten), du sendest sie also selten separat.
Postback SecretDein 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-URLDer 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.

Sende das Secret als Bearer-Token im Authorization-Header. Das ist die empfohlene Form für eigenen Code, da das Secret nie in URLs oder Server-Logs landet.

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", "email": "[email protected]" }'

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.

FeldErforderlichBeschreibung
typeErforderlichName des Event-Typs – muss zu einem Event im Events Manager passen (z. B. Lead, WonClient).
click_idBedingtDie Klick-UUID des Leads. Erforderlich, wenn email und phone fehlen.
emailBedingtDie E-Mail des Leads. Erforderlich, wenn click_id und phone fehlen.
phoneBedingtDie Telefonnummer des Leads. Erforderlich, wenn click_id und email fehlen.
revenueOptionalUmsatzwert (erforderlich für WonClient-Events).
cash_collectedOptionalTatsächlich eingenommener Betrag.
first_nameOptionalVorname des Leads.
last_nameOptionalNachname des Leads.
custom_fieldsOptionalEin 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-TriggerZu sendender Event-typeZusätzliche Felder
Neue Lead-Zeile / Formular abgeschicktLeademail, Name
Lead vom Vertrieb qualifiziertQualifiedLead
Call/Demo gebuchtBookedCall
Interessent ist zum Call erschienenShowedUp
Deal auf Won gesetzt / Zahlung erfasstWonClientrevenue (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 Lead pro Person, auch wenn dein Trigger zweimal feuert).
  • Conversion mit neuen Daten aktualisieren – bestehendes Event aktualisieren, wenn sich ein Wert ändert (z. B. der revenue eines 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/json und 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

Auf dieser Seite