/* ========================================================================== LeadJourney – Click-ID Helper Version : 1.0 Zweck : Click-ID aus lj-API, LocalStorage oder URL-Parameter auslesen und in alle relevanten Formularfelder (OnePage.io / Elementor) schreiben – inkl. Modal- und Multi-Step-Unterstützung. ========================================================================== */ /* -------------------------------------------------------------------------- 1. getClickId() Wartet bis zu `maxWait` ms darauf, dass eine gültige Click-ID verfügbar ist. Quellen werden in dieser Priorität geprüft: a) window.lj.getClickId() – LeadJourney-API b) localStorage['clickid'] – zuvor gespeicherter Wert c) URL-Parameter ?clickid= – Fallback für direkten Traffic -------------------------------------------------------------------------- */ async function getClickId(maxWait = 8000, poll = 250) { const t0 = Date.now(); while (Date.now() - t0 < maxWait) { // a) LeadJourney API if (window.lj?.getClickId && typeof window.lj.getClickId === 'function') { try { const id = await window.lj.getClickId(); if (id && typeof id === 'string' && id.trim()) { localStorage.setItem('clickid', id); return id; } } catch { /* ignore */ } } // b) LocalStorage const ls = localStorage.getItem('clickid'); if (ls && ls.trim()) return ls; // c) URL-Parameter Fallback const urlParam = new URLSearchParams(window.location.search).get('clickid'); if (urlParam && urlParam.trim()) { localStorage.setItem('clickid', urlParam); return urlParam; } await new Promise(r => setTimeout(r, poll)); } return null; } /* -------------------------------------------------------------------------- 2. fillAllFields() Schreibt die Click-ID in alle passenden Input-Felder der Seite. Drei Strategien: 1) Gezielte CSS-Selektoren (OnePage.io-spezifisch) 2) Catch-all für versteckte Inputs mit clickid-Bezug 3) OnePage.io Hidden-Field-Wrapper ([data-atom="form-hidden-field"]) -------------------------------------------------------------------------- */ function fillAllFields(id) { if (!id) return; // --- 1) OnePage.io – gezielte Selektoren --- const selectors = [ 'input[name="form_fields[clickid]"]', 'input[name="clickid"]', 'input[data-slug="clickid"]', 'input[data-query-param="clickid"]', 'input[data-name="clickid"]', ]; selectors.forEach(sel => { document.querySelectorAll(sel).forEach(input => { input.value = id; // React / Vue: synthetisches Event auslösen const nativeInputValueSetter = Object.getOwnPropertyDescriptor( window.HTMLInputElement.prototype, 'value' ).set; nativeInputValueSetter.call(input, id); input.dispatchEvent(new Event('input', { bubbles: true })); input.dispatchEvent(new Event('change', { bubbles: true })); }); }); // --- 2) Catch-all: versteckte Inputs mit clickid-Bezug --- document.querySelectorAll('input[type="hidden"]').forEach(input => { const nameMatch = input.name?.toLowerCase().includes('clickid'); const slugMatch = input.dataset?.slug === 'clickid'; const paramMatch = input.dataset?.queryParam === 'clickid'; const labelMatch = input.dataset?.name?.toLowerCase().includes('clickid'); if (nameMatch || slugMatch || paramMatch || labelMatch) { input.value = id; } }); // --- 3) OnePage.io Hidden-Field-Wrapper --- document.querySelectorAll('[data-atom="form-hidden-field"]').forEach(wrapper => { const input = wrapper.querySelector('input'); if (input) input.value = id; }); } /* -------------------------------------------------------------------------- 3. ensureClickId() Hauptfunktion: holt die Click-ID und füllt sofort alle Felder. Startet zusätzlich einen MutationObserver für 30 Sekunden, um auch dynamisch geladene Formulare (Modals, Multi-Step) zu erfassen. -------------------------------------------------------------------------- */ async function ensureClickId() { const id = await getClickId(); if (!id) { console.warn('[ClickID] No Click-ID found after timeout.'); return; } // Sofort befüllen fillAllFields(id); // DOM-Änderungen 30 s lang beobachten (Modals, Multi-Step-Forms) const tEnd = Date.now() + 30_000; const obs = new MutationObserver(() => { fillAllFields(id); if (Date.now() > tEnd) obs.disconnect(); }); obs.observe(document.body, { childList: true, subtree: true }); } /* -------------------------------------------------------------------------- 4. Event-Hooks Drei Einstiegspunkte, damit die Logik in jedem Ladezustand greift: • DOMContentLoaded – Standard DOM-Ready • click (capture) – Modal-Öffner (OnePage.io) • load – Fallback nach vollständigem Seitenload -------------------------------------------------------------------------- */ // Standard DOM-Ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', ensureClickId); } else { ensureClickId(); // Seite bereits bereit } // Modal-Öffner: OnePage.io feuert click auf [data-modal]-Trigger document.addEventListener('click', (e) => { const trigger = e.target.closest( '[data-modal], [href*="modal"], .con-kit-component-button' ); if (trigger) { setTimeout(ensureClickId, 300); // warten bis Modal gemountet ist } }, true); // Fallback beim vollständigen Seitenload window.addEventListener('load', ensureClickId);
Ergebnis: In kurzer Zeit Videos mit über 500.000 Aufrufen, regelmäßige Leads und Kunden deutschlandweit gewonnen.
Ergebnis: In 28 Tagen über 70.000 Aufrufe, 2500 Abonnenten und erste Premiumkunden gewonnen.
Ergebnis: In wenigen Monaten wurde der Kanal und die Reichweite verdoppelt und auf Wachstumskurs gebracht - "99% der Anfragen kommen über YouTube".