Erste Schritte

Click-ID auslesen & speichern

Wo das Tracking-Script die Click-ID eines Besuchers ablegt, alle Wege, sie auszulesen – die JavaScript-API window.lj, der Browser-Speicher, ein Hidden Field, das clickId-Cookie auf deinem Server und der URL-Parameter lj_click_id – und wie du sie kombinierst, damit dein eigenes Buchungssystem, Formular oder Backend bei jedem Event eine click_id mitsendet.

Wenn du Events selbst sendest – aus einem eigenen Buchungssystem, einem selbst gebauten Formular oder deinem Backend –, verbindet die click_id jedes Event mit genau der Kampagne, dem Ad-Set und der Anzeige. Diese Seite zeigt, wo das Tracking-Script die Click-ID ablegt, alle Wege, sie auszulesen, und wie du diese Wege kombinierst, damit du die ID auch dann hast, wenn einer davon ausfällt.

Kurz gesagt

  1. Lies die Click-ID im Browser beim Absenden des Formulars mit window.lj.getClickId() aus und greife ersatzweise auf den Browser-Speicher und die URL zurück.
  2. Ergänze ein verstecktes Feld lj_click_id im Formular als zweiten Weg und lies auf deinem Server das Cookie clickId als dritten.
  3. Speichere die ID an der Buchung bzw. am Kontakt und sende sie mit jedem Event – zusammen mit email und phone.

Wo die Click-ID liegt

Kommt ein Besucher mit lj_click_id in der URL an (jeder getrackte Link trägt ihn), speichert das Tracking-Script diese ID. Ein Besucher ohne sie bekommt vom Script eine neue Click-ID. Auf jeder Seite, auf der das Script gelaufen ist, hat der Besucher also eine Click-ID – und sie liegt an mehreren Stellen gleichzeitig:

WoNameWie langeWer sie lesen kann
URL-Parameterlj_click_idBis das Script sie gespeichert hat – dann wird er aus der Adresszeile entferntJavaScript beim selben Seitenaufruf
localStorageclickIdBis der Besucher die Website-Daten löschtJavaScript auf demselben Host
CookieclickId60 TageJavaScript auf demselben Host und dein Server
sessionStorageclickIdBis der Tab geschlossen wirdJavaScript im selben Tab

Der Speicher gilt nicht über Domains – auch nicht über Subdomains

All das gehört zum exakten Host, auf dem das Script lief. www.deinebrand.de und buchung.deinebrand.de können gegenseitig weder Speicher noch Cookie lesen. Zwischen Hosts muss die Click-ID in der URL als lj_click_id reisen – siehe Über Domains, Subdomains und iframes hinweg.

Lies sie beim Absenden, nicht beim Laden der Seite

Nach dem Laden meldet das Script den Besuch an LeadJourney. Die Antwort kann eine korrigierte Click-ID enthalten – das Script ersetzt dann jede gespeicherte Kopie und jedes befüllte Hidden Field. Liest du die ID im Moment des Absendens, bekommst du immer den endgültigen Wert.

Wege, die Click-ID auszulesen

1. Die JavaScript-API (empfohlen)

Sobald das Script geladen ist, stellt es window.lj bereit:

AufrufWas er macht
await window.lj.getClickId()Gibt die Click-ID zurück. Prüft der Reihe nach die URL, localStorage, das Cookie und sessionStorage.
window.lj.mountClickId()Schreibt die Click-ID erneut in die Hidden Fields der Seite (siehe Hidden Field).
window.lj.getTrackingStatus()Gibt den Status des Besuchs zurück – siehe Prüfen, ob es funktioniert.
const clickId = await window.lj.getClickId();

window.lj gibt es erst, nachdem das Script geladen ist. Stoppt ein Ad-Blocker oder ein Consent-Tool das Script oder ist es auf der Seite nicht installiert, ist window.lj undefined – deshalb greift das empfohlene Setup auf die anderen Wege zurück.

2. Browser-Speicher

Du kannst die gespeicherten Werte direkt auslesen. Das funktioniert auch dann, wenn das Script beim aktuellen Seitenaufruf blockiert ist – solange es bei einem früheren Besuch auf demselben Host gelaufen ist:

localStorage.getItem("clickId");
sessionStorage.getItem("clickId");
decodeURIComponent(document.cookie.match(/(?:^|; )clickId=([^;]*)/)?.[1] ?? "");

3. Ein Hidden Field im Formular

Füge deinem Formular ein verstecktes Feld hinzu – ganz ohne JavaScript. Das Script befüllt es automatisch mit der Click-ID:

<input type="hidden" name="lj_click_id" />

Das Script erkennt die Namen lj_click_id, lj_clickid, click_id und clickid (auch mit angehängtem _ und als form_fields[lj_click_id] für Elementor) sowie Felder, deren aria-label einer dieser Namen ist. Felder, die nach dem Laden dazukommen – ein späterer Schritt eines mehrstufigen Formulars, ein Widget, das spät rendert –, werden befüllt, sobald sie erscheinen. Setzt dein eigener Code den Wert zurück, rufe window.lj.mountClickId() auf, um ihn erneut zu befüllen.

Zwei Grenzen des Hidden Fields

  • Befüllt wird nur das erste passende Feld auf der Seite. Hast du mehrere Formulare auf einer Seite, setze den Wert beim Absenden selbst (siehe Schritt 2 unten).
  • Das Script setzt den Wert direkt, ohne input-Event. React, Vue und andere kontrollierte Formulare sehen ihn daher nicht in ihrem State – lies die ID dort beim Absenden mit getClickId() aus.

Der Browser sendet das Cookie clickId bei jedem Request an denselben Host, auf dem das Script läuft. Schickt dein Buchungsformular an diesen Host, kann dein Server die ID ohne JavaScript auslesen:

// mit der Middleware cookie-parser
const clickId = req.cookies.clickId ?? null;
$clickId = $_COOKIE['clickId'] ?? null;
click_id = request.cookies.get("clickId")

Das Cookie gilt nur für den exakten Host. Ein Request von www.deinebrand.de an api.deinebrand.de trägt es nicht mit.

5. Aus der URL

Auf einer Seite ohne Tracking-Script kommt die Click-ID als ?lj_click_id=… an – zum Beispiel, wenn ein Besucher von deiner Website zu einem Buchungssystem auf einem anderen Host klickt. Sie steht nur in der URL dieser ersten Seite, also lies sie einmal beim Laden aus und hebe sie auf:

// Nur auf Seiten OHNE Tracking-Script – einmal beim Laden der Seite ausführen
const fromUrl = new URLSearchParams(window.location.search).get("lj_click_id");
if (fromUrl) {
  try {
    localStorage.setItem("clickId", fromUrl);
  } catch {}
}

Speicherst du sie unter clickId, findet der Helper unten sie genauso wie auf Seiten mit Script. Auf Seiten mit Script verlässt du dich nicht auf die URL: Das Script entfernt lj_click_id aus der Adresszeile, sobald es die ID gespeichert hat.

Das empfohlene Setup: kombinieren

Kein einzelner Weg funktioniert überall – Scripts werden blockiert, Formulare liegen auf anderen Subdomains, React-Formulare ignorieren Hidden Fields, und zwischen Buchung und nächstem Event liegen oft Tage. Kombiniere die Wege so, dass jeder die Lücken der anderen schließt.

Die Click-ID mit Fallbacks auslesen

Binde diesen Helper auf den Seiten mit deinem Buchungsformular ein. Er versucht zuerst die API des Scripts, dann die gespeicherten Werte, dann die URL:

// Gibt die LeadJourney-Click-ID des Besuchers zurück, oder null, wenn es keine gibt.
async function getClickId() {
  try {
    const id = await window.lj?.getClickId();
    if (id) return id;
  } catch {}

  const fallbacks = [
    () => localStorage.getItem("clickId"),
    () => decodeURIComponent(document.cookie.match(/(?:^|; )clickId=([^;]*)/)?.[1] ?? ""),
    () => sessionStorage.getItem("clickId"),
    () => new URLSearchParams(window.location.search).get("lj_click_id"),
  ];
  for (const read of fallbacks) {
    try {
      const id = read();
      if (id) return id;
    } catch {}
  }
  return null;
}

Sie beim Absenden mitschicken

Rufe den Helper beim Absenden auf und schicke das Ergebnis an dein Backend. Behalte zusätzlich das Hidden Field lj_click_id im Formular – schlägt dein JavaScript fehl, trägt das Feld die ID trotzdem.

<form id="booking-form" method="post" action="/bookings">
  <!-- deine Felder: Name, E-Mail, Telefon, Termin … -->
  <input type="hidden" name="lj_click_id" />
</form>

<script>
  const form = document.getElementById("booking-form");
  form.addEventListener("submit", async (event) => {
    event.preventDefault();
    const field = form.elements.namedItem("lj_click_id");
    if (!field.value) field.value = (await getClickId()) ?? "";
    form.submit();
  });
</script>
bookingForm.addEventListener("submit", async (event) => {
  event.preventDefault();
  const data = Object.fromEntries(new FormData(bookingForm));

  await fetch("/api/bookings", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ ...data, click_id: await getClickId() }),
  });
});

Nimm auf deinem Server den ersten Wert, den du findest – den per JavaScript gesendeten, dann das Hidden Field, dann das Cookie:

const clickId =
  req.body.click_id || req.body.lj_click_id || req.cookies.clickId || null;
$clickId = null;
foreach ([$_POST['click_id'] ?? null, $_POST['lj_click_id'] ?? null, $_COOKIE['clickId'] ?? null] as $value) {
    if (!empty($value)) {
        $clickId = $value;
        break;
    }
}
click_id = (
    request.form.get("click_id")
    or request.form.get("lj_click_id")
    or request.cookies.get("clickId")
)

Sie an Buchung und Kontakt speichern

Speichere die Click-ID in dem Moment am Datensatz, in dem die Buchung entsteht – zum Beispiel in einer Spalte lj_click_id an der Buchung und am Kontakt. Spätere Meilensteine (der Termin hat stattgefunden, der Deal ist gewonnen) passieren in deinem System, oft Tage später und ohne Browser. Sie lesen die gespeicherte ID zurück, statt sie erneut zu suchen.

Sie mit jedem Event senden – plus E-Mail und Telefon

Sende jedes Event von deinem Server an die Conversion API – mit der gespeicherten Click-ID und der E-Mail und Telefonnummer des Kontakts:

{
  "type": "BookedCall",
  "click_id": "8f3c2a1e-4b7d-4c1a-9e2f-6d5b3a7c9e10",
  "email": "[email protected]",
  "phone": "+491701234567",
  "first_name": "Anna",
  "last_name": "Schmidt"
}

Halte nie ein Event zurück, nur weil die Click-ID fehlt

Konnte keine Click-ID gefunden werden, sende das Event trotzdem. LeadJourney matcht auch über E-Mail und Telefon – die Buchung wird also trotzdem erfasst und kann zugeordnet werden.

Über Domains, Subdomains und iframes hinweg

Weil der Speicher zu einem Host gehört, muss die Click-ID in der URL reisen, sobald dein Buchungssystem woanders läuft als die Seite, auf der der Besucher gelandet ist.

Das Buchungsformular liegt auf demselben Host wie der Rest deiner Seite (z. B. deinebrand.de/buchung). Nichts weiter zu tun – Helper, Hidden Field und Cookie funktionieren alle.

Das Buchungssystem läuft auf einer Subdomain (z. B. buchung.deinebrand.de). Schalte unter Settings → Tracking Link decoration ein: Das Script hängt dann lj_click_id an jeden Link, der auf deine Root-Domain oder eine ihrer Subdomains zeigt.

  • Script auch auf der Subdomain installiert: Es übernimmt die ID aus der URL und speichert sie dort – nutze den Helper wie gewohnt.
  • Kein Script auf der Subdomain: Lies die ID mit dem Snippet unter Aus der URL aus.

Das Buchungssystem läuft auf einer anderen Domain (z. B. deinebuchung.de). Link decoration lässt Links auf fremde Domains unverändert, also hängst du die Click-ID selbst an:

getClickId().then((clickId) => {
  if (!clickId) return;
  document.querySelectorAll('a[href^="https://deinebuchung.de"]').forEach((link) => {
    const url = new URL(link.href);
    url.searchParams.set("lj_click_id", clickId);
    link.href = url.toString();
  });
});

Auf der Buchungs-Domain liest du lj_click_id aus der URL (siehe Aus der URL) – oder du installierst dort das Tracking-Script mit einer eigenen Tracking-Domain, dann übernimmt es das für dich.

Das Buchungssystem ist als iframe eingebettet. Die eingebettete Seite hat ihren eigenen Speicher, getrennt von deiner Website – übergib die Click-ID deshalb im src des iframes:

<iframe id="booking" title="Termin buchen" width="100%" height="700"></iframe>

<script>
  getClickId().then((clickId) => {
    const src = new URL("https://deinebuchung.de/embed");
    if (clickId) src.searchParams.set("lj_click_id", clickId);
    document.getElementById("booking").src = src.toString();
  });
</script>

In der Buchungsseite liest du lj_click_id aus ihrer eigenen URL aus und schickst sie mit der Buchung mit.

Du nutzt Calendly, Cal.com, HubSpot oder Typeform?

Bei unterstützten Tools reicht das Script die Click-ID bereits in deren Embeds weiter. Diese Seite ist für dein eigenes Buchungssystem oder Formular – für die anderen siehe Apps.

Prüfen, ob es funktioniert

  1. Öffne deine Seite über einen getrackten Link – eine Test-Anzeigen-URL oder einen Link aus dem UTM Builder.
  2. Öffne die Entwicklertools des Browsers und führe in der Console aus:
    await window.lj.getClickId();
    window.lj.getTrackingStatus();
    Unter Application → Local storage und Cookies findest du dieselbe ID als clickId.
  3. Sende eine Testbuchung ab und prüfe, ob der Datensatz in deinem System die Click-ID hat.
  4. Sende das Event und öffne das API-Postbacks-Log, um zu prüfen, ob es einem Klick zugeordnet wurde.

getTrackingStatus() gibt einen dieser Werte zurück:

StatusBedeutung
pendingDer Besuch wurde noch nicht gemeldet.
trackedDer Besuch wurde erfasst.
already_trackedLeadJourney kannte diesen Besuch bereits.
skipped_internalNicht gemeldet: interne Navigation oder ein Besuch ohne externen Referrer und ohne Anzeigen-Parameter.
skipped_reloadNicht gemeldet: ein Neuladen oder Vor/Zurück ohne Anzeigen-Parameter.
blocked_adblockerEin Ad-Blocker hat den Request gestoppt – eine eigene Tracking-Domain hilft.
blocked_botDer Besuch wurde als Bot eingestuft.
failedDer Request ist fehlgeschlagen (Netzwerk- oder Serverfehler).

Den Status bei jeder Einsendung mitschreiben

Füge deinem Formular <input type="hidden" name="lj_tracking_status" /> hinzu – das Script befüllt es mit dem Status, und du siehst bei jeder Buchung, ob das Tracking funktioniert hat.

FAQ

Verwandte Artikel