How to Build a Customer Onboarding Email Sequence

Create an automated email sequence for new customer onboarding.

What This Integration Does

A good onboarding sequence is the difference between activated customers and silent churners. It walks new signups through your product in the first two weeks, surfaces features they haven't tried yet, and gives them a clear "next step" at every stage. This workflow sends a multi-touch email series triggered by signup, with time-based follow-ups and behaviour-aware skips so you don't email users about a feature they've already used.

The workflow is triggered once per new customer via webhook from your app or e-commerce platform. It sends an immediate welcome via the resend connector, then records the customer in a tracking store. The day-3, day-7, and day-14 follow-ups are handled by a separate Schedule-triggered workflow that runs each morning and emails the customers who are due that day. Each follow-up checks the customer's current state before sending, so a customer who has already completed the relevant action gets skipped. State left behind: a row per customer in your onboarding tracking store recording which touches have been sent.

Prerequisites

  • A Resend connection with your sending domain verified.
  • An onboarding email template per touch (welcome, day 3, day 7, day 14). HTML or markdown both work.
  • A webhook from your app that fires on signup, carrying customerId, email, firstName, and signupAt.
  • (Optional) a mongodb or similar store to track which emails have been sent and current customer state.

Step 1: Webhook Trigger on New Customer

Drop a Trigger node onto the canvas and set its type to Webhook. Configure your app or e-commerce platform to POST signup events here. The payload should include enough context to personalize the first email: name, plan or product, signup timestamp.

Step 2: Send the Welcome Email Immediately

Add a Connector node pointing at the resend connector and pick the send-email tool. Configure:

  • from: onboarding@yourcompany.com
  • to: {{ trigger.email }}
  • subject: Welcome to ACME, {{ trigger.firstName }}!
  • html: your welcome template with handlebars for personalization

Log the send to your tracking store (mongodb insert-documents) with customerId, touch: "welcome", and sentAt.

Step 3: Build a Daily Follow-Up Workflow on a Schedule

The timed follow-ups live in a second workflow. Drop a Trigger node and set its type to Schedule. Schedule triggers use a standard 5-field cron expression plus an IANA timezone, so to run every morning at 9am Sydney time use 0 9 * * * with Australia/Sydney. Each run outputs {{ trigger.scheduledAt }}, which you use as "today" when working out who is due.

In this workflow, call mongodb find-documents to load the customers whose signupAt falls on the day-3, day-7, or day-14 boundary and who have not yet received that touch. Use the date connector's diff tool to compute the number of days since each customer signed up.

Step 4: Loop the Due Customers and Send Each Touch

Add a Loop node in ForEach mode over the customers returned by find-documents. Inside the loop body, send the matching email via the resend connector's send-email tool, then call mongodb update-documents to record that the touch was sent. Tailor each email to the milestone you expect at that point: day 7 should reference what the customer should have done by now, day 14 should offer a 1:1 call or a feature deep-dive. If you reuse the same send-and-log logic elsewhere, factor it into a Subworkflow and invoke it from the loop.

Step 5: Personalize with Customer State

Inside the loop body, add a Transform node before the email send. Pull the customer's current usage from your app's API or your tracking store and compute personalization variables such as workflowsCreated, connectorsUsed, and lastLoginAt. Reference them in the email body as {{ stats.workflowsCreated }}. Generic emails feel like marketing: personalized ones feel like an account manager wrote them.

Step 6: Suppression and Unsubscribes

Inside the loop body, add a Condition node that checks the customer's unsubscribe state in your tracking store before the send. If they have unsubscribed from onboarding emails, skip the send for that customer. Feed unsubscribe and click events from the resend connector back into your store so suppressions are honoured across the whole sequence.

Tips

  • Keep touches short. Each email should have one call to action.
  • Personalize the subject line, not just the body. Open rates roughly double when the subject references something specific to the customer.
  • Track per-touch open and click rates. If day-7 underperforms, rewrite that email rather than the whole sequence.

Common Pitfalls

  • Sending the next touch even after the customer has completed the goal. Always check state first.
  • Timezones - schedule emails for late morning in the customer's local timezone, not yours. Use the date connector's timezone tool to compute the right send time.
  • Hard bounces. If a send returns a hard bounce from Resend, suppress further touches for that address.

Testing

Sign up a test account with your own email and confirm the welcome email lands in seconds. Then seed a few tracking rows with signup dates 3, 7, and 14 days in the past and use the Run button to trigger the daily follow-up workflow manually instead of waiting for the schedule. Inspect each follow-up and walk through both branches: a customer who completed the milestone (should skip) and one who did not (should send). Spojit records every run in your execution history so you can confirm exactly which touches went out.

Learn More

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.