Before you start: make sure you’ve set up user authentication and configured your email service.
The Flow at a Glance
Day 0
Immediate welcome + 1 CTA
Day 2
Tips for getting value
Day 6
Nudge + resources
Step 1: Create the Workflow
1
Open Workflows
In your project, go to Workflows > New Workflow. Name it
Welcome Sequence.2
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.3
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 2: Email 1 — Immediate Welcome
1
Add a Send Email action
Click + Add Action > Send Email.
2
Configure the email
- To:
{{trigger.output.new_row.email}} - Subject:
Welcome to Acme, {{trigger.output.new_row.name || 'friend'}}! - 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.
3
Personalize sender
Send from a human name if possible (
Abe from Acme <abe@acme.com>) rather than noreply@. Response rates are meaningfully higher.Step 3: Email 2 — Day 2 Tip
1
Add a Delay action
Click + Add Action > Delay. Set to 2 days.
2
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 4: Email 3 — Day 6 Nudge
1
Add another Delay action
Set to 4 days (so total is 6 days since signup).
2
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 5: Save and Enable
Click Save, then toggle Enabled in the top right. Workflows only fire when enabled.Personalization Tokens
A Database trigger carries the new row undertrigger.output.new_row, so use {{trigger.output.new_row.columnName}} to pull any column from the signup row:
|| operator to provide fallbacks when a field is empty. Everything after the first || is plain text, never looked up: {{trigger.output.new_row.nickname || trigger.output.new_row.name}} sends the words trigger.output.new_row.name, not the name. There is no chaining; to fall back to a second column, check the first with a Condition step. {{trigger.output.timestamp}} is on every run: the time the row changed (or, when the change arrives without a time, when Hiveku received it).
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.1
Add a Condition step
After the Day 2 delay, click + Add Action > Condition.
2
Set the condition
Example:
{{trigger.output.new_row.profile_completed}} == true3
Configure both branches
- If true: Send the “Congrats” email
- If false: Send the standard tip email
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
Verify It Worked
Sign up with a test email address. Confirm:- Email 1 arrives within 1-2 minutes
- Email 2 arrives on day 2
- Email 3 arrives on day 6
- All three render correctly on desktop and mobile
- The unsubscribe link works
- Personalization tokens render (no blank where the name should be, and no literal
{{...}}text)
Troubleshooting
Emails aren't sending
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.
Timing is off (emails arrive wrong day)
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.
Opens aren't being tracked
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.
Unsubscribes aren't being handled
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 Handle Unsubscribes and Keep Your Emails Out of Spam.
Personalization tokens come out blank
Personalization tokens come out blank
The trigger data doesn’t contain that field at that path. A variable that finds nothing is sent as a blank, not as
{{...}} text, and the run’s step lists it as a miss. Open the workflow’s Runs tab, click a run, and inspect the trigger data: the row’s columns are under new_row. If name is missing, either update your signup form to capture it, or add a fallback with {{trigger.output.new_row.name || 'there'}}. Literal {{...}} text in an email usually comes from a malformed fallback such as {{trigger.output.new_row.name | there}} (one pipe): use two.What’s Next?
Workflows Basics
How triggers, actions, and runs fit together
Unsubscribes and Spam
Handle unsubscribes and bounces properly