intermediate
journeys
drips
automatisierung

Journey-Builder

Mehrstufige Drips, die auf Fahrtereignisse reagieren - Eintrittsauslöser, Wait, Branch, Send, Goal, Exit.

Levy Fleets TeamMay 18, 202613 min read

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:

KnotenZweck
EntryEreignisbasierter Auslöser, der einen Fahrer in die Journey aufnimmt
WaitPause für feste Dauer oder bis zu einem anderen Ereignis
SendE-Mail, SMS oder Push mit Vorlage
BranchPrädikat auf Kundenzustand - teilt in if_true / if_false
GoalConversion-Checkpoint, der die Journey bei Erfolg verlässt
ExitTerminal-Knoten

Eintrittsauslöser

EreignisFeuert bei
customer.createdNeuer Fahrer meldet sich an
ride.endedEine Fahrt endet
ride.force_endedFahrt wurde zwangsbeendet
wallet.low_balanceWallet unter Schwelle
violation.createdVerstoß protokolliert
subscription.lapsedAbo wechselt zu canceled oder expired
rider_score.tier_changedScore-Tier ändert sich
referral.convertedGeworbener Fahrer macht erste Fahrt

Jeder Auslöser akzeptiert einen optionalen Filterausdruck. Beispiel: customer.created mit Filter marketing_email_consent = true.

Re-Entry-Regeln

RegelVerhalten
neverEinmal pro Kunde überhaupt (Willkommens-Serie)
after_cooldownWiedereintritt nach N Tagen (Win-Back)
every_triggerWiedereintritt 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

VoreinstellungAuslöserSchritte
Willkommens-Seriecustomer.created3 Sendungen + 1 Branch + 1 Goal
Win-Back 30/60/90Inaktivitäts-Scan3 Sendungen mit Branches
Niedriges Guthabenwallet.low_balancePush, E-Mail nach 4 h
LeerEigene WahlNur Entry + Exit

Journeys bearbeiten

Das Dashboard zeigt eine read-only SVG-Canvas plus JSON-Editor. Bearbeiten Sie durch:

  1. Voreinstellung starten.
  2. JSON modifizieren.
  3. Speichern (bumpt version).
  4. 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-TypVerwendung
Feste Dauerduration_hours: 48
Bis nächstes EreignisPause 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_runs werden via engage_claim_due_journey_runs mit FOR UPDATE SKIP LOCKED beansprucht.
  • Zwei gleichzeitige Worker erhalten disjunkte Mengen.
  • next_step_due_at wird 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

AktionEffekt
SpeichernBumpt version; beeinflusst keine laufenden Runs
VeröffentlichenJourney akzeptiert neue Eintritte
PausierenKeine neuen Eintritte; laufende Runs gehen weiter
ArchivierenKeine 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.