> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hiveku.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflow Recipe: Welcome Email Sequence for New Signups

> Automatically send a series of onboarding emails when someone signs up

First impressions set the tone for the whole customer relationship. This recipe gives every new signup a three-email welcome sequence over their first week — friendly, useful, and completely automated.

<Info>
  Before you start: make sure you've [set up user authentication](/how-tos/setup-auth) and [configured your email service](/how-tos/send-emails).
</Info>

## The Flow at a Glance

<CardGroup cols={3}>
  <Card title="Day 0" icon="envelope">
    Immediate welcome + 1 CTA
  </Card>

  <Card title="Day 2" icon="lightbulb">
    Tips for getting value
  </Card>

  <Card title="Day 6" icon="hand">
    Nudge + resources
  </Card>
</CardGroup>

## Step 1: Create the Workflow

<Steps>
  <Step title="Open Workflows">
    In your project, go to **Workflows > New Workflow**. Name it `Welcome Sequence`.
  </Step>

  <Step title="Add a Database trigger">
    Click **Add Trigger > Database**. Listen for new rows in `auth.users` or your `profiles` table — whichever represents a finished signup in your app.

    <Tip>
      If users must confirm their email before they "count" as signed up, trigger on the table that tracks confirmed users, not the raw `auth.users` row created on first submit.
    </Tip>
  </Step>

  <Step title="Check for a template">
    Before building from scratch, browse the template library — if you see **Onboarding - Welcome Sequence**, start from that and customize. Much faster than wiring each step manually.
  </Step>
</Steps>

## Step 2: Email 1 — Immediate Welcome

<Steps>
  <Step title="Add a Send Email action">
    Click **+ Add Action > Send Email**.
  </Step>

  <Step title="Configure the email">
    * **To:** `{{trigger.email}}`
    * **Subject:** `Welcome to Acme, {{trigger.name}}!`
    * **Body:** Short. Introduce your product in 2-3 sentences. One clear CTA (e.g., "Complete your profile" or "Import your first contact"). No links to the pricing page, no feature walls of text.
  </Step>

  <Step title="Personalize sender">
    Send from a human name if possible (`Abe from Acme <abe@acme.com>`) rather than `noreply@`. Response rates are meaningfully higher.
  </Step>
</Steps>

## Step 3: Email 2 — Day 2 Tip

<Steps>
  <Step title="Add a Delay action">
    Click **+ Add Action > Delay**. Set to **2 days**.
  </Step>

  <Step title="Add a second Send Email action">
    * **Subject:** `Quick tip to get the most out of Acme`
    * **Body:** One specific, actionable tip. Link to a 60-second tutorial video or a short doc. No feature dump.
  </Step>
</Steps>

## Step 4: Email 3 — Day 6 Nudge

<Steps>
  <Step title="Add another Delay action">
    Set to **4 days** (so total is 6 days since signup).
  </Step>

  <Step title="Add a third Send Email action">
    * **Subject:** `How's it going? Here's what you might need`
    * **Body:** Check in tone. Links to docs, pricing, and a "book a demo" CTA for users still on the fence. Leave an open-ended ask like "Reply if you're stuck on anything — I read every response."
  </Step>
</Steps>

## Step 5: Save and Enable

Click **Save**, then toggle **Enabled** in the top right. Workflows only fire when enabled.

## Personalization Tokens

Use `{{trigger.fieldName}}` to pull any column from the signup row:

```
Hey {{trigger.name}},

Thanks for signing up from {{trigger.signup_source || 'our website'}}. 
I noticed you picked the {{trigger.plan}} plan...
```

Use the `||` operator to provide fallbacks when a field is empty.

## Conditional Branching

Smart sequences skip or swap emails based on user behavior. For example: if a user has completed their profile by day 2, send a "Congrats on your first steps" email instead of the generic tip.

<Steps>
  <Step title="Add a Condition step">
    After the Day 2 delay, click **+ Add Action > Condition**.
  </Step>

  <Step title="Set the condition">
    Example: `{{trigger.profile_completed}} == true`
  </Step>

  <Step title="Configure both branches">
    * **If true:** Send the "Congrats" email
    * **If false:** Send the standard tip email
  </Step>
</Steps>

## Tracking Effectiveness

Once the sequence is running, measure what's actually working.

* **Open rate** — subject line performance
* **Click rate** — body content performance
* **Reply rate** — genuine engagement signal

See [Email Webhooks](/how-tos/email-webhooks) to pipe open/click events into your analytics or CRM.

<Tip>
  Keep subject lines under 50 characters and avoid emojis in B2B contexts. Send yourself a test sequence on a burner email account before enabling — you'll catch rendering issues and timing mistakes that dashboards won't show.
</Tip>

<Warning>
  Always include an unsubscribe link in every email. See [Email Suppressions](/how-tos/email-suppressions) to handle unsubscribes properly — sending to someone who opted out can trigger spam complaints and get your sender domain blacklisted.
</Warning>

## Verify It Worked

Sign up with a test email address. Confirm:

1. Email 1 arrives within 1-2 minutes
2. Email 2 arrives on day 2
3. Email 3 arrives on day 6
4. All three render correctly on desktop and mobile
5. The unsubscribe link works
6. Personalization tokens render (no literal `{{trigger.name}}` in the final email)

## Troubleshooting

<AccordionGroup>
  <Accordion title="Emails aren't sending">
    Check that your email service is configured and the sender domain is verified. Go to **Settings > Email** and confirm the green checkmark. Unverified sender domains will cause silent failures — the workflow runs but nothing reaches inboxes.
  </Accordion>

  <Accordion title="Timing is off (emails arrive wrong day)">
    Delay actions use the workflow runner schedule. If runs are backed up, delays can stretch. Check **Workflows > Runs** for stuck executions. For precise timing, use scheduled triggers instead of delays on very long sequences.
  </Accordion>

  <Accordion title="Opens aren't being tracked">
    Ensure open tracking is enabled in your email provider settings. Some email clients (especially Apple Mail with privacy protection) suppress tracking pixels — expect open rates to understate real engagement.
  </Accordion>

  <Accordion title="Unsubscribes aren't being handled">
    If people unsubscribe and still get follow-up emails, the workflow isn't checking the suppression list before sending. Add a **Check Suppressions** step before each Send Email action, or use the provider's built-in suppression handling. See [Email Suppressions](/how-tos/email-suppressions).
  </Accordion>

  <Accordion title="Personalization tokens rendering as literal text">
    The trigger payload doesn't contain that field. Open the workflow's **Runs** tab, click a run, and inspect the trigger data. If `name` is missing, either update your signup form to capture it, or add a fallback with `{{trigger.name || 'there'}}`.
  </Accordion>
</AccordionGroup>

## What's Next?

<CardGroup cols={2}>
  <Card title="Workflows Basics" icon="diagram-project" href="/how-tos/workflows">
    How triggers, actions, and runs fit together
  </Card>

  <Card title="Email Suppressions" icon="ban" href="/how-tos/email-suppressions">
    Handle unsubscribes and bounces properly
  </Card>
</CardGroup>
