Static drip campaigns ship a sequence and hope. Adaptive Journeys ship a sequence and learn what’s working — Thompson-sampling the winning arm, measuring real lift against a global holdout, and putting a number on every workflow. Built so Pinpoint customers have somewhere to land before October 2026.
Migrating from AWS Pinpoint? See the migration guide.
What you get
Most lifecycle tools ship a journey builder and expect you to A/B test arms by hand. We ship the four pieces that make a journey actually adaptive — and they all share state, so the dashboard tells you whether the journey worked, not just whether it ran.
Thompson sampling on journey arms
Each arm has a Beta posterior over its conversion rate. The runtime samples each arm and routes the user to the highest sample. Cold-start uses deterministic round-robin until each arm has 200 subjects; then Thompson takes over. Underperforming arms aren't pruned — they're just sampled less. No retroactive re-bucketing.
Math + censoring rulesA real control group
Five percent of every workspace's end-users are deterministically assigned to a global holdout — they receive nothing from any journey. Same user, same bucket, every time. The difference between holdout and exposed conversion rates is the calibrated impact of your journey portfolio.
Determinism guaranteeAn actual lift number
Per journey: exposed-vs-holdout conversion rates with the lift % computed from real outcomes within the configured attribution window. Failed/stopped/timed-out executions are censored — you don't pay an arm penalty for our infrastructure errors.
MethodologyStep Functions + DynamoDB
One state machine. One thin dispatcher Lambda. All planning logic in pure functions. No agent loops. No mystery state. Wait-for-event task tokens survive across deploys; orphaned tokens auto-clean. Built for the Series B+ ops profile.
ArchitectureCompared
Most lifecycle platforms let you A/B test journey arms with a fixed sample size and a frequentist p-value at the end. That's slower, less honest, and answers a different question.
| Feature | Apex | Pinpoint | Customer.io | Iterable |
|---|---|---|---|---|
| Visual journey builder | ||||
| Thompson-sampled adaptive branches | ||||
| Global holdout (deterministic) | Add-on | |||
| Calibrated lift dashboard per journey | ||||
| Same engine for web + email + push experiments | ||||
| Mobile push (Capacitor) | EOL Oct 2026 | |||
| AWS-native (single-region durability) |
Migration
AWS Pinpoint reaches end-of-life on October 30, 2026. AWS's recommended path (Connect) doesn't include Journeys, In-App Messaging, Push notifications in Campaigns, Custom Channels, or Imported Segments. We do.
Step types: Trigger, Wait (duration + until-event), Branch (conditional + adaptive), Send, Webhook, Exit. Segment predicates over events + attributes + nested segments.
Email, in-app, mobile push (web + iOS + Android). Channel selection per step. Reuses your existing tenant communication assets.
Pinpoint never had a global holdout. Customer.io requires you to roll your own. We ship one in the box, with deterministic assignment and council-reviewed census rules.
How it works
The same /api/events route you already use for product analytics fires journey triggers, resumes paused waits, and credits goal events to the right arm and segment. One pipeline.
user fires user.signed_up via /api/events
matches the journey contract; assigns holdout deterministically
Step Functions runs Trigger → Wait → Branch → Send → Exit
purchase event within window credits the right segment + arm
exposed_rate − holdout_rate / holdout_rate, refreshed live