So speicherst du Google Click IDs für Offline Conversions
Du generierst Leads über Google Ads, aber weißt nicht, welche davon wirklich Geld bringen?
Das ist das klassische „Lead-Qualitäts-Problem“. In Google Ads siehst du 50 Anfragen („Conversions“). Aber in deinem CRM siehst du, dass nur 3 davon wirklich etwas gekauft haben. Die anderen 47 waren Spam oder passten nicht.
Um Google Ads beizubringen, mehr von den „guten 3“ und weniger von den „schlechten 47“ zu finden, musst du die Erfolgsdaten aus deinem CRM an Google zurücksenden. Das nennt man Offline Conversion Import (OCI).
Der Schlüssel dazu ist ein kryptischer String: die GCLID (Google Click ID).
Doch wer Drupal nutzt – besonders mit Webforms in Iframes oder AJAX-Modulen – rennt oft gegen eine Wand. Standard-Skripte finden die versteckten Felder nicht, und die GCLID geht verloren. In diesem Artikel zeige ich dir eine robuste Lösung, die auch durch Iframes hindurch funktioniert.
Das Problem: Warum document.querySelector versagt
Das Standard-Szenario sieht so aus:
- Ein Nutzer klickt auf deine Anzeige:
deineseite.de/?gclid=TesT_123. - Ein Skript liest
TesT_123aus der URL. - Das Skript sucht auf der Seite nach einem versteckten Feld
<input name="gclid_field">und schreibt den Wert hinein.
Bei Drupal scheitert Schritt 3 oft. Warum? Weil moderne Drupal-Setups Formulare oft dynamisch nachladen (BigPipe/AJAX) oder – wie bei Konfiguratoren – in einem Iframe isolieren.
Ein Standard-Skript sucht nur im „Hauptzimmer“ (Main Document). Dein Formularfeld liegt aber im „Nebenzimmer“ (Iframe). Das Skript findet das Feld nicht, schreibt nichts, und dein CRM erhält einen leeren Datensatz.
Die Lösung: Der „Iframe-Injector“
Wir brauchen ein Skript, das intelligenter ist. Es muss:
- Die GCLID aus der URL (oder dem LocalStorage) holen.
- Nicht nur auf der Hauptseite suchen.
- Aktiv in Iframes „hineingreifen“ (vorausgesetzt, sie liegen auf derselben Domain).
- Warten, bis das Formular per AJAX geladen wurde (Polling).
Hier ist der fertige Code für deinen Google Tag Manager (oder direkt im Footer).
Das Skript
Füge dies als Benutzerdefiniertes HTML Tag im GTM ein (Trigger: All Pages).
<script>
(function() {
// --- KONFIGURATION ---
// Der "Name" deines versteckten Feldes im Drupal Webform
var hiddenFieldName = 'gclid_field';
// Der CSS-Selektor deines Iframes (falls vorhanden)
var iframeSelector = 'iframe.carport-configurator-iframe';
// --- SCHRITT 1: GCLID sichern ---
// Wir speichern die ID im LocalStorage, damit sie auch erhalten bleibt,
// wenn der Nutzer auf der Seite navigiert.
var urlParams = new URLSearchParams(window.location.search);
var gclid = urlParams.get('gclid');
if (gclid) {
// Speichern mit Timestamp (optional für Ablaufdatum-Logik)
var record = { value: gclid, expiry: new Date().getTime() + (90 * 24 * 60 * 60 * 1000) };
localStorage.setItem('gclid', JSON.stringify(record));
}
// --- SCHRITT 2: Der Injektor ---
function injectGclid(targetDoc) {
// 1. GCLID aus Storage holen
var storedRecord = localStorage.getItem('gclid');
if (!storedRecord) return;
var gclidData = JSON.parse(storedRecord);
// Prüfen ob noch gültig (90 Tage)
if (new Date().getTime() > gclidData.expiry) {
localStorage.removeItem('gclid');
return;
}
// 2. Das Feld suchen
// Wir suchen nach input[name="..."]
var field = targetDoc.querySelector('input[name="' + hiddenFieldName + '"]');
// 3. Wert schreiben (nur wenn leer)
if (field && !field.value) {
field.value = gclidData.value;
// Event feuern, damit Drupal merkt, dass sich was geändert hat
field.dispatchEvent(new Event('change', { bubbles: true }));
console.log("GCLID erfolgreich injiziert in: " + targetDoc.title);
}
}
// --- SCHRITT 3: Ausführung & Polling ---
// A. Versuch auf der Hauptseite (sofort)
injectGclid(document);
// B. Versuch im Iframe (wiederholend, da Iframes langsam laden)
setInterval(function() {
// Hauptseite erneut prüfen (falls Formular per AJAX nachgeladen wurde)
injectGclid(document);
// Iframe prüfen
var iframe = document.querySelector(iframeSelector);
if (iframe && iframe.contentWindow) {
try {
// Versuch, in das Dokument des Iframes zu greifen
// Funktioniert nur bei Same-Origin (gleiche Domain)
if (iframe.contentWindow.document.readyState === 'complete') {
injectGclid(iframe.contentWindow.document);
}
} catch(e) {
// Blockiert durch Cross-Origin (falls Iframe auf anderer Domain liegt)
// console.log("Zugriff auf Iframe verweigert");
}
}
}, 1000); // Check jede Sekunde
})();
</script>
Anscheinend wichtig, weil oft gefragt: Du musst vorher ein Hidden Field in deinem Drupal Formular erstellen und dieses z.b. „gclid_field“ nennen. Wenn du einen anderen Feldnamen verwendest, musst du das im Script anpassen.