Journey-Builder
Eine Journey ist ein mehrstufiger Drip, der auf Ereignisse reagiert. Während eine Kampagne "Diese Nachricht jetzt an dieses Segment senden" ist, ist eine Journey "Wenn dies geschieht, starte diese Sequenz".
Navigation
Journeys unter Engage > Journeys.
Knotentypen
Jede Journey ist ein Graph aus diesen sechs Knotentypen:
| Knoten | Zweck |
|---|---|
| Entry | Ereignisbasierter Auslöser, der einen Fahrer in die Journey aufnimmt |
| Wait | Pause für feste Dauer oder bis zu einem anderen Ereignis |
| Send | E-Mail, SMS oder Push mit Vorlage |
| Branch | Prädikat auf Kundenzustand - teilt in if_true / if_false |
| Goal | Conversion-Checkpoint, der die Journey bei Erfolg verlässt |
| Exit | Terminal-Knoten |
Eintrittsauslöser
| Ereignis | Feuert bei |
|---|---|
customer.created | Neuer Fahrer meldet sich an |
ride.ended | Eine Fahrt endet |
ride.force_ended | Fahrt wurde zwangsbeendet |
wallet.low_balance | Wallet unter Schwelle |
violation.created | Verstoß protokolliert |
subscription.lapsed | Abo wechselt zu canceled oder expired |
rider_score.tier_changed | Score-Tier ändert sich |
referral.converted | Geworbener Fahrer macht erste Fahrt |
Jeder Auslöser akzeptiert einen optionalen Filterausdruck. Beispiel: customer.created mit Filter marketing_email_consent = true.
Re-Entry-Regeln
| Regel | Verhalten |
|---|---|
never | Einmal pro Kunde überhaupt (Willkommens-Serie) |
after_cooldown | Wiedereintritt nach N Tagen (Win-Back) |
every_trigger | Wiedereintritt bei jedem passenden Ereignis (selten - Low Balance) |
Beispiel-Journey - Willkommens-Serie
┌────────────┐
│ ENTRY │ customer.created (consent = true)
└─────┬──────┘
▼
┌────────────┐
│ SEND email │ tpl_welcome_intro
└─────┬──────┘
▼
┌────────────┐
│ WAIT 48h │
└─────┬──────┘
▼
┌────────────┐ ┌───────────────┐
│ BRANCH │── true ─►│ GOAL │
│ rides ≥ 1 │ │ first_ride │
└─────┬──────┘ └───────────────┘
│ false
▼
┌────────────┐
│ SEND email │ tpl_how_to_ride
└─────┬──────┘
▼
┌────────────┐
│ WAIT 72h │
└─────┬──────┘
▼
┌────────────┐
│ SEND email │ tpl_promo_first_ride
└─────┬──────┘
▼
EXIT
JSON-Definition:
{
"entry": {
"type": "event",
"event": "customer.created",
"filters": { "marketing_email_consent": true }
},
"reentry": "never",
"steps": [
{ "id": "s1", "type": "send", "channel": "email", "template_id": "tpl_welcome_intro", "next": "s2" },
{ "id": "s2", "type": "wait", "duration_hours": 48, "next": "s3" },
{
"id": "s3",
"type": "branch",
"predicate": { "rides.total_count": { "gte": 1 } },
"if_true": "goal_hit",
"if_false": "s4"
},
{ "id": "s4", "type": "send", "channel": "email", "template_id": "tpl_how_to_ride", "next": "s5" },
{ "id": "s5", "type": "wait", "duration_hours": 72, "next": "s6" },
{ "id": "s6", "type": "send", "channel": "email", "template_id": "tpl_promo_first_ride", "next": "exit" },
{ "id": "goal_hit", "type": "goal", "name": "first_ride_taken" },
{ "id": "exit", "type": "exit" }
]
}
Eingebaute Voreinstellungen
| Voreinstellung | Auslöser | Schritte |
|---|---|---|
| Willkommens-Serie | customer.created | 3 Sendungen + 1 Branch + 1 Goal |
| Win-Back 30/60/90 | Inaktivitäts-Scan | 3 Sendungen mit Branches |
| Niedriges Guthaben | wallet.low_balance | Push, E-Mail nach 4 h |
| Leer | Eigene Wahl | Nur Entry + Exit |
Journeys bearbeiten
Das Dashboard zeigt eine read-only SVG-Canvas plus JSON-Editor. Bearbeiten Sie durch:
- Voreinstellung starten.
- JSON modifizieren.
- Speichern (bumpt
version). - Veröffentlichen.
Warum JSON-Editor?
Die erste Engage-Version nutzt read-only Canvas plus JSON. Drag-and-Drop ist geplant.
Branch-Prädikate
{ "wallet.current_balance": { "gt": 5 } }
{ "rides.total_count": { "gte": 3 } }
{ "subscription.status": { "eq": "active" } }
{ "rider_score_tier": { "in": ["gold", "platinum"] } }
Operatoren: eq, ne, gt, gte, lt, lte, in, nin, exists.
Wait-Knoten
| Wait-Typ | Verwendung |
|---|---|
| Feste Dauer | duration_hours: 48 |
| Bis nächstes Ereignis | Pause bis bestimmtes Ereignis (z. B. until: "ride.ended") |
Goal-Tracking
Ein Goal-Knoten hat einen name und gilt als erfolgreicher Exit. Goals zeigen ihre Conversion-Rate in der Journey-Analytik.
Race Conditions und Locks
Mehrere Worker können dieselbe Journey gleichzeitig voranbringen. Engage nutzt Postgres-Row-Level-Locks:
- Fällige
journey_runswerden viaengage_claim_due_journey_runsmitFOR UPDATE SKIP LOCKEDbeansprucht. - Zwei gleichzeitige Worker erhalten disjunkte Mengen.
next_step_due_atwird atomar aktualisiert.
Veraltete Daten in einer Journey
Engage vermeidet dieses Bug-Klassiker komplett. Jeder Versand löst Variablen neu auf und wertet Branches im Moment des Versands aus.
Kunde in mehreren Journeys
Ein einzelner Fahrer kann in beliebig vielen Journeys gleichzeitig sein. Das 24-Stunden-Dedup verhindert, dass dieselbe Vorlage zweimal in 24 h feuert.
Veröffentlichen und Pausieren
| Aktion | Effekt |
|---|---|
| Speichern | Bumpt version; beeinflusst keine laufenden Runs |
| Veröffentlichen | Journey akzeptiert neue Eintritte |
| Pausieren | Keine neuen Eintritte; laufende Runs gehen weiter |
| Archivieren | Keine neuen Eintritte; laufende Runs werden beendet |
Best Practices
- Branch einbauen, der bei Erfolg ausgeht.
- Realistische Wait-Dauern.
- Goals nutzen.
- Mit kleinem Segment testen.
Fehlerbehebung
Journey "veröffentlicht" aber keine Runs
Eintrittsauslöser und Filter prüfen.
Run hängt an wait-Knoten
next_step_due_at prüfen. Wenn Vergangenheit, engage-journey-Cron prüfen.
Gleiche Vorlage zweimal gefeuert
24-h-Dedup und Re-Entry-Regel prüfen.
Hilfe nötig?
Bei Journey-Fragen: support@levyelectric.com.