Tracking-Werkzeuge anbinden

Ereignisse auf Ihrer Webseite empfangen und an Google Ads, den Facebook Pixel oder Ihr eigenes Analyse-System weitergeben.

Grundlage für alle Tracking-Werkzeuge:

Anbindung einzelner Werkzeuge:

Ereignisse empfangen (Grundgerüst)

Das folgende Skript binden Sie auf der Seite ein, die den Kurskalender per iFrame enthält – nicht innerhalb des Kurskalenders selbst.

Wichtig:
Binden Sie das Skript so früh wie möglich ein, vorzugsweise im <head> Ihrer Seite oder jedenfalls vor dem iFrame. Ereignisse werden nur einmalig gesendet und nicht zwischengespeichert: Ist der Empfänger zum Zeitpunkt des Ereignisses noch nicht registriert, geht das Ereignis verloren. Verzichten Sie deshalb darauf, die Registrierung in window.onload oder an das Seitenende zu verlagern.
window.addEventListener('message', function (event) {
    // 1. WICHTIG: Origin gegen die Domaene(n) Ihres SEMCO-Kurskalenders pruefen
    if (event.origin !== 'https://app.example-semco-domain.com') {
        return;
    }

    // 2. Nur Ereignisse des SEMCO-Kurskalenders verarbeiten
    const data = event.data;
    if (!data || typeof data.event_name !== 'string' || !data.event_name.startsWith('semco_')) {
        return;
    }

    // 3. Nur die unterstuetzte Hauptversion des Schemas verarbeiten. Ziffer anpassen, sobald Sie eine neue Hauptversion unterstuetzen
    if (parseInt(String(data.version).split('.')[0], 10) !== 1) {
        return;
    }

    // 4. Auf das gewuenschte Ereignis reagieren
    switch (data.event_name) {
        case 'semco_orders_confirmation':
            handleConversion(data);
            break;

        // weitere Ereignisse nach Bedarf behandeln
    }
});
Hinweis:
Ersetzen Sie https://app.example-semco-domain.com durch die Domäne, unter der Ihr SEMCO-Kurskalender ausgeliefert wird. Sie finden sie im src-Attribut des iFrame, mit dem der Kurskalender eingebettet ist. Die Prüfung von event.origin darf nicht entfallen.

Verhindern Sie zusätzlich eine Doppelzählung beim Neuladen der Bestätigungsseite. Wie das geht, zeigt Prüfung und Korrekturmöglichkeiten bei Fehlern.

Wichtig:
Definieren Sie die Funktion handleConversion nur einmal. Wenn Sie mehrere Tracking-Systeme parallel bedienen möchten, rufen Sie diese aus einer gemeinsamen Funktion auf – siehe Beide Systeme gleichzeitig bedienen.

Google Ads Conversion Tracking

Voraussetzung: Das Google-Tag (gtag.js) ist auf Ihrer Webseite eingebunden, und Ihre Conversion-ID sowie Ihr Conversion-Label aus Google Ads liegen Ihnen vor.

function handleConversion(data) {
    gtag('event', 'conversion', {
        'send_to': 'AW-XXXXXXXXX/XXXXXXXXXXXX',
        'value': Number(data.order?.quotation?.gross_amount ?? 0),
        'currency': data.course?.course_currency_symbol ?? 'EUR'
    });
}

Ersetzen Sie AW-XXXXXXXXX/XXXXXXXXXXXX durch Ihre Conversion-ID und Ihr Conversion-Label aus Google Ads.

Hinweis:
Eine buchungseindeutige Kennung steht im Ereignis derzeit nicht zur Verfügung. Deshalb wird transaction_id nicht übergeben. Google Ads kann Conversions damit nicht entduplizieren. Lädt ein Besucher die Bestätigungsseite neu, wird die Conversion erneut gezählt. Umgekehrt gehen keine Conversions verloren: Mehrere Anmeldungen zum selben Kurs werden korrekt einzeln gezählt.

Facebook Pixel

Voraussetzung: Der Facebook Pixel (fbq) ist auf Ihrer Webseite eingebunden.

function handleConversion(data) {
    fbq('track', 'Purchase', {
        value: Number(data.order?.quotation?.gross_amount ?? 0),
        currency: data.course?.course_currency_symbol ?? 'EUR',
        content_name: data.course?.course_title ?? ''
    });
}

Beide Systeme gleichzeitig bedienen

Definieren Sie handleConversion nur einmal und rufen Sie beide Systeme aus dieser Funktion auf:

function handleConversion(data) {
    const value = Number(data.order?.quotation?.gross_amount ?? 0);
    const currency = data.course?.course_currency_symbol ?? 'EUR';

    gtag('event', 'conversion', {
        'send_to': 'AW-XXXXXXXXX/XXXXXXXXXXXX',
        'value': value,
        'currency': currency
    });

    fbq('track', 'Purchase', {
        value: value,
        currency: currency,
        content_name: data.course?.course_title ?? ''
    });
}

Listenaufrufe und Sucheinstiege auswerten

Die Ereignisse semco_classes_index und semco_e_learning_index enthalten das Datenobjekt index mit dem Zustand von Suchfiltern und Seitenblätterung. Daraus lässt sich ablesen, welche Filter genutzt werden und wie viele Treffer eine Suche liefert. Die einzelnen Felder beschreibt Ereignisse und übermittelte Daten.

Erweitern Sie die Verzweigung im Grundgerüst um die beiden Listen-Ereignisse:

case 'semco_classes_index':
case 'semco_e_learning_index':
    handleListView(data);
    break;

Hinweis:
Beachten Sie, dass diese Ereignisse bei jedem Filter- und Seitenwechsel erneut gesendet werden — ein einzelner Besucher kann also mehrere Ereignisse auslösen.

Übergeben Sie dann die gewünschten Werte an Ihr Analyse-System:

function handleListView(data) {
    myAnalytics.track('course_list_viewed', {
        totalResults: data.index?.pagination?.total ?? 0,
        page: data.index?.pagination?.current_page ?? 1,
        activeFilters: data.index?.filters?.visible ?? {}
    });
}

Ersetzen Sie myAnalytics.track durch den Aufruf Ihres eigenen Analyse-Systems.

Hinweis:
Ohne aktive Filter überträgt der Kurskalender an dieser Stelle ein leeres Array statt eines leeren Objekts. Prüfen Sie den Wert, bevor Sie über seine Eigenschaften iterieren.