Journeys
A journey is a sequence of steps that runs for a single customer over time, triggered by an event in their lifecycle — they signed up, their trial ended, they cancelled. Use journeys for “do X, then Y a few days later, then Z” automation that’s per-customer rather than always-on.
When to use a journey
Section titled “When to use a journey”| You want… | Use |
|---|---|
| Welcome email after signup | Journey |
| Day-3 onboarding nudge | Journey |
| 14-day reactivation series for cancelled subs | Journey |
| One-off promotional banner | Paywall rule (or Campaign) |
| Coordinated multi-touch push with variant testing | Campaign (which can contain a journey) |
Rule of thumb: if you’re describing a thing that happens to one customer over time, that’s a journey. If you’re describing a thing the publication is running, that’s a campaign or a paywall rule.
How a journey runs
Section titled “How a journey runs”Each journey has a trigger event — when this event fires for a customer, that customer is enrolled and starts walking through the steps.
Supported triggers:
- Customer created — fires when a new customer is registered.
- Subscription created — fires when a customer subscribes to any plan.
- Subscription cancelled — fires when a customer cancels (whether immediately or at period end).
- Trial ended — fires when a trial expires.
Each enrolled customer gets their own state. They progress through the steps in order, advancing as each step completes (or as a wait step’s clock runs out). A customer in the middle of a journey doesn’t block other customers — every enrollment is independent.
Step types
Section titled “Step types”| Step | Effect |
|---|---|
| Wait | Pause for a duration before advancing. The unit is milliseconds in the JSON — a typical day is 86400000. |
| Send email | Send a transactional email. Tokens like {{customer.name}} are expanded at send time. |
| Show paywall | Earmark a specific paywall rule for this customer’s next visit. |
| Fire webhook | POST a small payload to one of your configured webhooks. Useful for piping the journey event into your own tooling. |
| Set / unset segment membership | Add the customer to a segment, or remove them. Powerful for chaining (“after step 4, add to high-intent segment”). |
Steps execute in order. A wait step is the only one that pauses the journey — every other step runs immediately and advances to the next.
Status
Section titled “Status”Journeys move through these statuses:
| Status | Meaning |
|---|---|
| Draft | Configured but inactive — no customers will be enrolled. |
| Active | Live. Trigger events enroll matching customers. |
| Paused | Existing runs continue, but no new enrollments. |
| Archived | Hidden from the default list. Existing runs are unaffected. |
Step 1 — Create a journey
Section titled “Step 1 — Create a journey”From the journeys list, click Create journey.
Provide:
- Name — what this journey does (“Welcome series”, “Cart-abandon nudge”, “30-day reactivation”).
- Trigger event — pick from the dropdown.
- Steps — for v1 this is a JSON array. A visual step builder is on the roadmap. Example:
[ { "type": "wait", "ms": 86400000 }, { "type": "send_email", "subject": "Welcome", "html": "<p>Hi {{customer.name}}</p>" }, { "type": "wait", "ms": 259200000 }, { "type": "send_email", "subject": "Need help?", "html": "<p>Tips for getting started</p>" }]The journey starts as a draft. No customers are enrolled yet.
Step 2 — Activate
Section titled “Step 2 — Activate”When you’re ready, click Activate on the journey card. Status flips to active.
From this point on, every time the trigger event fires for any customer, that customer is enrolled. Each enrollment runs its own copy of the steps independently.
Step 3 — Watch runs in flight
Section titled “Step 3 — Watch runs in flight”Each customer’s run shows their current step index, status, and timestamps. Use this to debug (“why hasn’t customer X received step 3?”) — usually the answer is they’re still inside a wait step.
If a step fails (e.g. a webhook returns 500), the run automatically retries up to 3 times with exponential backoff (1 minute, 5 minutes, 30 minutes). After the third failure, the run is marked errored and stops, with the last error captured for inspection. The rest of your journey runs are unaffected.
Step 4 — Pause or archive when you’re done
Section titled “Step 4 — Pause or archive when you’re done”- Pause halts new enrollments but lets existing runs finish.
- Archive hides the journey from the default list. Existing runs continue.
- Delete is permanent — and removes all the journey’s history.
Tokens in emails
Section titled “Tokens in emails”The send-email step supports the same token grammar as paywall copy:
{{customer.name}},{{customer.email}}— expanded at send time.{{publication.name}}— your publication’s display name.
Tokens that don’t resolve render as empty strings (and log a warning), so a journey with {{customer.name}} won’t break for an anonymous customer — it just produces “Hi ,”.
- Don’t trigger on high-volume events.
customer.createdfires once per customer.pageviewwould fire thousands of times — the engine deliberately blocks high-volume events from being trigger candidates. - Test with a small audience first. Journeys are real-time and irreversible (an email sent stays sent). Enroll yourself first, walk through the steps, then activate broadly.
- Be conservative with email frequency. A journey that sends three emails in a week will quickly land in spam folders. Wait at least 48 hours between consecutive sends, and respect unsubscribe.
Journeys vs campaigns
Section titled “Journeys vs campaigns”Journeys are per-customer state machines. Campaigns are publication-wide promotional pushes. They compose: a campaign can contain a journey as one of its assets, with the campaign giving you the audience targeting + variant testing + win-probability reporting on top.