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.

WhenEmailIts one jobWho gets it
Day 0Welcome to AcmeCreate your first projectEveryone, at signup
Day 1Your first project takes 2 minutesThe same step, with a shortcutNot activated yet
Day 3Start from a templateSkip the blank pageNot activated yet
Day 6Want a hand with setup?Reply to a personNot activated yet
ActivatedInvite your teamThe next taskActivated
Example sequence. The setup emails stop the day a user creates a project.

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.

StepIn AcmeSent to LoopsIn the workflow
StartSomeone signs upsignedUp event, with Role and PlanEvent received trigger, One time
BranchAn admin or an invited teammaterole contact propertyBranch, one audience filter per role
StopThey create a first projectprojectCreated event, sets Activated to trueAudience 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.

3 days
Of the 410 Acme users who created a first project in their first week, 328 did it within 3 days of signing up.
Time to activate = time from signup to the activation event, for each user who activated
No public benchmark: count it from your own recent signups.

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,
  },
})
Loops JavaScript SDK. The Send event API endpoint takes the same fields.

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.

Event received
signedUp
Send email
Welcome to Acme
Timer
Wait 1 day
Audience filter
by Activated
Send email
Your first project takes 2 minutes
Timer
Wait 2 days
Send email
Start from a template
Timer
Wait 3 days
Send email
Want a hand with setup?
Exit workflow
The filter is set to contacts whose Activated property is false, on All following nodes.

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.

41%
410 of Acme’s 1,000 March signups created a first project within 7 days.
7-day activation rate = signups who activated within 7 days ÷ all signups in the same period
No public benchmark: compare it with your own rate before the sequence started.

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.

See all guides