Loading tutorials…
Loading tutorials…
Segments are how Customer.io decides who. Workflows are how it decides when and what. Most SaaS teams get one or the other right but rarely both — and the gap shows up as activation campaigns missing 40% of eligible users.
Who this is forSaaS lifecycle marketers building their first onboarding, activation, or retention workflow in Customer.io. Or teams whose workflows have grown organically and now overlap, conflict, or send users 5 emails in a day.
What you'll need
Step 1
Data-driven segments update automatically as user attributes/events change. Manual segments are static lists. 90% of SaaS use cases want data-driven.
Segments → + Create Segment. Choose Data-driven (updates live) vs Manual (CSV upload, static list).
Data-driven for: 'Active in last 7 days,' 'Paying customers on Pro plan,' 'Users who hit activation event but no second product action.' These should be 95% of your segments.
Manual only for: one-off blasts ('the 200 users who attended our webinar'), legal/compliance lists, beta cohorts. If you find yourself uploading a CSV more than once a month, that segment should be data-driven.
Name segments with a prefix convention: `Lifecycle: Activated`, `Lifecycle: At Risk`, `Plan: Pro`, `Plan: Free`, `Behavior: Power User`. Prefix helps when you have 30+ segments and need to find one fast.
Step 2
Most SaaS teams need 8-12 lifecycle segments to power 90% of messaging. Build these before any workflow.
`Lifecycle: Trial Active` — created_at within last 14 days AND is_paying == false AND trial_ended_at is empty.
`Lifecycle: Trial Expired Not Converted` — trial_ended_at within last 30 days AND is_paying == false.
`Lifecycle: Activated` — has performed activation event AND active in last 30 days. (Define 'activation event' for your product — first project created, first AI call, first invite accepted, whatever.)
`Lifecycle: At Risk` — was active in last 30-60 days AND not active in last 14 days AND is_paying == true.
`Lifecycle: Churned` — last_seen_at > 60 days AND is_paying == false.
`Lifecycle: Power User` — performed core event 20+ times in last 30 days.
`Plan: Free`, `Plan: Pro`, `Plan: Enterprise` — by plan attribute.
`Geo: EU` — country in [EU country list]. Useful for GDPR-specific consent flows.
Test each segment: click the segment, check People count, spot-check 5 profiles. If a profile shouldn't be there, the segment logic is wrong.
Step 3
Journeys → + Create Journey. Trigger: Event = `Account Created`. Build 4-5 steps over 14 days.
Customer.io → Journeys → + Create Journey. Name it `Onboarding Series v1`.
Trigger: Event Performed → `Account Created`. Exit conditions: 'Account Created' won't trigger again on the same user. Add a frequency cap: 1 per user, ever.
Goal: define what successful completion looks like. Most onboarding journeys use `Activation Event Hit` as the goal. Users who hit the goal exit the journey early.
Step 1 (Day 0, 5 min after trigger): Email — Welcome + 'here's how to get started in 5 min.'
Step 2 (Day 1): Conditional Branch — did user hit activation event? If yes → exit journey. If no → continue.
Step 3 (Day 1, after branch): Email — addresses the most common onboarding blocker for your product (depends on product).
Step 4 (Day 3): Conditional Branch + Email — same pattern.
Step 5 (Day 7): Final nudge email + add to `Trial Risk` segment for sales follow-up if applicable.
Critical: set the journey's 'exit on goal' to ON. Users who hit `Activation Event Hit` should leave the journey immediately, not get the rest of the emails.
Step 4
Settings → Communication Preferences (or per-workflow settings). Cap users at 1 marketing email/day across ALL workflows. Set global exit conditions.
Settings → Workspace Settings → Communication Limits (or similar; UI evolves) → set workspace-wide cap: max 1 marketing email per user per day.
Per-workflow settings → Frequency cap: 'no more than 1 message every 24 hours from this workflow.' Set this per workflow as a safety net.
Global exit: in each workflow, configure 'Exit if user enters segment `Unsubscribed All`' AND 'Exit if user is in segment `Churned`' AND 'Exit if user is in segment `Suppress Marketing`'. This prevents lifecycle messages going to people who've signaled they don't want them.
Audit existing workflows: in Journeys → Active, click each workflow → check exit conditions. Anything without these globals is a deliverability risk.
Step 5
Beyond onboarding, the 4 highest-ROI SaaS workflows: Activation Stall, Plan Upgrade Nudge, At-Risk Re-engagement, Win-Back.
**Activation Stall**: Trigger = Event = `Account Created`. Branch at Day 7 — did user hit activation event? If no, send 2-3 nurture emails focused on first-task completion. Goal = `Activation Event Hit`. Typical lift: 8-15% activation rate improvement.
**Plan Upgrade Nudge**: Trigger = Segment Entry = `Plan: Free` AND `Behavior: Power User`. Email series highlighting paid features. 3 emails over 10 days. Goal = `Subscription Started`. Typical conversion: 3-7% of segment to paid.
**At-Risk Re-engagement**: Trigger = Segment Entry = `Lifecycle: At Risk`. Email series asking for feedback, offering help, suggesting forgotten features. 3 emails over 14 days. Goal = re-engagement (defined as core event fired). Typical recovery: 15-30% of at-risk users.
**Win-Back**: Trigger = Segment Entry = `Lifecycle: Churned` AND 30+ days since last seen. 2-3 emails over 21 days. Light, no aggressive selling. Goal = login or core event. Recovery rate: 2-8%, but cheap to run.
Build each workflow as a separate journey. Don't cram into one — debuggability matters.
Step 6
Use Customer.io's test mode + a sample user account. Fire the trigger event, watch each step execute.
In your test/staging workspace (you set this up in the account-setup tutorial, right?), create a fake test user.
Fire the workflow's trigger event from your backend or via the Customer.io UI's 'Send sample' button.
Watch the Journey → click the workflow → Activity tab. Each user that enters appears with their current position in the workflow. Verify your test user appears and progresses through steps on schedule.
Test the conditional branches: fire the activation event for the test user. They should hit the goal and exit. Repeat without firing — they should continue through later steps.
After testing in Staging, switch to Production workspace and turn workflow status to Live. Watch the first 24-48 hours of real users carefully.
Step 7
Per-workflow analytics: Conversion Rate (goal-hit %), Email opens, clicks, unsub. Tune the lowest-performing email first.
Journeys → click a workflow → Performance tab.
Healthy SaaS onboarding workflow benchmarks: Email 1 open rate 40-60% (welcome emails are high-open), Email 2-4 open rate 25-40%, Goal conversion rate 20-40% of entries.
If Email 1 open is below 30%, sending domain reputation or subject line is the issue.
If goal conversion is below 15%, the content isn't driving action — rebuild the activation-blocker email.
Tune one variable at a time: subject line, send time, or content. Run for 2 weeks to gather stat-sig data before judging.
Re-audit workflows quarterly. SaaS lifecycle moments shift as products evolve.
Common mistakes
Triggering workflows on segment entry when events would fire faster
What goes wrong: Segment-entry triggers can lag the action by hours on large segments. Your 'welcome email' arrives 4 hours after signup instead of 5 minutes. Conversion drops because users have forgotten signing up. Activation rate drops 5-12%.
How to avoid: Use Event triggers for any time-sensitive workflow (onboarding, signup, first action). Use Segment-entry triggers only for slow-moving lifecycle transitions ('moved to at-risk').
No global frequency cap, overlapping workflows hammer users
What goes wrong: A power user signs up, activates, upgrades, and uses the product daily. They're now eligible for: onboarding workflow, plan upgrade nudge, feature announcement broadcast, weekly newsletter, NPS request. Without caps they get 5 emails in 2 days. Unsubscribe rate spikes from 0.4% to 3-5%, costing 20-40% of list over a quarter.
How to avoid: Set workspace-wide cap: 1 marketing email per user per day. Set per-workflow caps as a safety net. Audit existing workflows for overlap quarterly.
No "exit on goal" set on onboarding workflows
What goes wrong: Users who activate on Day 1 still get the 'haven't activated yet, here's help' emails on Day 3 and Day 7. Looks broken. Drops trust in your product communication. NPS subtly drops by 3-5 points.
How to avoid: Every workflow has a goal. Configure "Exit on Goal" in workflow settings. Users who hit the goal exit immediately. This is a 30-second fix that prevents months of confusion.
Segments built off raw event filters instead of lifecycle attributes
What goes wrong: Segments like 'fired event X 3+ times in 14 days' are fragile — they break when event schema changes. Workflows referencing them silently stop triggering. Activation campaign coverage drops 30-50% before anyone notices.
How to avoid: Build a `lifecycle_stage` attribute on each profile, computed by your backend (or via Customer.io segment-driven attribute updates). Segments reference the attribute, not raw events. Schema changes propagate cleanly.
Manual CSV segments used as workflow triggers
What goes wrong: Marketer uploads a static CSV monthly. The 200 users in last month's CSV are still in the workflow today — new signups never enter. Workflow effectively becomes a one-time blast. Stops contributing to activation lift by Day 30.
How to avoid: Convert to data-driven segment if at all possible. If the segment must be CSV (legal/compliance reasons), schedule the workflow as a Broadcast instead of a Journey — clearer mental model.
No suppression for unsubscribed-from-all users
What goes wrong: Users who hit Unsubscribe stay on transactional + system emails (correct) but also continue getting marketing workflow emails (wrong, illegal under CAN-SPAM/GDPR). Spam complaint rate creeps from 0.05% to 0.4%+. Deliverability tanks.
How to avoid: Every marketing workflow exits on `Unsubscribed All` segment entry. Settings → Communication Preferences → ensure the unsubscribe link maps to a workspace-level marketing-suppression flag, not just the current workflow.
Recap
Done — what's next
How to build Customer.io email campaigns that ship clean and deliver
Read the next tutorial
Hand it off
Workflow architecture is where Customer.io specialists pay for themselves fastest. A specialist who's launched 50+ SaaS lifecycle programs builds the 4-5 highest-ROI workflows (onboarding, activation stall, upgrade nudge, at-risk, win-back) in 2-3 weeks — typically $1,800-3,500 at $14-16/hr. The activation lift alone usually pays for the work in 60 days.
See specialist rates
Most healthy SaaS lifecycle programs run 8-15 active workflows: onboarding, activation stall, plan upgrade, feature adoption nudges (1-3), at-risk re-engagement, win-back, payment failure recovery, expansion (new feature announcements), and 1-2 segment-specific nurtures. More than 25 active workflows usually means overlap problems.
Journeys (workflows) are multi-step automations triggered by events or segment entry — used for lifecycle programs. Broadcasts are one-time scheduled sends to a segment, used for product announcements, webinar invites, etc. Newsletters are a special type of broadcast with content blocks like a digest — used for recurring weekly/monthly updates. Use the right one for the use case.
Real-time for new event-based qualifications. For segments based on complex profile attribute logic, recalc happens every 5-15 minutes on small/medium segments (<100K profiles) and hourly on large ones. If a workflow trigger seems delayed, check whether the trigger references a segment that recalcs slowly — switch to an Event trigger if speed matters.
If you have a data warehouse (Snowflake, BigQuery, Redshift) and a reverse ETL tool (Hightouch, Census), compute lifecycle stage in SQL and sync it as a Customer.io profile attribute. This scales better past 500K users and keeps a single source of truth. Smaller teams (<100K users) can do it natively in Customer.io with data-driven segments.
Inside a Journey, drag a 'Random Branch' block. Set split (50/50 or whatever). Each branch contains a different email variant. Run for 2-4 weeks. Performance tab shows conversion rate per branch. Pick a winner, replace the loser with the winner's content. This is how you compound performance over time.
Yes — Journeys support all channels. Drop an SMS block, Push block, or In-App block instead of an Email block. Multi-channel lifecycle programs (email + push for mobile users) typically lift activation by another 5-12% beyond email-only programs. See the dedicated multi-channel tutorial for setup.
Customer.io
Customer.io's email side has three distinct surfaces — Broadcasts, Newsletters, and Transactional — and each has its own rules. Mix them up and you'll send marketing content from your transactional IP (bad) or transactional from your marketing IP (worse).
Customer.io
Email + SMS + Push is the canonical SaaS lifecycle trifecta. Adding SMS lifts onboarding completion 8-15%. Adding push lifts re-engagement on mobile apps 20-35%. The setup is one weekend of work, ongoing.
Customer.io
In-app messaging closes the gap email can't reach — the user who is actively using your product right now. Banners, modals, slideouts, and inline messages reach users at the exact moment of intent.
Customer.io
Liquid is what turns Customer.io from 'mass blast tool' into 'one-to-one personalization at scale.' Knowing the right 20% of Liquid syntax — variables, defaults, conditionals, filters — covers 95% of SaaS personalization use cases.
Customer.io
DIY Customer.io is the right call — until it isn't. In healthy SaaS, lifecycle email + in-app should drive 20-35% of activation and 10-20% of retention. If yours is at 5-10%, the gap is the program isn't being worked. Here's the honest framework for when to hire.