Skip to content
couryo

Blog

SaaS onboarding email sequence: day 0, 1, 3 and 7

Build an event-triggered SaaS onboarding sequence: 5 emails with a goal and metric each, an exit when users activate, and the mistakes that cause spam.

Email that sells9 min read

View as Markdown

The user created an account, looked at the dashboard for 40 seconds and never came back. You paid for the click, they trusted you with their email, and the relationship ended there. Most of the time it is not lack of interest: they did not know the first step, or got distracted before reaching it.

An onboarding email sequence exists for exactly this: take new users to their first result, and stop talking the moment they get there. This article covers choosing the trigger, a 5-email sequence with a goal and metric for each email, how to remove people who already activated, and the most common delivery mistakes. At the end, the same sequence built in Couryo.

Before writing: what is your activation?#

Activation is the action that shows someone got the value of your product. It is not "logged in". It is something like:

  • Email API: sent their first real email.
  • Project management: created a project and invited a teammate.
  • Store: made a first purchase.
  • Course: finished the first lesson.

Write yours in one sentence. Every email in the sequence exists to get people there, and the sequence ends when it happens. If you do not know your activation, look at the customers who stayed: what did almost all of them do in the first days?

Time-based or event-based triggers?#

Time-based Event-based
How it works "3 days after sign-up, send email X" "when Y happens in the app (or does not), send X"
Example day-3 tip for everyone "created a project but did not invite anyone"
Upside simple to build and reason about talks to people about what they are actually doing
Risk sending "get started" to people who already started depends on your app sending the right events

The best sequence mixes both: time sets the pace, events decide who gets what. People enter on the sign-up event, emails go out on set days, and an activation event removes them the moment they activate.

For that, your app has to tell your email tool what happens. Two events are enough to start: sign-up and activation.

Node.js: report sign-up and activation
async function track(user, name, properties = {}) {
  await fetch("https://api.couryo.com/v1/events", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.COURYO_API_KEY}`,
      "Content-Type": "application/json",
      "Idempotency-Key": `${name}-${user.id}`,
    },
    body: JSON.stringify({
      contact: { email: user.email, attributes: { name: user.name, plan: user.plan } },
      name,
      properties,
    }),
  });
}

// At sign-up:
await track(user, "user.signed_up", { source: "website" });
// When the user completes the activation action:
await track(user, "project.activated");

The onboarding sequence: 5 emails over 12 days#

The example is a SaaS with a 14-day trial. Swap in your own activation and copy; the logic works for any product.

Email 1, day 0: welcome and first step#

  • Goal: get the person to start the activation action today.
  • Subject: Your account is ready. The first step takes 2 minutes
  • Content: what they got, one button to the activation action, an invitation to reply.
  • Metric: clicks on the button and how many activate within 24 hours.

Goes out at sign-up. Ready examples in welcome email examples that work.

Email 2, day 1: the step where people get stuck#

  • Goal: unblock people who did not activate on day one.
  • Subject: The fastest way to [activation action]
  • Content: the step where most people stall, explained in three parts, with a screenshot or short video. If there is a technical integration, the ready-to-paste snippet.
  • Metric: activation between day 1 and day 3.

This is where the sequence earns most of its keep. Look at where people stop in your product and write about that.

Email 3, day 3: one concrete use case#

  • Goal: show the outcome, not the feature.
  • Subject: How to use [Product] for [concrete task]
  • Content: a step-by-step real use example, with a template to copy ("start from this template"). No made-up testimonials: if you have no customers to quote yet, show how you use it yourself.
  • Metric: clicks on the template or example.

Email 4, day 7: "can I help?"#

  • Goal: open a conversation with people who have not activated.
  • Subject: [Name], can I help?
  • Content: plain text, no button, from a person. "I noticed you haven't [action] yet. What got in the way? Reply with one line, I read every one."
  • Metric: replies.

This email brings in the most information. Replies tell you what is missing in the product, the docs or the onboarding itself. Plain-text emails that look like they came from a person also tend to be treated better by mailbox providers than image-heavy designs.

Email 5, day 12: your trial ends in 2 days#

  • Goal: say clearly what happens when the trial ends.
  • Subject: Your trial ends on [date]
  • Content: what happens to the account and data, the price, what stays on the free plan (if any) and one button. No fake countdowns.
  • Metric: trial-to-paid conversion by the end of the trial.

Only people on the trial get it. People on the free plan leave before this step (see the condition below).

Why not one email a day? Because too much email hurts delivery: more unsubscribes, more "report spam". In Couryo, the default already stops a contact from getting more than 1 sequence email every 12 hours, across all sequences in the project.

Exits: stop emailing people who activated#

The most common onboarding mistake is to keep sending "get started" to people who already started. It annoys them, drives unsubscribes and trains them to ignore your emails.

The rule: activation ends the sequence. Whoever activates leaves immediately and, if it makes sense, enters another sequence for active users (advanced tips, team invites, the paid plan). Events do this on their own: the same project.activated that ends one sequence can start the next.

Other exits every sequence needs:

  • Unsubscribe: leaves and gets no more marketing.
  • Hard bounce or spam complaint: leaves immediately.
  • Reply: if the person replied, a conversation started. Automated emails on top of it feel strange.

How to build this sequence in Couryo#

In Couryo, a sequence starts from an event, has send, wait, condition and exit steps, and closes the enrollment as converted when the conversion event arrives. Build it as a list of steps in the dashboard, under Sequences, or through the API:

Create the onboarding sequence
curl https://api.couryo.com/v1/sequences \
  -H "Authorization: Bearer $COURYO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Trial onboarding",
    "trigger": { "type": "event", "event": "user.signed_up" },
    "conversion_event": "project.activated",
    "from": "Ana from Example <ana@example.com>",
    "reply_to": "ana@replies.example.com",
    "settings": { "quiet_hours": { "start": "21:00", "end": "08:00" }, "min_hours_between_emails": 12, "exit_on_reply": true },
    "steps": [
      { "id": "d0", "type": "send", "template_id": "onboarding-welcome" },
      { "type": "wait", "amount": 1, "unit": "days", "until": "10:00" },
      { "id": "d1", "type": "send", "template_id": "onboarding-stuck-step" },
      { "type": "wait", "amount": 2, "unit": "days", "until": "10:00" },
      { "id": "d3", "type": "send", "template_id": "onboarding-use-case" },
      { "type": "wait", "amount": 4, "unit": "days", "until": "10:00" },
      { "id": "d7", "type": "send", "subject": "{{name|Hi}}, can I help?", "text": "Hi {{name|there}}, I noticed you haven't created your first project yet. What got in the way? Reply with one line. Ana" },
      { "type": "wait", "amount": 5, "unit": "days", "until": "10:00" },
      { "type": "condition", "check": { "kind": "attribute", "key": "plan", "value": "trial" }, "if_true": "next", "if_false": "exit" },
      { "id": "d12", "type": "send", "template_id": "onboarding-trial-ending" }
    ]
  }'

What each part does:

  • trigger: the contact enters when your app sends user.signed_up. Each contact enters once.
  • conversion_event: when project.activated arrives, the contact leaves with status converted and no further email from the sequence goes out.
  • wait with until: waits the days, then until the next 10:00 in the account's time zone (or the contact's, with "timezone": "contact" and a timezone attribute on the contact). Nobody gets the day-1 email at 3 a.m.
  • condition: before the trial-ending email, checks that the plan attribute is trial; otherwise the contact exits. Conditions can also check whether the person clicked an earlier email (clicked), whether an event happened since entry (event) or whether they replied (replied), and jump ahead with { "goto": "<step id>" }.
  • exit_on_reply: anyone who replies to any email leaves the sequence. It needs a receiving domain in reply_to; out-of-office auto-replies do not count.
  • Variables with fallbacks: {{name|there}} reads "there" for contacts without a name, without breaking the email (templates).

The sequence starts as a draft. To activate it (POST /v1/sequences/{id}/activate), it needs a sender on a verified domain. If any step still has sample text from the editor ("Write here", a button with no link), activation is refused and the error names the step to fix.

You can build the emails in the visual editor, which has ready templates, and contacts and events are covered in contacts and events.

Stream: sequences go out as marketing by default, with one-click unsubscribe. The transactional stream is allowed only for account onboarding sequences started by an event; use it only if every email is about setting up the account. A trial-ending email with pricing is marketing.

Plans: the Free plan allows 1 active sequence with up to 3 emails (enough for days 0, 1 and 3). For the full sequence, Pro needs the Automations add-on; Scale includes unlimited sequences. See pricing.

Per-step metrics: what to watch#

Judge each email by its own goal, not by opens. Since Apple Mail Privacy Protection, many opens are machines, and open rate is no longer a good signal. In Couryo, the "opened" condition ignores those automatic opens, but prefer clicks when you decide.

Step Main metric Warning sign
Day 0 activation within 24 hours low delivery at one provider (check the timeline)
Day 1 activation between days 1 and 3 high clicks, low activation: the problem is in the product, not the email
Day 3 clicks on the example unsubscribes above the other steps
Day 7 replies no replies at all: check that reply_to actually receives
Day 12 trial-to-paid conversion spam complaints

GET /v1/sequences/{id}/metrics returns, per step, sent, delivered, opens, clicks, exits and conversions. GET /v1/sequences/{id}/enrollments shows each person: current step, when the next email goes out and why they left.

Deliverability mistakes that sink onboarding#

  1. A domain without SPF, DKIM and DMARC. Gmail and Yahoo have required authentication since February 2024 (Google's sender guidelines), and Outlook rejects high-volume senders without it since May 2025 (Microsoft's announcement). Start with the SPF, DKIM and DMARC guide.
  2. A new domain sending high volume on day one. Providers distrust domains with no history. In Couryo, marketing email from a new domain follows a warm-up pace; anyone who would go over the day's limit gets the email the next day.
  3. Still emailing people who activated. It drives unsubscribes and complaints. Use the conversion event.
  4. noreply@ as the sender. It shuts the door on replies, the best sign that your email is wanted.
  5. Image-only emails or link shorteners. Both are common spam markers. Always send a plain-text part along with the HTML.
  6. Click tracking on account emails. Rewriting links in a password or login email does nothing for the reader and can hurt delivery. In Couryo, tracking is off for the transactional stream by default (tracking).
  7. An imported list mixed in with new sign-ups. Old contacts who never heard from you bounce and drag your reputation down. Onboarding is for people who just arrived.

If your emails are already landing in spam, see emails going to spam.

FAQ#

How many emails should an onboarding sequence have?#

Three to five is usually enough, over 7 to 14 days. More only makes sense if each email has a clear goal and people exit when they activate. Start with 3 and add a step when the numbers show where people get stuck.

What is the difference between an onboarding sequence and a campaign?#

A sequence is individual: each person enters at their own sign-up and gets emails at their own pace. A campaign is collective: one email to a list or segment, at the same moment. Onboarding is always a sequence.

How do I remove people who already activated?#

Send an event when the person completes the activation action and set it as the sequence's conversion event. In Couryo, the contact leaves immediately with status converted and gets no further email from that sequence.

Is an onboarding sequence transactional or marketing email?#

If the emails only help set up the account, they can be transactional. Once pricing, offers or upgrades come in, it is marketing, with one-click unsubscribe. When in doubt, treat it as marketing: the unsubscribe link protects your reputation.

Do I need a developer to build the sequence?#

Not for the emails and steps: the dashboard has a list builder and a visual editor. For the events (sign-up and activation), someone has to add two API calls to the app, or use a no-code tool like n8n.