Journey templates reference
Apex ships five starter Adaptive Journey templates that cover the most common B2B SaaS lifecycle moments. Each template is a fully-formed journey graph you can clone, customize, and publish without authoring anything from scratch.
Find them at /dashboard/communications/journeys/templates.
Choosing a template
| Template | When to ship it | Subject signal | Channels | Adaptive branches |
|---|---|---|---|---|
| Activation Onboarding | New signups in first 7 days | user.signed_up | Email + In-app + Mobile push | Conditional (did they activate?) |
| Trial Conversion | Active trial → days before expiry | subscription.trial_started | Email + In-app | Conditional + adaptive (subject-line variant) |
| Renewal QBR | 30 days before renewal date | renewal.window_open | None (linear sequence) | |
| Expansion Nudge | Detected upgrade signal | usage.upgrade_signal | Email + In-app | Adaptive (offer variant) |
| Win-back | 30 days post-cancel | subscription.cancelled | Conditional (re-engaged in window?) |
If your stack matches multiple, start with Activation Onboarding. It's the most heavily exercised pattern and gives you a working journey within minutes.
What each template ships
Activation Onboarding (6 steps)
Trigger: user.signed_up
↓
Send: welcome email ← marketing comm
↓
Wait: 3 days
↓
Branch: did the user activate? ← conditional
↙ yes ↘ no
Exit Send: re-engagement
↓
Exit
Why these defaults? Conditional branch (not adaptive) at step 4 because there's nothing to optimize — you only re-engage users who didn't activate. The 3-day wait pulls from research showing the highest activation lift comes from a 24-72h follow-up, not 12-hour or 7-day.
Common customizations:
- Replace the welcome comm with your real brand-voiced welcome.
- Add an in-app push at step 3 instead of (or alongside) the email.
- Switch the branch to adaptive if you have multiple re-engagement messages — Thompson sampling will discover which works best.
Trial Conversion (4 steps)
Trigger: subscription.trial_started
↓
Wait: until 3 days before trial expiry ← wait-for-event with deadline
↓
Send: T-3d nudge ← marketing comm
↓
Wait: until 1 day before trial expiry
↓
Send: T-1d urgency comm
↓
Exit
Why these defaults? Industry studies (Drift, Intercom, Userpilot) show ~60% of trial conversions happen in the last 48h. Two well-timed nudges at T-3d and T-1d outperform daily emails which fatigue the user.
Common customizations:
- Add a T-7d "you're halfway through" educational email if your trial is 14d+.
- Convert the T-1d email to an adaptive branch comparing "discount" vs "education-only" copy variants.
Renewal QBR (3 steps)
Trigger: renewal.window_open (~30 days before renewal date)
↓
Send: renewal-prep email ← QBR scheduling CTA
↓
Wait: 14 days
↓
Send: renewal-confirmation reminder
↓
Exit
Why no branch? This template is intentionally linear. Renewal flows that branch on engagement risk over-personalizing in ways customers find creepy ("I see you haven't logged in — are you cancelling?"). Add a branch only if you have a clear pre-cancellation save mechanism.
Expansion Nudge (4 steps)
Trigger: usage.upgrade_signal (e.g. usage > tier limit)
↓
Send: usage-summary email ← educational, no push
↓
Wait: 5 days
↓
Branch: adaptive — offer variant
↙ A: free 14-day trial ↘ B: 20%-off-first-month
Send (in-app) Send (in-app)
↓ ↓
Exit Exit
Why adaptive here? The lift between "free trial" and "discount" varies wildly by ICP and tier. Thompson sampling discovers which arm wins for your audience without you having to guess.
Win-back (5 steps)
Trigger: subscription.cancelled
↓
Wait: 30 days ← cooldown — too soon = annoying
↓
Send: win-back email ← marketing comm
↓
Wait: 7 days
↓
Branch: conditional — did they re-engage?
↙ yes (event observed) ↘ no
Exit Send: final nudge (discount)
↓
Exit
Why a 30-day cooldown? Sending a win-back the day after cancel triggers backlash. 30 days lets the customer feel the absence of your product. The 7-day branch wait gives the first email time to land before the final nudge.
Cloning a template
- Open
/dashboard/communications/journeys/templates. - Click Use template on the one you want.
- Apex creates a new draft journey with the full graph, audience, and trigger pre-wired.
- The canvas opens automatically.
The cloned journey is independent — edits don't propagate back to the template. You can clone the same template multiple times (e.g. a "growth-tier" Activation Onboarding and a "free-tier" variant).
Authoring your own templates
Phase 1 templates are seeded from app/src/lib/journeys/seeds/. They're TypeScript objects with the same AdaptiveJourney shape your runtime uses, validated by 9 invariant tests (no SMS, every next resolves, conditional-only branches in v0).
If you want to ship a workspace-specific template that other authors can clone, the simplest path today is to publish a journey, then duplicate it from the canvas's "Duplicate" button. Custom-template-as-first-class-object is a Phase 2 feature.
What's not in any template (and why)
- SMS — not part of Phase 1 channel set. Regulatory + carrier-relations + 10DLC overhead is too much for v1.
- Multi-touch attribution branching — Phase 1 uses single-attribution-window estimands. Multi-touch lands in Phase 2.
- Reverse triggers ("don't trigger if X is true") — use NOT predicates in the audience builder, not the trigger contract.
Related
- Building your first journey — end-to-end walk-through
- Adaptive Journeys — system overview
- Journey Audiences — predicate language
- Adaptive Branches — Thompson sampling reference