Onboarding emails: how to structure a sequence that ends at activation
An onboarding sequence welcomes new users, asks for one setup step at a time and stops when they activate. This guide covers the structure, the timing, the events behind it and how to build it in Loops.
How to structure an onboarding email sequence
Send a welcome email at signup. Then send one email for each setup step a new user can get stuck on, and only to people who haven’t done that step yet. When the user activates, meaning they take the first action that makes your product useful, the setup emails stop and a shorter sequence about the next task takes over.
Here is the sequence for Acme, a made-up project tool. Its activation event is creating a first project.
| When | Its one job | Who gets it | |
|---|---|---|---|
| Day 0 | Welcome to Acme | Create your first project | Everyone, at signup |
| Day 1 | Your first project takes 2 minutes | The same step, with a shortcut | Not activated yet |
| Day 3 | Start from a template | Skip the blank page | Not activated yet |
| Day 6 | Want a hand with setup? | Reply to a person | Not activated yet |
| Activated | Invite your team | The next task | Activated |
Each email asks for one thing, and its button goes straight there. The onboarding email examples show how real SaaS products word these steps. A plain drip campaign sends every email on a fixed delay. A workflow also checks what the user has done before each one, which is what lets the sequence stop.
Which events start, branch and stop the sequence
Choose the activation event before you write any email. It’s the one action that people who stay have taken and people who leave usually haven’t, such as creating a project, sending a first message or connecting a data source. Every email in the sequence points at it.
Then decide what your app tells Loops at each point.
| Step | In Acme | Sent to Loops | In the workflow |
|---|---|---|---|
| Start | Someone signs up | signedUp event, with Role and Plan | Event received trigger, One time |
| Branch | An admin or an invited teammate | role contact property | Branch, one audience filter per role |
| Stop | They create a first project | projectCreated event, sets Activated to true | Audience filter on All following nodes |
Send the contact’s role and plan in the same request as the signup event. A filter only sees the data a contact has when they reach it, so a property that arrives a second later can drop people from the workflow. The trigger docs cover this case.
If admins and invited teammates set up different things, add a Branch after the trigger with one audience filter per role. Loops checks the filters from left to right, and the contact takes the first match. Leave the right-most filter empty so anyone without a role still gets a path.
When to send each email
Set the delays from how long your own users take to activate.
So Acme sends the welcome email at signup, the next one a day later and the last setup email on day 6, which offers help from a person. After that the setup sequence ends. The email frequency guide covers how these sends fit around newsletters and product updates.
Send the welcome email the moment someone signs up. They’re expecting it, so it’s the email they’re most likely to open. The welcome email guide shows the setup.
Send the events from your app
Your app knows when someone signs up and when they activate. Send both moments to Loops as events, with the contact properties the workflow filters on.
// When someone signs up await loops.sendEvent({ email: user.email, eventName: "signedUp", contactProperties: { role: user.role, plan: "trial", activated: false, }, }) // When they create their first project await loops.sendEvent({ email: user.email, eventName: "projectCreated", contactProperties: { activated: true, }, eventProperties: { projectName: project.name, }, })
Each call creates the contact if it doesn’t exist yet and saves the contact properties along with the event. Event properties, like the project name, can go straight into the email.
Build the sequence in Loops
Create a workflow with the Event received trigger on signedUp, set to run One time per contact. Add the welcome email, a Timer, then an audience filter before the setup emails.
The audience filter does the stopping. Set it to contacts whose Activated property is false, and choose All following nodes. Loops checks it again at every node below it, so once your app sets Activated to true, the contact leaves before the next email.
Then build a second workflow on the projectCreated event for the next task, starting with Invite your team. The Onboarding Drip template fits the first email, and Onboarding Nudge fits a stuck step. An AI agent can build both workflows through the Workflows API.
Workflows only pick up contacts who match the trigger after the workflow starts. To add people who signed up earlier, re-upload them with Trigger workflows turned on, as the backfill guide shows.
Trial expiry emails
Keep trial reminders in their own workflow, apart from setup. Start it from an event sent 3 days before the trial ends: your own trialEnding event, or customer.subscription.trial_will_end from the Loops Stripe app, which Stripe sends 3 days before the end date.
Add an audience filter on Plan right after the trigger, set to All following nodes, so anyone who upgrades leaves. Acme sends Your trial ends in 3 days, waits 3 days, then sends Your trial has ended. Each says what changes and links to billing. The Upgrade After Trial template has the copy, and the lifecycle email guide shows the whole workflow.
Measure whether it works
Judge the sequence by activation, the action it exists to cause. Loops shows sends, opens and clicks for each email in the workflow, and those tell you whether people read it.
To see what the emails add on top of what users would do anyway, hold a random group out of the sequence and compare their activation rate. The A/B testing guide covers holdouts and how many people each group needs, and email marketing KPIs covers conversion windows.
Common questions
What is an onboarding email sequence?
A set of automated emails that starts when someone signs up and helps them reach the first action that makes your product useful. Each email asks for one step. The sequence ends when the user takes that action, which is called activation.
How many emails should an onboarding sequence have?
A welcome email plus one email for each setup step a new user can get stuck on, so three or four in most products. Send each one only to people who haven’t done that step yet.
How long should an onboarding sequence last?
About as long as most of your users take to activate, plus a few days. Check how long your activated users took after signup. If most finish within 3 days, end the setup emails within the first week.
When should onboarding emails stop?
When the user activates. In Loops, add an audience filter set to All following nodes that only lets through contacts who haven’t activated. When your app marks a contact as activated, they leave the workflow at the next node.
What should trigger an onboarding email?
Signup. In Loops, use the Contact added trigger, or send a signup event from your app to an Event received trigger with the contact’s role and plan in the same request. Set the trigger to One time so a contact only enters once.
Should trial expiry emails be part of the onboarding sequence?
Keep them in a separate workflow. Start it from an event sent 3 days before the trial ends, and filter on the plan so customers who already upgraded get nothing.
What's next
More on product and lifecycle email.