Ereignisse und übermittelte Daten

Sehen Sie nach, welcher Schritt im Kurskalender welches Ereignis sendet, wie oft gesendet wird und welche Felder die Ereignisse enthalten.

Ereignisse:

Aufbau der Daten:

Datenobjekte:

Beispiel:

Übersicht der gesendeten Ereignisse

Schritt im Kurskalender event_name Zusätzliche Datenobjekte
Kursübersicht / Kursliste semco_classes_index index
E-Learning-Liste* semco_e_learning_index index
Kursdetails semco_classes_view course
Buchung / Anmeldung semco_orders_new course, order
Zahlung** semco_orders_payment course, order
Bestätigung*** semco_orders_confirmation course, order

*Das Ereignis semco_e_learning_index ist nur für Systeme mit E-Learning-Angebot relevant.

**Das Ereignis semco_orders_payment wird nur gesendet, wenn der Zahlungsschritt in Ihrer SEMCO-Konfiguration aktiv ist. Verlassen Sie sich in Ihrer Logik nicht darauf, dass dieses Ereignis auftritt.

***Legen Sie die eigentliche Conversion auf semco_orders_confirmation. Nur dort ist die Buchung abgeschlossen, das Feld payment_option gesetzt, und:
  • das Ereignis wird gesendet bei kostenlosen Kursen (Betrag 0, Zahlungsart leer), bei Wartelisten-Einträgen sowie bei Gruppen- und Firmenbuchungen (is_group ist dann true).
    Wichtig:
    Wartelisten-Einträge sind im Ereignis nicht von einer Buchung zu unterscheiden. Wenn Sie Wartelisten einsetzen, zählt Ihr Tracking Interessenten als Buchungen mit.
  • "Abgeschlossen" bedeutet, dass die Online-Anmeldung abgeschickt wurde — nicht, dass sie im Backoffice bestätigt ist. Das Ereignis wird auch dann gesendet, während eine Kartenzahlung noch läuft.

Wann und wie oft Ereignisse gesendet werden

  • Jeder Aufruf eines Schritts löst ein Ereignis aus – auch beim erneuten Laden derselben Seite. Insbesondere wird semco_orders_confirmation erneut gesendet, wenn der Besucher die Bestätigungsseite neu lädt oder später wieder öffnet. Verhindern Sie eine Doppelzählung deshalb in Ihrem eigenen Listener. Wie das geht, zeigt Prüfung und Korrekturmöglichkeiten bei Fehlern.
  • Die Listen-Ereignisse semco_classes_index und semco_e_learning_index werden bei jedem Filter- und Seitenwechsel erneut gesendet. So können Sie nachvollziehen, wie ein Besucher zu einem Kurs gefunden hat, bevor er die Kursdetails geöffnet hat.
  • Ereignisse werden nur einmalig gesendet und nicht zwischengespeichert: Ist der Empfänger zum Zeitpunkt des Ereignisses noch nicht registriert, geht das Ereignis verloren. Der Kurskalender wartet nicht darauf, dass Ihre Seite einen Empfänger registriert hat. Registrieren Sie den Listener deshalb so früh wie möglich, vorzugsweise bevor der iFrame geladen wird.

Konventionen für alle Felder

  • Alle Feldnamen sind in snake_case geschrieben, also durchgängig klein und mit Unterstrichen.
  • Datumsfelder entsprechen dem Format ISO 8601 und sind direkt mit new Date(...) in ein JavaScript-Datum umwandelbar.
  • Alle Betragsfelder sind Zeichenketten ("199.00"), keine Zahlen. Wandeln Sie sie mit Number(...) um, bevor Sie damit rechnen.
  • null bedeutet: an diesem Schritt beziehungsweise für diesen Kurs (noch) nicht verfügbar.
Hinweis:
Greifen Sie auf verschachtelte Felder defensiv zu, zum Beispiel data.order?.quotation?.gross_amount. So bricht Ihr Skript nicht ab, wenn ein Wert null ist.

Felder in jedem Ereignis

Feld Typ Beschreibung
event_name string Name des Ereignisses, immer mit dem Präfix semco_
source string Kennung der Quelle, enthält immer semco-course-calendar
version string Schema-Version des Ereignisses
timestamp string (ISO 8601) Zeitpunkt des Ereignisses
locale string Aktive Sprache, zum Beispiel de
authenticated boolean Gibt an, ob der Nutzer im Portal angemeldet ist (true/false)

Versionierung

Jedes Ereignis enthält im Feld version die Schema-Version, zum Beispiel 1.0.

Innerhalb einer Hauptversion – das ist die Ziffer vor dem Punkt – werden keine Felder entfernt und keine Felder umbenannt. Es können lediglich Felder hinzukommen. Ihre Auswertung bleibt damit funktionsfähig, solange die Hauptversion unverändert bleibt.

Wir empfehlen, in Ihrem Listener die Hauptversion zu prüfen und nur die von Ihnen unterstützte Hauptversion zu verarbeiten. Sobald SEMCO eine neue Hauptversion einführt, verarbeitet Ihr Listener die Ereignisse erst wieder, wenn Sie die geprüfte Hauptversion anpassen. Verfolgen Sie deshalb unsere Release Notes. Die Prüfung ist im Grundgerüst unter Tracking-Werkzeuge anbinden enthalten.

Datenobjekt course

Enthalten im Ereignis semco_classes_view sowie in allen Schritten des Buchungsablaufs.

Feld Typ Beschreibung
branch_company_name string Name der Filiale beziehungsweise Niederlassung
course_token string Eindeutiges Kurs-Kürzel
course_title string Kurstitel
course_start string (ISO 8601) oder null Kursbeginn
course_end string (ISO 8601) oder null Kursende
course_category string oder null Kurskategorie
course_presence_format string oder null Durchführungsformat, zum Beispiel Präsenz, Online oder E-Learning
course_format string oder null Kursformat (Kurzbezeichnung)
course_level string oder null Niveau beziehungsweise Stufe
course_physical_location string Zusammengesetzte Adresse des Präsenzorts
course_virtual_location string oder null Bezeichnung des virtuellen Raums
course_price string oder null Preis des Kurses
course_currency_symbol string oder null Währungscode nach ISO 4217, z.B. EUR. Das Währungssymbol ist (trotz des Feldnamens) in einem anderen Feld hinterlegt.
course_early_bird_period_active boolean Gibt an, ob aktuell ein Frühbucherpreis aktiv ist

Datenobjekt order mit quotation und items

Enthalten in allen Schritten des Buchungsablaufs. Welche Felder gefüllt sind, hängt vom erreichten Schritt ab.

Feld Typ Beschreibung
is_group boolean true bei einer Gruppen- oder Firmenbuchung, false bei einer Einzelbuchung
quotation object oder null Preis- und Positionsdetails
payment_option string oder null Gewählte Zahlungsart. Mögliche Werte siehe unten. Bei kostenlosen Kursen bleibt das Feld leer ("").
Wichtig:
Die Felder quotation und payment_option sind nicht an jedem Schritt gefüllt. Wenn Sie einen Betrag an Ihr Tracking übergeben möchten, ist das ab dem Zahlungsschritt möglich. Die Zahlungsart steht erst bei der Bestätigung zur Verfügung – und bleibt auch dort leer, wenn der Kurs kostenlos ist.
Tabelle 1. Gefüllte Felder je Schritt
Schritt quotation payment_option
Buchung / Anmeldung (semco_orders_new) null null
Zahlung (semco_orders_payment) Objekt null
Bestätigung (semco_orders_confirmation) Objekt oder null * string, bei kostenlosen Kursen ""

*Auch bei Bestätigung kann quotation null sein, wenn kein Preis berechnet werden konnte.

Tabelle 2. Mögliche Werte von payment_option
Wert Bedeutung
card Kartenzahlung über Stripe
invoice Zahlung auf Rechnung. Dieser Wert wird auch dann gesetzt, wenn für Ihr System keine Online-Zahlung aktiv ist.
paypal Zahlung über PayPal
Tabelle 3. Felder des Objekts quotation
Feld Typ Beschreibung
gross_amount string Bruttobetrag gesamt, z.B. "199.00"
net_amount string Nettobetrag gesamt, z.B. "199.00"
tax_amount string Steuerbetrag gesamt, z.B. "199.00"
items array Einzelpositionen der Buchung
Tabelle 4. Felder je Einzelposition in items
Feld Typ Beschreibung
amount string Betrag der Position
count number Menge beziehungsweise Anzahl
price string Einzelpreis
tax_amount string Steuerbetrag der Position
type_token string Kennung der Positionsart:
  • COURSE: Kursgebühr
  • COURSEMATERIAL: Kursmaterial

Weitere Werte können künftig hinzukommen oder aus einer kundenindividuellen Einrichtung entstehen, wenn zusätzliche Abrechnungspositionen mit Ihnen eingerichtet wurden.

Datenobjekt index

Enthalten in den Ereignissen semco_classes_index und semco_e_learning_index. Gedacht für die Auswertung von Listenaufrufen und Sucheinstiegen.

Feld Typ Beschreibung
pagination object Seiten- und Sortierzustand der Liste
filters object Aktive Suchfilter
Tabelle 5. Felder des Objekts pagination
Feld Typ Beschreibung
page number Angeforderte Seite
total number Gesamtanzahl der Treffer
order string Sortierrichtung
order_by string Sortierfeld
current_page number Aktuelle Seite
items_per_page number Einträge pro Seite
Tabelle 6. Felder des Objekts filters
Feld Typ Beschreibung
visible object Im Suchformular sichtbare, aktive Filter als Objekt der Form {Filtername: Wert}.
hidden object Automatisch angewandte, nicht sichtbare Filter. Enthält nur, was in der URL des Kurskalenders steht.

Die Werte sind die rohen URL-Parameter des Kurskalenders, etwa eine Kategorie-Kennung. Ist ein Filter nicht gesetzt, steht dort null. Sind gar keine Filter aktiv, übertragen beide Felder ein leeres Array [] statt eines leeren Objekts.

Vollständiges Beispiel eines Ereignisses

Beispielhafter Aufbau des Schrittes Bestätigung mit allen Datenobjekten:

{
  "event_name": "semco_orders_confirmation",
  "source": "semco-course-calendar",
  "version": "1.0",
  "timestamp": "2026-08-03T10:00:00+02:00",
  "locale": "de",
  "authenticated": false,
  "course": {
    "branch_company_name": "Musterakademie GmbH",
    "course_token": "ABC-123",
    "course_title": "Erste-Hilfe-Kurs",
    "course_start": "2026-09-01T00:00:00+02:00",
    "course_end": "2026-09-02T23:59:59+02:00",
    "course_category": "Sicherheit",
    "course_presence_format": "Präsenz",
    "course_format": "Tagesseminar",
    "course_level": null,
    "course_physical_location": "Raum 1, Musterstraße 1, 12345 Musterstadt",
    "course_virtual_location": null,
    "course_price": "199.00",
    "course_currency_symbol": "EUR",
    "course_early_bird_period_active": false
  },
  "order": {
    "is_group": false,
    "payment_option": "INVOICE",
    "quotation": {
      "gross_amount": "199.00",
      "net_amount": "167.23",
      "tax_amount": "31.77",
      "items": [
        {
          "amount": "199.00",
          "count": 1,
          "price": "199.00",
          "tax_amount": "31.77",
          "type_token": "COURSE"
        }
      ]
    }
  }
}