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.
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_groupist danntrue).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_confirmationerneut 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_indexundsemco_e_learning_indexwerden 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 mitNumber(...)um, bevor Sie damit rechnen. nullbedeutet: an diesem Schritt beziehungsweise für diesen Kurs (noch) nicht verfügbar.
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 (""). |
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.| 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.
| 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 |
| 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 |
| 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:
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 |
| 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 |
| 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"
}
]
}
}
}
