Before you start: your
users table needs a last_login_at (or similar activity timestamp), and you need a configured email service.The Flow at a Glance
Day 30
“What’s new since you left”
Day 60
“Do you need help?”
Day 90
Final offer or clean goodbye
Step 1: Create the Workflow
1
Open Workflows
Go to Workflows > New Workflow. Name it
Re-engagement Campaign.2
Add a Schedule trigger
Set to run daily at 10 AM UTC (or whatever time zone makes sense for your audience).
Step 2: The 30-Day Cohort
1
Add a Database query action
Find users whose last activity was exactly 30 days ago (within a 1-hour window to match the schedule):
2
Loop and send
Add a For Each step over the results. Inside, add a Send Email action:
- Subject:
{{item.name}}, here's what you missed - Body: Focus on what’s new since they were last active. New features, popular content, customer wins. Make it about value, not guilt.
3
Mark as sent
Add a Database Update:
Step 3: The 60-Day Cohort
Clone the 30-day block. Change the query to target 60 days:Step 4: The 90-Day Cohort
At 90 days, it’s either a clean goodbye or a final offer. Pick one:- Final offer: discount, extended free trial, white-glove onboarding
- Clean goodbye: “We’d love to have you back anytime — here’s a link to log in”
marketing_opt_in = false to stop active marketing. Keep the record in your CRM for future relationships.
Messaging Tone by Cohort
Respecting Unsubscribes
Always include an unsubscribe link and honor your suppression list. Re-engagement campaigns hit users who are already half-checked-out; one wrong email and they unsubscribe or mark as spam. Add a Check Suppressions step before each Send Email, or use your provider’s built-in suppression handling. See Email Suppressions.A/B Testing Subject Lines
Low-engagement cohorts are a great place to test subject lines — you’re already reaching users unlikely to convert, so nothing to lose. Try:- Curiosity-based: “A question about your account”
- Direct: “We miss you,
{{item.name}}” - Benefit-led: “Three new features since you’ve been gone”
- Human: “From Abe at Acme — hope you’re well”
Verify It Worked
- Pick a test user
- Manually set
last_login_atto 30 days ago:UPDATE users SET last_login_at = now() - interval '30 days' WHERE email = 'test@example.com' - Wait for the next scheduled run (or trigger manually from Workflows > Runs)
- Confirm the 30-day email arrives
- Confirm
reengagement_30d_sent_atis now populated - Re-run the workflow — the test user should not receive a duplicate
Troubleshooting
Users getting multiple emails in the same cohort
Users getting multiple emails in the same cohort
The
reengagement_Xd_sent_at check isn’t in the query, or the UPDATE isn’t running. Look at Workflows > Runs and inspect the query output — if the same user appears in the results across two consecutive runs, the UPDATE silently failed. Check permissions on the users table.Users appearing in the wrong cohort
Users appearing in the wrong cohort
Interval math is easy to get wrong. The
BETWEEN now() - interval '30 days 1 hour' AND now() - interval '30 days' pattern catches a 1-hour window ending 30 days ago. If your schedule runs hourly, widen to '30 days 1 hour'; if daily, widen to '31 days' AND '30 days'. Always match the window to the schedule cadence.No one is engaging with the emails
No one is engaging with the emails
Re-engagement is hard — a 5-10% open rate is typical, 1-2% click-through is normal. If you’re at 0%, the issue is subject lines (too generic), sender reputation (check deliverability), or the offer (too weak). A/B test subject lines first.
Workflow is timing out with large user bases
Workflow is timing out with large user bases
If you have 100k+ inactive users, looping inline will timeout. Batch it: send to 500 users per run, schedule more frequently, or push the batch to a queue with worker processing. See Workflows for long-running job patterns.
Re-engagement emails going to spam
Re-engagement emails going to spam
Low-engagement sends hurt sender reputation. Warm up carefully: start with the most-engaged dormant users (those who opened recently), skip anyone with prior bounces, and cap daily volume. Consider a dedicated IP if re-engagement is a large portion of your volume.
What’s Next?
Email Suppressions
Handle unsubscribes and bounces properly
Email Webhooks
Track opens and clicks for smarter segmentation