Growth Engineering

Email Sequences for SaaS Onboarding: What to Send and How to Build It

Most SaaS onboarding email sequences fail because they're either too generic or too aggressive. Here's the structure that works — with timing, copy principles, and the API calls to automate it.

11 min read·Updated March 2026

When a user signs up for your SaaS, you have about 10 minutes of genuine attention before they move on. A well-designed onboarding email sequence is how you earn back that attention later — guiding them toward the activation moment that separates retained users from churned ones.

1. Why sequences outperform one-off emails

A single welcome email is better than nothing, but it has a fundamental problem: it arrives when users don't yet know what they don't know. They just signed up — they haven't hit any obstacles yet, haven't reached any milestones, and can't fully appreciate which features matter.

Email sequences solve this by distributing guidance over time, aligned with where users actually are in the product. Email 1 arrives when they're excited. Email 3 arrives when they might be getting stuck. Email 5 arrives when they're deciding whether to upgrade.

Single welcome email

  • · Arrives before user has context
  • · Can't react to user behavior
  • · No second chance if ignored
  • · Loses relevance after day 1

Onboarding sequence

  • · Meets users at each stage
  • · Can stop when user activates
  • · Teaches over time, not all at once
  • · Converts users who didn't engage early

The data backs this up: for most B2B SaaS products, a 5–7 email onboarding sequence that stops when users complete key actions has 2–3x better activation rates than a single welcome email.

2. The 5-email onboarding framework

Here's the sequence structure that works for most SaaS products. Adjust the specific content to match your activation events.

1

Welcome + single next step

Sends immediately

This email does one thing: tell the user the single most important thing to do next. Not five things — one. The goal is to get them to their first activation event (create a project, invite a teammate, connect an integration).

Subject line examples:

  • · "Welcome to [Product] — here's your first step"
  • · "You're in. Start here →"
  • · "One thing to do before you close this tab"
2

The "did you get started?" email

Day 2

Sent only if the user hasn't completed the activation step. Short, low-pressure, acknowledges that they're probably busy. Repeat the single CTA from email 1 — don't introduce new features.

Subject line examples:

  • · "Still getting started? Here's a shortcut"
  • · "5 minutes to your first [outcome]"
3

Value proof / case study

Day 4–5

Not a tutorial — a story. How did another customer (similar role, similar problem) use your product to get a specific result? Make the outcome concrete: "reduced support time by 40%", "shipped in one week instead of three." This is the email that overcomes doubt.

4

Feature spotlight (the thing they haven't found yet)

Day 7

Every product has a feature that dramatically changes how people use it — but that most users don't discover on their own. Email 4 introduces that feature. Not all features, just the one that causes "aha" moments most reliably.

5

Upgrade / commitment offer

Day 12–14

By day 12, users have either activated or they haven't. For those who have: introduce a reason to upgrade (feature they need, usage limit they're approaching). For those who haven't: a final helpful prompt before you reduce email frequency. Don't just pitch — offer something useful.

3. Timing: when to send each email

Timing is where most onboarding sequences get it wrong. Two rules:

1. Stop the sequence when users activate. If someone has already completed the step you're nudging them toward, sending that email is counterproductive — it signals you're not paying attention. This requires behavioral triggers, not just time-based sends.

2. Respect business hours. If your product is B2B, send at times when professionals check email: Tuesday–Thursday, 8am–11am in the recipient's timezone. Most email APIs can handle timezone-aware sending if you store the user's timezone on signup.

EmailTrigger conditionStop condition
1. WelcomeSignup confirmedNever (always send)
2. Nudge+24h, if not activatedUser completes activation
3. Case study+4 days from signupUser cancels or unsubscribes
4. Feature spotlight+7 days from signupUser cancels or unsubscribes
5. Upgrade offer+12 days from signupUser upgrades or cancels

4. Implementation: building the sequence in code

There are two ways to build this: with a purpose-built sequence tool, or by wiring it yourself in application code. Here's the tradeoff:

Option A: Use a sequence API (recommended)

Services like tinysend let you define the sequence once and enroll users with a single API call. The service handles timing, unsubscribes, and stopping conditions.

// Enroll user in onboarding sequence on signup
async function enrollInOnboarding(user) {
  await fetch('https://api.tinysend.co/v1/sequences/onboarding-v2/enroll', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.TINYSEND_API_KEY}`,
      'Content-Type': 'application/json',
      'X-Idempotency-Key': `enroll-onboarding-${user.id}`,
    },
    body: JSON.stringify({
      email: user.email,
      variables: {
        first_name: user.firstName,
        product_url: `https://app.example.com/dashboard`,
        activation_url: `https://app.example.com/getting-started`,
      }
    })
  })
}

// Call immediately after email verification
await enrollInOnboarding(newUser)

Option B: Build it yourself with a job queue

If you're using a job queue (Bull, Sidekiq, Celery), you can schedule each email as a delayed job. More control, more maintenance.

// Using Bull (Node.js) — schedule all 5 emails on signup
import Queue from 'bull'
const emailQueue = new Queue('emails')

async function scheduleOnboardingSequence(user) {
  const delays = [
    { template: 'welcome',         delay: 0 },
    { template: 'nudge',           delay: 24 * 60 * 60 * 1000 },      // 1 day
    { template: 'case-study',      delay: 4 * 24 * 60 * 60 * 1000 },  // 4 days
    { template: 'feature-spotlight', delay: 7 * 24 * 60 * 60 * 1000 }, // 7 days
    { template: 'upgrade-offer',   delay: 12 * 24 * 60 * 60 * 1000 }, // 12 days
  ]

  for (const { template, delay } of delays) {
    await emailQueue.add(
      { userId: user.id, template },
      { delay, jobId: `onboarding-${user.id}-${template}` } // idempotent job ID
    )
  }
}

// Job processor
emailQueue.process(async (job) => {
  const { userId, template } = job.data
  const user = await User.findById(userId)

  // Skip if user already activated (for nudge email)
  if (template === 'nudge' && user.activatedAt) return

  // Skip if user cancelled or unsubscribed
  if (user.cancelledAt || user.unsubscribedAt) return

  await sendEmail({ to: user.email, template, variables: { user } })
})

5. Triggering sequences from your app

The right place to enroll users in an onboarding sequence is immediately after email verification — not at initial signup. Reason: if a user never verifies their email, you're sending onboarding emails to a dead address.

// Enroll after email verification (Express example)
app.get('/verify-email', async (req, res) => {
  const { token } = req.query
  const user = await verifyEmailToken(token)

  if (!user) return res.status(400).send('Invalid token')

  // Mark verified
  await user.update({ emailVerifiedAt: new Date() })

  // Enroll in onboarding sequence
  await enrollInOnboarding(user)

  // Redirect to app
  res.redirect('/dashboard?onboarded=true')
})

Stopping the sequence when users activate

Define your activation event clearly — it should be the single action that predicts retention most strongly. For a project management tool, it might be "created first project AND invited a teammate." Fire a stop event when this happens:

// When user completes activation
async function onUserActivated(userId) {
  const user = await User.findById(userId)
  await user.update({ activatedAt: new Date() })

  // If using tinysend sequences — unenroll from onboarding
  await fetch(`https://api.tinysend.co/v1/sequences/onboarding-v2/unenroll`, {
    method: 'POST',
    headers: { 'Authorization': `Bearer ${process.env.TINYSEND_API_KEY}` },
    body: JSON.stringify({ email: user.email })
  })

  // Now enroll in the post-activation "power user" sequence
  await enrollInPowerUserSequence(user)
}

6. Common mistakes and how to avoid them

Sending too many features at once

Each email should focus on one thing. The "here are 7 features you might not know about" email has a near-zero read rate. Pick the one thing that matters most for that stage of the user journey.

Not suppressing for activated users

If you're sending a "you haven't started yet" email to someone who's been using your product daily, they'll lose trust in you. Always check activation status before sending emails that assume non-activation.

Subject lines that sound like marketing

"Unlock the power of [Product]!" opens much worse than "quick question about [Product]". Onboarding emails should feel like they're from a person who cares about the user's success, not a marketing team hitting KPIs.

No unsubscribe path

Transactional emails can be exempted from CAN-SPAM in some cases, but onboarding sequences that aren't directly tied to account access need an unsubscribe link. Failing this causes spam complaints that hurt deliverability for all your email.

Building sequences before you have copy

The infrastructure is the easy part. Most teams underinvest in the actual email copy. Write the emails first, validate them with real users, then automate. Bad emails automated efficiently are just bad emails at scale.

7. What to measure

Email opens are a vanity metric — open tracking is unreliable since iOS 15. Focus on:

MetricWhat it tells youBenchmark
Click rateEmail relevance and CTA quality3–8% for onboarding
Activation rate by cohortWhether the sequence is workingDepends heavily on product
Unsubscribe rateRelevance and frequency<0.5% per email
Spam complaint rateList quality and content relevance<0.1% (Google threshold)
Sequence completion rateHow many users reach email 5Tracks disengagement timing

The most important experiment: A/B test the stop condition. Compare "stop when user activates" vs "send all emails regardless" on activation rates 30 days after signup. This tells you whether your later emails are helpful or counterproductive.

Build onboarding sequences with tinysend

Define your sequence once. Enroll users with a single API call. Stop automatically when they activate.

Start for free