Kieu Buchungstool Dokumentation

Dokumentation

Anleitungen zum Pflegen von Texten und Regeln, Einrichtung von Timify, Einbindung auf kieu.de und Auswertung im Google Tag Manager.

Grundlagen

Was das Tool ist und wie der Buchungsablauf funktioniert

Überblick

Komponenten, Hosting und Datenquellen

Das Kieu Buchungstool ist ein einbettbares Online-Buchungs-Widget mit eigener Oberfläche. Im Hintergrund nutzt es die Timify Booker Services API für Standorte, Leistungen, Verfügbarkeiten und Buchungen.

Produktiv läuft das Widget auf Netlify (z. B. kieu-buchungstool.netlify.app). Auf kieu.de (Shopify) wird es per embed.js in einem Modal geöffnet — Nutzer bleiben auf der Website.

Komponente Zweck Pflege
widget.html Buchungs-UI (Iframe-Inhalt) Code-Deploy
embed.js Modal, Tracking-Weiterleitung, UTM-Übergabe Code-Deploy
public/*.json Texte & Regeln Ohne Neu-Build auf dem Server
Netlify Functions SMS-OTP über Sinch Netlify Environment

Architektur & Buchungsablauf

Schritte im Widget und Datenquellen

kieu.de (Shopify + GTM) └── embed.js öffnet Modal └── widget.html (Netlify) ├── Timify API (Standorte, Termine, Buchung) ├── content.json / ui-strings.json └── OTP → Sinch (Netlify Functions)
Schritt Screen Datenquelle
0 Standort wählen Timify companies
1 Behandlung wählen Timify Services (Karten + Accordions)
1b Zusatzleistungen (optional) content.json → addons
2 Termin wählen Timify + appointmentSuggestions
3 Kontaktdaten Formular → Timify Kundenfelder
4 SMS-Verifizierung Sinch OTP (falls aktiv)
5 Bestätigung Timify appointments/confirm

Der Stepper oben zeigt 3 Schritte: Behandlung → Tag & Uhrzeit → Kontaktdaten. Standort, Zusatzleistungen und SMS sind Teil des Flows, aber nicht als eigene Stepper-Nummer sichtbar.

Reservierung kurz erklärt

  1. Nutzer wählt Termin und füllt Kontaktdaten aus
  2. Timify reserviert den Slot (~5 Min.) via POST /reservations
  3. Sinch sendet SMS-Code (wenn OTP aktiv)
  4. Nach erfolgreicher Prüfung: POST /appointments/confirm

Texte

Überschriften, Formular-Labels, Buttons und Erfolgstexte — meist ohne Neu-Build änderbar

JSON-Dateien (Übersicht)

Welche Datei wofür — und wo sie liegt

Drei Dateien in public/ können nach dem Deploy direkt auf dem Server ersetzt werden — ohne Neu-Build. Ein Hard-Reload im Browser reicht meist aus.

Datei Inhalt Wer pflegt das?
ui-strings.json Überschriften, Labels, Buttons, Fehlermeldungen Praxis / Marketing
content.json Zusatzleistungen, Termin-Vorschlags-Regeln Praxis / Projektteam
booking-settings.json Texte auf der Erfolgsseite Praxis / Marketing

So änderst du JSON-Dateien auf dem Live-System

  1. Datei lokal bearbeiten (im Repo unter public/) oder direkt auf Netlify im Deploy-Ordner ersetzen.
  2. Per Git: Änderung committen und auf master pushen — Netlify baut neu, die JSON-Dateien landen in dist/.
  3. Alternativ ohne Git: Nur die JSON-Datei im Netlify-Deploy ersetzen (z. B. per Drag & Drop im Netlify-UI, wenn euer Workflow das erlaubt).
  4. Im Browser testen: https://kieu-buchungstool.netlify.app/widget.html mit Hard-Reload (Cmd+Shift+R).
  5. JSON-Syntax prüfen: gültige Anführungszeichen, keine trailing commas — sonst lädt das Widget die Fallback-Texte aus dem Code.

Alternative Pfade per URL-Parameter: ?ui=…&content=…&settings=…

Nur per Code-Deploy: neue UI-Keys, Design, Schriftarten, Stepper-Labels in widgetDefaults.js.

UI-Texte ändern

ui-strings.json — Überschriften, Formular, Buttons

Alle sichtbaren Texte im Widget (Überschriften, Untertitel, Formular-Labels, Buttons, Fehlermeldungen) werden aus ui-strings.json geladen. Es reicht, nur die Keys einzutragen, die ihr ändern wollt — fehlende Keys nutzen den Standard aus dem Code.

So änderst du einen UI-Text

  1. Öffne public/ui-strings.json im Projekt (oder die Live-Datei unter https://kieu-buchungstool.netlify.app/ui-strings.json).
  2. Suche den passenden Key (siehe Tabelle unten) oder trage einen neuen Key mit deinem Wunschtext ein.
  3. Speichern — JSON muss gültig bleiben (Kommas zwischen Einträgen, keine Kommas am Ende).
  4. Datei deployen (Git-Push auf master oder manuell auf Netlify ersetzen).
  5. Widget im Browser neu laden und den betroffenen Schritt prüfen.

Beispiel

{
  "selectLocationTitle": "Wähle deinen Standort",
  "selectServiceTitle": "Wähle deine Behandlung",
  "contactFormTitle": "Fülle deine Kontaktdaten aus",
  "suggestedSlotsTitle": "Für dich vorgeschlagen",
  "continueBooking": "Buchung fortsetzen",
  "preferredDoctorLabel": "Behandler:in",
  "confirmAddToCalendar": "Zum Kalender hinzufügen",
  "confirmCalendarApple": "Apple Kalender",
  "confirmCalendarGoogle": "Google Kalender",
  "confirmCalendarOutlook": "Microsoft Outlook"
}

Wichtige Key-Gruppen

Gruppe Beispiel-Keys Was du änderst
Schritt-Überschriften selectLocationTitle, selectDatetimeTitle, contactFormTitle Große Titel pro Screen
Untertitel selectLocationSubtitle, contactFormSubtitle Erklärtext unter dem Titel
Formular fieldFirstName, fieldEmail, privacyConsent Feld-Labels und Checkbox-Texte
Termin suggestedSlotsTitle, noSlots, preferredPeriodNext Termin-Auswahl und Filter
Buttons continue, back, skipAddons Aktions-Buttons
Bestätigung confirmSuccessTitle, confirmAddToCalendar Erfolgsseite (Titel, Kalender-Button)

Einzelne Keys können auch in booking-settings.json unter "ui": { … } überschrieben werden — das hat Vorrang vor ui-strings.json.

Neuer Text-Key, der im Code noch nicht existiert? Dann muss der Key in src/content/uiStrings.js ergänzt und ein Code-Deploy gemacht werden.

Bestätigungstexte ändern

booking-settings.json — Texte nach erfolgreicher Buchung

Nach der Buchung zeigt das Widget einen Erfolgstext. Welcher Text erscheint, steuert ihr über booking-settings.json — global oder pro Leistung.

So änderst du den Erfolgstext

  1. Öffne public/booking-settings.json.
  2. Unter confirmVariants den Text für visit (normaler Besuch) oder followUp (Rückruf/Kostenklärung) anpassen.
  3. Optional: Unter confirm.variant global "visit" oder "followUp" setzen — gilt für alle Leistungen.
  4. Optional: Unter confirm.serviceVariants pro Timify-Leistungs-ID eine Variante zuweisen (z. B. "69f361562c7b933ec4960f7c": "followUp").
  5. Speichern, deployen, Erfolgsseite im Widget testen (Testbuchung oder Demo-Flow).

Beispiel-Konfiguration

{
  "confirm": {
    "variant": null,
    "serviceVariants": {
      "TIMIFY_SERVICE_ID": "followUp"
    }
  },
  "confirmVariants": {
    "visit": {
      "subtitle": "Vielen Dank für dein Vertrauen. Wir freuen uns auf deinen baldigen Besuch!"
    },
    "followUp": {
      "subtitle": "Bzgl. Leistungsumfang und Kosten werden wir dich in den nächsten Tagen telefonisch kontaktieren."
    }
  }
}

Leistungs-ID finden

  • Timify → Leistung öffnen → ID aus der URL kopieren
  • Oder: Externe ID verwenden, wenn in Timify gesetzt

Termine & Buchung

Regeln für Vorschläge, Zusatzleistungen und Behandler-Auswahl

„Für dich vorgeschlagen“ anpassen

content.json → appointmentSuggestions

Der Bereich wählt automatisch freie Timify-Slots. Ihr legt Regeln fest — keine festen Termine in der JSON-Datei.

So änderst du die Termin-Vorschläge

  1. Öffne public/content.json.
  2. Trage unter appointmentSuggestionsDefaults die Standard-Regeln ein (gilt für alle Leistungen ohne eigene Regel).
  3. Für eine bestimmte Behandlung: Unter appointmentSuggestions einen Eintrag mit der Timify Externen ID oder Service-ID als Key.
  4. Speichern und content.json auf dem Server ersetzen — kein Neu-Build nötig.
  5. Im Widget die Behandlung wählen und prüfen, ob Anzahl, Abstand und Uhrzeiten passen.
Feld Bedeutung Standard
defaultPeriod Start-Wunschzeitraum: next, 2w, 3w, 4w next
dayCount Anzahl vorgeschlagener Tage (1–5) 2
timesPerDay Uhrzeiten pro Tag (1–6) 2
minDayGap Mindestabstand zwischen Vorschlags-Tagen 3
preferTimes Bevorzugte Uhrzeiten, z. B. ["09:00","10:00"] —
{
  "appointmentSuggestionsDefaults": {
    "defaultPeriod": "next",
    "dayCount": 2,
    "timesPerDay": 2,
    "minDayGap": 3
  },
  "appointmentSuggestions": {
    "ERSTBERATUNG": {
      "defaultPeriod": "2w",
      "minDayGap": 7,
      "preferTimes": ["09:00", "10:00"]
    }
  }
}

Upselling & Zusatzleistungen

Ablauf, Konfiguration und Texte

Ablauf im Widget

Nach der Auswahl einer Hauptbehandlung prüft das Widget, ob Zusatzleistungen (Upsells) hinterlegt sind. Nur dann erscheint der Screen „Zusatzleistung buchen?“ — er ist nicht als eigener Schritt im Stepper sichtbar (intern Schritt 1b).

Standort → Behandlung wählen → [optional] Zusatzleistung? ← nur bei konfigurierten Upsells ├── Zusatz wählen → Termin → Kontakt → … └── „Weiter ohne Zusatzleistung“ → Termin → Kontakt → … → [kein Upsell] direkt Termin → Kontakt → …

Wann erscheint der Upsell-Screen?

Situation Verhalten
Hauptleistung hat Einträge unter addons (oder Timify-Upsell-Daten) Upsell-Screen mit angebotenen Zusatzleistungen
Keine Verknüpfung / leeres Array Kein Upsell-Screen — direkt zur Terminauswahl
Nutzer klickt „Weiter ohne Zusatzleistung“ Upsell übersprungen, Terminbuchung wie gewohnt
Nutzer wählt eine Zusatzleistung Zusatz erscheint in der Buchungsübersicht (Name + Preis)

Was kommt woher?

Daten Quelle Pflege
Name, Preis, Dauer der Zusatzleistung Timify API (GET /companies) In Timify
Welche Hauptleistung → welche Zusätze? content.json → addons (Standard) JSON auf dem Server
Upsell-Kombinationen aus Timify Upselling App Timify API (optional, siehe addonsConfig) Timify Marketplace App
Texte auf dem Upsell-Screen ui-strings.json JSON auf dem Server

Wichtig: In content.json tragt ihr nur die Verknüpfung (IDs) ein — keine Texte oder Preise. Empfehlung: in Timify bei allen Leistungen eine Externe ID setzen (z. B. BOTOX-HAUPT), damit die JSON-Einträge lesbar und stabil bleiben.

addonsConfig — Datenquelle wählen

Steuert, woher das Widget die Upsell-Zuordnung liest:

{
  "addonsConfig": {
    "source": "content",
    "fallbackToContent": false
  },
  "addons": { … }
}
Einstellung Wert Bedeutung
source "content" (Standard) Upsells nur aus addons in content.json
source "timify" Zuerst Upsell-Felder aus der Timify-companies-Response (Upselling App)
fallbackToContent true Bei source: "timify": wenn Timify keine Upsells liefert, auf addons zurückfallen

So richtest du Upselling ein (content.json)

  1. In Timify: Haupt- und Zusatzleistung als Einzelleistung, online buchbar, jeweils Externe ID vergeben.
  2. Öffne public/content.json.
  3. Unter addons: Schlüssel = Externe ID (oder Service-ID) der Haupt-Leistung, Wert = Array der Zusatz-IDs.
  4. Speichern, auf dem Server deployen — kein Neu-Build nötig.
  5. Im Widget die Hauptbehandlung wählen und prüfen: Upsell-Screen oder direkt Termin.

Beispiel addons

{
  "addonsConfig": { "source": "content" },
  "addons": {
    "BOTOX-HAUPT": ["BLUTANALYSE-ZUSATZ"],
    "ERSTBERATUNG": [
      "AUFKLAERUNGSBOGEN",
      { "externalId": "DNA-TEST", "sameSlot": true, "hint": "Optional vor dem Termin" }
    ],
    "69f361562c7b933ec4960f7c": [
      { "serviceId": "andere_timify_id", "sameSlot": false }
    ]
  }
}

Felder pro Zusatz-Eintrag

Feld Beschreibung
Kurzer String (z. B. "DNA-TEST") Externe ID der Zusatzleistung; sameSlot: true wird angenommen
externalId / serviceId Zusatzleistung in Timify referenzieren
sameSlot true (Standard): Hinweis „Gemeinsam in einem Zeit-Slot buchbar“. false: kein Slot-Hinweis (z. B. separate Dauer)
hint Optionaler eigener Text unter der Zusatzleistung (statt Auto-Text aus Preis/Dauer)

UI-Texte anpassen (ui-strings.json)

Key Standard (Auszug) Wo sichtbar
selectAddonSubtitle „Möchtest du eine Zusatzleistung buchen?“ Untertitel Upsell-Screen
addonTitlePrefix / addonTitleSuffix „Häufig zusammen mit einem … gebucht“ Titel (Hauptbehandlung wird eingefügt)
skipAddons „Weiter ohne Zusatzleistung“ Button zum Überspringen
addonSameSlot „Gemeinsam in einem Zeit-Slot buchbar“ Meta-Hinweis bei sameSlot: true
addonDurationLabel „Dauer“ Prefix vor der Dauer (falls angezeigt)

IDs finden

ID-Typ In Timify Im JSON
Externe ID Leistung bearbeiten → Feld „Externe ID“ Als Schlüssel unter addons oder als String im Array
Service-ID Leistung öffnen → ID aus der URL, oder Konsole: services[].id Alternative zur Externen ID (intern, kann sich ändern)

Fehlersuche

  • Upsell-Screen fehlt trotz JSON: Hauptleistungs-ID stimmt nicht (Externe ID vs. Service-ID prüfen).
  • Screen leer / keine Karten: Zusatz-IDs in Timify nicht gefunden oder Leistung nicht online buchbar.
  • Browser-Konsole (F12): Warnung addons: … konnte nicht aufgelöst werden → falsche ID im Array.
  • Mit VITE_DEBUG_CONSOLE=true im Build: zusätzliche Logs zu Timify-Upsell-Feldern.

Technischer Hinweis: Die Timify Reservation-API nimmt pro Buchung aktuell eine service_id (die Hauptbehandlung). Zusatzleistungen sind in der UI und Zusammenfassung sichtbar; ob Timify sie als kombinierte Buchung speichert, bitte mit der Praxis in Timify klären.

Behandler (gezielte Auswahl)

Reihenfolge, Sichtbarkeit und Label ändern

Behandler werden aus Timify geladen (Ressourcen-Kategorie „Ärzteteam“ bzw. Name enthält „Arzt“). Es gibt aktuell keine JSON-Liste im Buchungstool. Die gezielte Behandlerauswahl ist nur verfügbar, wenn Timify für die Leistung Ärzte in availabilities.resources liefert. Maßgeblich für die tatsächliche Zuweisung ist immer Timify (Confirm-Response).

So änderst du die Behandler-Auswahl

  1. Reihenfolge: In Timify beim Behandler den orderIndex setzen — niedrigere Werte erscheinen weiter oben.
  2. Ausblenden: Leistung dem Behandler nicht zuweisen, Ressource deaktivieren oder keine Verfügbarkeiten hinterlegen.
  3. Label im UI: In ui-strings.json die Keys preferredDoctorLabel und selectPreferredDoctor anpassen.
  4. Das Dropdown erscheint nur bei Leistungen mit gezielter Behandlerauswahl (Timify liefert passende Ressourcen) — bei Pool-Leistungen wie Check-up wird es ausgeblendet.

Technik & Betrieb

Timify-Anbindung, SMS-Verifizierung und Deploy

Timify einrichten

Enterprise, Leistungen, Kundenfelder

Kieu nutzt Timify Enterprise (Branch Manager): eine Enterprise-ID, mehrere Filialen. Das Widget lädt alle Standorte und nutzt danach die company_id der gewählten Filiale.

So richtest du Timify ein

  1. Enterprise-ID aus Timify kopieren und in Netlify als VITE_TIMIFY_ENTERPRISE_ID setzen.
  2. Leistungen in Timify pflegen — jeweils Externe ID vergeben (wichtig für content.json).
  3. Kundenfelder für Online-Buchung aktivieren (Vorname, Nachname, E-Mail, Telefon).
  4. Behandler als Ressourcen in Kategorie „Ärzteteam“ anlegen.
  5. Neu-Deploy auf Netlify auslösen, damit die Environment-Variablen im Build landen.

Build-Umgebung (.env / Netlify)

VITE_TIMIFY_ENTERPRISE_ID=deine-enterprise-id
VITE_TIMIFY_LOCALE=de-de
VITE_BASE_PATH=/
VITE_OTP_ENABLED=true
SINCH_APPLICATION_KEY=…
SINCH_APPLICATION_SECRET=…
Variable Bedeutung
VITE_TIMIFY_ENTERPRISE_ID Enterprise-ID — alle Filialen unter einem Tool
VITE_TIMIFY_ACCOUNT_ID Alternative: nur eine Filiale (ohne Standortliste)
VITE_BASE_PATH Deploy-Pfad auf Netlify — Produktion Kieu: / (Root). Unterordner nur für Staging, z. B. /kieu-buchungstool/
VITE_OTP_ENABLED true / false — SMS-Schritt ein/aus

Standort-Namen, Adressen und Leistungspreise kommen aus Timify — nicht aus den JSON-Dateien.

SMS-Verifizierung (OTP)

Sinch über Netlify Functions

OTP läuft über Sinch Verification API — nicht über Timify SMS. Die Endpunkte /api/otp/send und /api/otp/verify sind Netlify Functions.

So schaltest du OTP ein oder aus

  1. In Netlify: SINCH_APPLICATION_KEY und SINCH_APPLICATION_SECRET setzen.
  2. VITE_OTP_ENABLED=true für aktiven SMS-Schritt (erfordert Neu-Build).
  3. Zum Testen ohne SMS: VITE_OTP_ENABLED=false setzen und neu deployen.
  4. Nur dist/ per FTP hochladen reicht nicht — es braucht den vollen Netlify-Deploy inkl. Functions.

Deploy & Netlify

Live schalten und Dateien aktualisieren

So bringst du Änderungen live

  1. Code-Änderungen: Committen, auf master pushen — Netlify baut automatisch (npm run build, Publish: dist).
  2. Nur Texte/Regeln: JSON-Dateien in public/ ändern und deployen — kein Neu-Build der App-Logik nötig, wenn nur JSON-Inhalt geändert wurde.
  3. Environment-Variablen in Netlify prüfen (Timify, Sinch, VITE_BASE_PATH).
  4. Test-URL: https://kieu-buchungstool.netlify.app/widget.html

Manuell vom Rechner

npm run netlify:login
npm run netlify:init
npm run netlify:env
npm run netlify:deploy

JSON-Dateien ohne Neu-Build

  • public/ui-strings.json
  • public/content.json
  • public/booking-settings.json

E2E-Monitoring

Automatische Buchungsprüfung via GitHub Actions

E2E-Monitoring

Playwright-Skript prüft den Buchungsflow automatisch

Das Monitoring führt regelmäßig eine vollständige Testbuchung durch und storniert den Termin danach automatisch. Bei Fehler wird eine Alert-E-Mail versendet. Das Skript läuft als GitHub Actions Workflow — kein eigener Server nötig.

Ablauf des Monitoring-Tests

  1. Widget öffnen (widget.html)
  2. Standort und Leistung wählen
  3. Termin ≥ 2 Tage in der Zukunft auswählen
  4. Kontaktformular mit Test-Nutzer ausfüllen
  5. OTP-Schritt: Monitoring-Code wird vom Backend zurückgegeben (kein echter SMS-Versand)
  6. Buchungsbestätigung prüfen
  7. Termin automatisch auf timify.com stornieren
  8. Bei Fehler: erneuter Versuch nach konfigurierter Pause → nach allen Versuchen Alert-E-Mail

OTP-Bypass (Monitoring-Modus)

Das Widget versendet OTP-Codes über Sinch. Im Monitoring-Modus wird Sinch nicht aufgerufen — stattdessen gibt das Netlify-Backend bei Erkennung des geheimen Headers einen festen Code zurück. Echte Buchungen von Nutzern sind davon nicht betroffen.

Einmalig einrichten

  1. In Netlify unter Environment variables hinzufügen:
    MONITORING_SECRET = zufälliger langer String
    (generieren mit: openssl rand -hex 32)
  2. Denselben Wert in monitoring/config.js unter monitoring.secret eintragen
  3. Netlify deployen (damit der neue Env-Var aktiv wird)
  4. In GitHub unter Settings → Secrets and variables → Actions folgende Secrets anlegen:
GitHub Secret Inhalt
MONITORING_SECRETGleicher Wert wie MONITORING_SECRET in Netlify
TIMIFY_ACCOUNT_IDTimify Account-ID für den Stornierungslink
SMTP_HOSTSMTP-Host für Alert-E-Mails
SMTP_PORTSMTP-Port (Standard: 587)
SMTP_USERSMTP-Benutzername
SMTP_PASSSMTP-Passwort
EMAIL_FROMAbsender-Adresse, z. B. "Kieu Monitoring" <monitor@example.de>
EMAIL_TOEmpfänger der Alert-E-Mail
USER_EMAILE-Mail-Adresse des Test-Nutzers (für Stornierung)

GitHub Actions Workflow

Der Workflow liegt unter .github/workflows/monitoring.yml und wird stündlich ausgeführt. Er kann auch manuell über Actions → Run workflow gestartet werden.

# Datei: .github/workflows/monitoring.yml (liegt im Repo)
# Läuft täglich um 09:00 und 18:00 Berliner Zeit (Sommerzeit).
# Kann auch manuell unter Actions → Run workflow gestartet werden.

# Wichtig: Playwright-Browser werden in jedem Lauf neu installiert
# (npx playwright install chromium --with-deps).
# Das ist nötig, weil node_modules/ im .gitignore ist und
# Playwright-Binaries nicht im Repo liegen.

Lokales Testen

cd monitoring/
npm install
npx playwright install chromium
cp config.example.js config.js
# config.js ausfüllen
npm run check:visible    # sichtbarer Browser
npm run check            # headless

Fehlersuche

Problem Lösung
OTP-Code wird abgelehnt MONITORING_SECRET in Netlify und config.js müssen übereinstimmen — Netlify neu deployen
Kein Slot gefunden Widget lädt Slots asynchron — config.app.timeout erhöhen
Zu viele / zu wenige Wiederholungen monitoring.maxAttempts und monitoring.retryDelayMs in config.js anpassen
Stornierung fehlgeschlagen Stornierungsurl wird im Log ausgegeben — manuell öffnen und stornieren
Alert-E-Mail kommt nicht an SMTP-Zugangsdaten in config.js prüfen — lokal mit SKIP_EMAIL=false npm run check testen
failure_evidence.png Screenshot vom Browser-Stand beim Fehler — als Artifact in GitHub Actions herunterladbar

Website & Auswertung

Einbindung auf kieu.de und Tracking im GTM

Einbindung auf kieu.de

Empfohlen: embed.js auf Shopify

So bindest du das Widget auf der Website ein

  1. Im Shopify-Theme (oder auf der Zielseite) einen Button mit data-kieu-booking-open platzieren.
  2. embed.js einmalig einbinden — mit data-widget-url und data-enterprise-id.
  3. GTM/GA4 auf kieu.de lassen — nicht auf Netlify installieren.
  4. Seite speichern, Button klicken, Modal und Buchungsflow testen.
<button type="button" data-kieu-booking-open>Termin buchen</button>
<script
  src="https://kieu-buchungstool.netlify.app/embed.js"
  data-widget-url="https://kieu-buchungstool.netlify.app/widget.html"
  data-enterprise-id="DEINE_ENTERPRISE_ID"
  data-button-label="Termin buchen"
></script>
  • embed.js leitet Tracking-Events per postMessage an die Elternseite weiter
  • UTM-Parameter der Elternseiten-URL werden ans Widget übergeben
  • Mehrere Buttons: alle mit data-kieu-booking-open, ein Script reicht

Tracking (GTM & GA4)

Buchungs-Funnel auf kieu.de auswerten

Container auf kieu.de: GTM-MJFXB3VX. Das Widget feuert Custom Events in den dataLayer; embed.js leitet sie an die Elternseite weiter.

So prüfst und nutzt du das Tracking

  1. GTM Preview auf kieu.de starten und das Buchungs-Modal öffnen.
  2. Events wie kieu_booking_step_view und kieu_booking_complete beobachten.
  3. In GA4: kieu_booking_complete als Key Event (Conversion) markieren.
  4. Funnel-Auswertung unter GA4 → Explorations anlegen.
Event Wann
kieu_booking_startBuchung gestartet
kieu_booking_step_viewSchritt angezeigt
kieu_booking_step_transitionWechsel zwischen Schritten
kieu_booking_actionKlicks (Standort, Termin, Formular, …)
kieu_booking_abandonAbbruch vor Abschluss
kieu_booking_completeBuchung erfolgreich
kieu_booking_errorFehler

Debug in der Browser-Konsole auf kieu.de:

dataLayer.filter((e) => String(e.event || '').startsWith('kieu_'))

Ausführliche GTM-Anleitung im Repo: docs/gtm-setup-dr-kieu.md und Import-Datei docs/gtm-kieu-booking-funnel-import.json.