Describe the problem/error/question
I am currently trying to build a sequencing tool for our sales team to use. The company is at this point because while a lot of the email sequencing tools that are available are wonderful and very robust, our use case cannot justify the 500-1000 per seat that a lot of these companies command. They have build great stuff but we would only use 10% of the functionality and they will not budge on price (outreach.io, salesloft, activecampaign, etc.) We currently use outreach so at the very least I am looking to mimic the sequences from that standpoint where I can enroll people in a sequence manually and if it sees a response it will take them out of the sequence at any point.
Where I am at for the moment is that I have a sequencing tool that will scan a data table for any entry who’s “next send date” is today and then process them through a switch that will route them through the proper email to be sent based on the “next sequence step field”. It will subsequently change the next send date and the next sequence step date in the data table.
Does anyone have an easier solution or a low cost plugin to n8n that may assist in these efforts?
What is the error message (if any)?
Please share your workflow
Share the output returned by the last node
Information on your n8n setup
n8n version: 1.122.4
Database (default: SQLite):
n8n EXECUTIONS_PROCESS setting (default: own, main): Default
Running n8n via (Docker, npm, n8n cloud, desktop app):
Operating system:
As an addition our current stack is:
dynamics for crm.
O365 (outlook for email) - I currently send emails via http request with user id, as there is not a global credential for enterprises.
Dialpad (text messaging) - I can currently send texts via an HTTP request
Describe the problem/error/question
I am currently trying to build a sequencing tool for our sales team to use. The company is at this point because while a lot of the email sequencing tools that are available are wonderful and very robust, our use case cannot justify the 500-1000 per seat that a lot of these companies command. They have build great stuff but we would only use 10% of the functionality and they will not budge on price (outreach.io, salesloft, activecampaign, etc.) We currently use outreach so at the very least I am looking to mimic the sequences from that standpoint where I can enroll people in a sequence manually and if it sees a response it will take them out of the sequence at any point.
Where I am at for the moment is that I have a sequencing tool that will scan a data table for any entry who’s “next send date” is today and then process them through a switch that will route them through the proper email to be sent based on the “next sequence step field”. It will subsequently change the next send date and the next sequence step date in the data table.
As an addition our current stack is:
dynamics for crm.
O365 (outlook for email) - I currently send emails via http request with user id, as there is not a global credential for enterprises.
Dialpad (text messaging) - I can currently send texts via an HTTP request
Does anyone have an easier solution or a low cost plugin to n8n that may assist in these efforts?
What is the error message (if any)?
Please share your workflow
Share the output returned by the last node
Information on your n8n setup
- n8n version: 1.122.4
- Database (default: SQLite): Postres
- n8n EXECUTIONS_PROCESS setting (default: own, main): default
- Running n8n via (Docker, npm, n8n cloud, desktop app): Docker
- Operating system: Linux/Ubuntu
Hi @jesse.crawfordlang
I think you’re already doing this the same way most sequencing tools work behind the scenes. n8n doesn’t really have a “sales sequence” plugin, but you can cover everything you described with what you’ve already got: Dynamics to store where each person is in the sequence, and a scheduled workflow to send whatever is due.
The usual setup is to keep a few fields in your CRM or table like the current step, when the next message should go out, and whether they’re still active or already replied. Then a workflow runs every few minutes, checks for anyone whose next send date is now or earlier, sends the right email or text based on their step, and updates the record for the next step. That’s basically exactly what you described you’re doing today.
To handle replies, the common approach is a second workflow using the Outlook trigger for incoming email. When someone replies, look them up in Dynamics and flip their status to something like “stopped_due_to_reply.” Since your sending workflow only acts on contacts marked active, they automatically drop out of the sequence.
Some people prefer to use Wait nodes instead of a “next send date” in the database, but that just keeps a workflow open for days at a time. Your database-driven approach is cleaner and scales better.
Long story short: there isn’t a cheap add-on that does this for you in n8n, mainly because the built-in nodes already cover it. You’ve basically chosen the same architecture Outreach/Salesloft use; you’re just doing it without the $1k/seat price tag. Your current setup actually looks solid. The only thing I’d suggest is tightening the logic a bit, add some simple status checks and make sure the workflow can move on to the next step or stop entirely when Outlook sees a reply. Other than that, you’re pretty much right where you need to be.
1 Like
I appreciate the encouragement here. The “database” is built using the data tables function in n8n for now as we are in the process of switching from dynamics to directus so the data connection will need to be modified eventually for future state.
I have some concerns about scaling both from a recipient volume standpoint as well as campaign volume. I am trying to avoid having to set up a workflow for every single campaign we wish to create. wondering if I can create a new intity in directus called “campaigns” or something of that nature that I can use to build new campaigns, set copy, sending rules, finish rules etc.
Totally hear you on the scaling concerns as you add more campaigns.
A good next step is exactly what you mentioned create a Campaigns entity in Directus where each campaign stores its steps, messaging, and rules. Then your existing workflow just looks up the right campaign + step and sends whatever is due.
That way, you’re not creating new workflows every time you’re just adding new campaign records. Same for reply handling later→ once the Outlook trigger flags a response, update the status and the main workflow will simply stop sending, So the architecture you’re moving toward is solid centralized campaign config + one scheduler workflow to run everything. Let me know if you want help sketching out the fields for that Directus model
If you have the time I’d love to hear your thoughts on how to map out that architecture.
Assuming a many to many relationship Contact to Campaign, and then many to one Campaign Step to Campaign.
Assuming the campaign would house the broader rules for sending, limits, enrollment criteria whether manual or based on a filter set.
Where as the Campaign steps would house the message copy, timing between sends, new thread vs. reply.
Can you think of any others?
You’re on the right track @jesse.crawfordlang with a Campaigns entity and separate Campaign Steps. A simple way to model this in Directus so you don’t need a new workflow per campaign is:
1. Contacts
Basic CRM record:
-
id, email, phone, owner_user_id
-
Any fields used for filters (stage, industry, region, etc.)
2. Campaigns
High-level sequence rules:
-
id, name, status (draft | active | paused | archived)
-
enrollment_mode (manual | filter_based)
-
enrollment_filter (JSON / saved query reference)
-
allow_reenrollment, reenrollment_cooldown_days
-
Sending rules:
-
timezone
-
business_hours_start, business_hours_end
-
allowed_days_of_week
-
daily_send_limit_per_user
-
max_active_enrollments_per_contact
-
Stop rules:
stop_on_reply, stop_on_manual_opt_out, stop_on_bounce
-
Channel defaults:
3. Campaign Steps
Per-step content and timing (many-to-one with Campaign):
-
id, campaign_id, step_order
-
channel (email | sms | call | task | wait_only)
-
Timing:
-
Behavior:
-
Content:
4. Campaign Enrollments (Contact ↔ Campaign)
Holds state for each contact in each campaign (many-to-many):
-
id, contact_id, campaign_id
-
status (active | paused | completed | stopped_due_to_reply | stopped_due_to_opt_out | error)
-
current_step_order
-
next_step_due_at
-
owner_user_id
-
last_sent_at, last_reply_at
-
error_count, last_error
5. (Optional) Campaign Deliveries
Log of sends:
-
id, enrollment_id, campaign_id, campaign_step_id
-
channel, sent_at, status, provider_message_id, error_message
n8n Workflows
You can keep this to 2–3 generic workflows:
-
Scheduler / Sender
-
Cron → query campaign_enrollments where status = active and next_step_due_at <= now
-
Join campaign + campaign_step
-
Enforce campaign limits (business hours, daily caps, status)
-
Render templates → send via Outlook/Dialpad
-
Insert into campaign_deliveries
-
Advance current_step_order and set next_step_due_at or mark completed
-
Reply Handler
-
Outlook trigger (incoming email)
-
Look up contact by email
-
Find active campaign_enrollments
-
Set status = stopped_due_to_reply (and last_reply_at)
-
Enrollment (Maybe or Maybe Not]
This keeps the logic in one set of workflows while letting you add/edit campaigns purely through data in Directus. The outlines might be the same, but the implementation slightly can differ from this
1 Like
Im going to put some reps into this and get back to you. Thank you sir!
Do you have a background in this sort of thing?
Let me know how this goes! Na i am just learning, and n8n is such a useful tool it can do anything haha