A journey builder makes it easy to draw a line of boxes with waits between them. That is a schedule, not a journey, and it behaves the same whether the customer is delighted, furious or already finished. The symptoms are familiar: "complete your purchase" after the purchase, a reminder after the cancellation, three teams' messages landing on one person in one afternoon. All of them come from four structural decisions that nobody made explicitly. Make them first; write the content afterwards.
The four decisions, on one page#
What each decision protects you from
A journey with no exit is a subscription nobody agreed to. Success has to end it too, not just unsubscribe.
Silence is not consent to continue. Decide whether no reply means retry, branch or stop — before launch.
Set at the step, not at the journey. A reminder and a receipt do not belong on the same transport.
Across every journey a person is in, not within this one. This is the only one that needs a global view.
Decision one: what ends it#
Before drawing anything, define the exit conditions.
- Positive exits: the outcome you wanted — booked, paid, replied, resolved.
- Negative exits: complained, unsubscribed, asked for a human, marked as spam.
- Neutral exits: the journey's purpose expired (the appointment date passed, the offer ended).
Every exit must remove the person immediately and everywhere, including from steps already queued in a sending system. A journey without exits keeps messaging people who have already done the thing.
Should this person still be in the journey?
- 01Did they do the thing — book, pay, reply, resolve?YesPositive exitNo
- 02Did they complain, unsubscribe, ask for a human, or mark it as spam?YesNegative exitNo
- 03Has the journey's purpose expired — the date passed, the offer ended?YesNeutral exitNoStay in, and take the next step
Decision two: what silence means#
Every wait needs at least two branches: it happened, or it did not. And "did not" is several situations:
| Silence type | What it may mean | Sensible next step |
|---|---|---|
| Not delivered | Wrong number, blocked, channel unavailable | Try another channel you hold consent for, or fix the data |
| Delivered, not read | Not now, or not this channel | Wait, then try a different channel |
| Read, no action | Not interested, or did it elsewhere | Check other systems for the outcome before sending more |
(Read receipts exist on WhatsApp and RCS, and users can switch them off; SMS has none, so "not read" is often unknowable there.)
A workable default: silence at step one changes the channel; silence at step two changes the message; silence at step three exits. Log the exit reason, so somebody can count them later.
A workable default for silence
- 01Silence at step one
Change the channel
- 02Silence at step two
Change the message
- 03Silence at step three
Exit — and log the reason, so somebody can count them
Decision three: the channel for each step#
The channel is a property of the step, not of the journey. A first notice and a final reminder can reasonably use different channels, because urgency changed and because you learned between them which channel this person reads. Any fallback re-checks consent for the new channel rather than assuming it — see choosing a channel per message.
Decision four: the frequency ceiling#
A rule above every journey that caps how many messages one person receives in a period, across all journeys and channels. It is the single control that prevents the most common failure in this field: three well-designed journeys, each reasonable alone, running on the same person at once.
What the ceiling needs to see
- Contact record
The person, not the address. Two channels reaching the same human is still one human.
- Every active journey
Including the ones another team owns. A ceiling that only sees your journeys is not a ceiling.
- Sends in the window
Rolling, per person, across channels. Seven days is the usual unit and the usual argument.
- Priority class
Which message wins when the ceiling is hit. A fraud alert beats a win-back, every time.
- Suppression log
What was not sent, to whom, and why. Otherwise the ceiling is invisible and gets quietly raised.
- Consent ledger
The ceiling is a courtesy; consent is a veto. They are different checks and both run.
Whoever owns the ceiling must sit above the teams that own individual journeys. If every team can raise its own cap, there is no cap. This holds whether journeys run in a dedicated journey platform, a marketing tool or your own code: whatever runs them, the ceiling must see all of them.
A worked example#
A clinic network sends appointment reminders.
- Step 1 (72 hours before): WhatsApp utility template if WhatsApp consent exists, otherwise SMS. Buttons: Confirm / Reschedule.
- Branches: Confirmed → exit (positive). Reschedule → hand to booking flow, exit this journey. Not delivered → SMS if consented. No action after 24 hours → step 2.
- Step 2 (24 hours before): a shorter message on the other channel, if consent allows.
- Step 3: none. Silence after two attempts exits with reason "no response"; the front desk sees a flag.
- Global rules: a patient cancelling by phone triggers the cancellation exit through the booking system's event; the ceiling allows at most three non-urgent messages per patient per week; appointment reminders outrank marketing.
Before launch, the team set a review date three months out to check how many patients took each branch.
The clinic reminder, from first message to exit
- Step 1
WhatsApp utility template if WhatsApp consent exists, otherwise SMS — Confirm or Reschedule
- Branch
Not delivered goes to SMS if consented; no action moves to step 2
- Step 2
A shorter message on the other channel, if consent allows
- Exit: "no response"
No third step; the front desk sees a flag
Testing it#
The happy path is the one case that was designed deliberately, so it is the least useful to test.
- Walk it as a person. Enrol yourself on a real phone. Reply oddly, reply late, ignore one step and answer the next.
- Test the exits. Convert halfway and check messages stop. Unsubscribe at step two and check step three never fires.
- Test overlap. Put one test person in three journeys at once. That is the case the ceiling exists for.
- Name and count every branch. A branch nobody takes is either dead logic or a bug.
Tests the happy path will not run for you
- Walk it as a person
A real phone; reply oddly, reply late, skip a step
- Test the exits
Convert halfway; unsubscribe at step two and check step three never fires
- Test overlap
One test person in three journeys at once — the case the ceiling exists for
- Name and count every branch
A branch nobody takes is dead logic or a bug
Give every journey an end date#
Journeys outlive their reasons. Set a review or expiry date on launch day, with an owner. At review, look at branch counts, exit reasons and unsubscribes per step, and retire what no longer earns its sends.
Where to go next#
Next in this track: the support queue as a system, where many journeys end. For the consent checks every branch depends on, read consent architecture.