

How to Turn Slack Messages into Todoist Tasks with Make
Watches for a specific emoji reaction on any Slack message and instantly creates a Todoist task from that message's text, channel, and sender.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Teams who move fast in Slack and need action items captured in Todoist without leaving the conversation.
Not ideal for
Teams who need two-way sync — completed Todoist tasks won't update back to Slack in this setup.
Sync type
real-timeUse case type
routingReal-World Example
A 12-person product team at a B2B SaaS company uses this to capture action items from their #sprint-planning channel. Before this, someone had to manually copy tasks from Slack into Todoist after every standup — things slipped by Friday. Now a team member adds a ✅ reaction to any message, and the task appears in their shared Todoist project within 10 seconds. They've cut missed follow-ups by roughly 80% in the first month.
What Will This Cost?
Drag the slider to your expected monthly volume.
Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.





Prices shown for annual billing. Based on published pricing as of April 2026.
Estimated ROI
1000
min saved/mo
$583
labor value/mo
Free
no platform cost
Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.
Implementation
Import this workflow directly into Make
Copy the pre-built Make blueprint and paste it straight into Make. All modules, filters, and field mappings are already configured — you just need to connect your accounts.
Before You Start
Make sure you have everything ready.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Task Content | content | |
| Project | project_id | |
6 optional fields▸ show
| Description | description |
| Due Date | due_date |
| Priority | priority |
| Assignee | assignee_id |
| Labels | labels |
| Slack Message Permalink | description |
Step-by-Step Setup
make.com > Scenarios > Create a new scenario
Create a new Make scenario
Log into your Make account at make.com and click the blue 'Create a new scenario' button on the top right of the Scenarios dashboard. You'll land on the visual canvas — a dark grid where you build the flow module by module. Click the large circle with the plus icon in the center of the canvas to add your first module. A search modal will appear.
- 1Click 'Create a new scenario' in the top-right corner
- 2Click the large '+' circle in the center of the canvas
- 3Type 'Slack' in the search bar
- 4Select 'Slack' from the results
Canvas > Slack Module > Triggers > Watch Reactions
Configure the Slack 'Watch Reactions' trigger
From the Slack module list, scroll to the Triggers section and select 'Watch Reactions'. This trigger fires via webhook every time a reaction is added to a message in your workspace — no polling delay. Make will ask you to choose a Slack connection or create a new one. If this is your first time, click 'Add' to authenticate with your Slack workspace.
- 1Select 'Watch Reactions' from the Slack triggers list
- 2Click 'Add' next to the Connection field to authenticate Slack
- 3Authorize Make in the Slack OAuth popup — approve all requested scopes
- 4Set 'Reaction' to the specific emoji name you'll use (e.g. white_check_mark)
- 5Leave 'Channel' blank to watch all channels, or pick one specific channel
Canvas > '+' after trigger > Slack > Get a Message
Add a Slack 'Get a Message' module
The Watch Reactions trigger gives you the channel ID and message timestamp, but not the message text itself. You need a second Slack module to fetch the actual message content. Click the '+' after the trigger module to add a new module. Search for Slack again and select 'Get a Message'. This will use the channel ID and timestamp from the previous step to pull the full message object.
- 1Click the '+' circle to the right of the Watch Reactions module
- 2Search for 'Slack' and select it
- 3Choose 'Get a Message' from the Actions list
- 4In the 'Channel ID' field, click the mapping icon and select '1. Channel ID' from the trigger output
- 5In the 'Message TS' field, map '1. Item Timestamp' from the trigger output
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}channel: {{channel}}
ts: {{ts}}
Canvas > '+' after Get a Message > Slack > Get a User
Add a Slack 'Get a User' module
The message object includes a user ID like U04ABCD123, not a readable name. To populate the Todoist task description with who sent the message, add a 'Get a User' module. This resolves the user ID to a display name and real name. Map the 'User' field from the Get a Message output.
- 1Click '+' after the Get a Message module
- 2Search 'Slack' and select 'Get a User'
- 3In the 'User ID' field, map '2. User' from the Get a Message output
- 4Leave all other fields at their defaults
Canvas > '+' after Get a User > Flow Control > Router
Add a Router to filter out duplicate reactions
If two people react to the same message with the same emoji, this scenario will fire twice and create duplicate tasks. Add a Router module after Get a User, then add a Filter on the route to Todoist. The filter checks that the reacting user added the reaction — not that it already existed. Make's Watch Reactions trigger includes a 'Type' field: only proceed when Type equals 'reaction_added'.
- 1Click '+' after Get a User and select 'Flow Control' from the module list
- 2Choose 'Router'
- 3Click the wrench icon on Route 1 to open filter settings
- 4Set Condition: '1. Type' > Text operators > Equal to > 'reaction_added'
- 5Click OK to save the filter
Canvas > Route 1 > '+' > Todoist > Create a Task
Add the Todoist 'Create a Task' module
Click '+' at the end of Route 1 to add the Todoist module. Search for 'Todoist' and select 'Create a Task'. Make will ask for a Todoist connection — click 'Add' and authenticate via OAuth. Once connected, you'll see fields for Task Content, Project, Due Date, Priority, and Description. This is where you map Slack data to Todoist fields.
- 1Click '+' at the end of Route 1
- 2Search 'Todoist' and select it
- 3Choose 'Create a Task'
- 4Click 'Add' next to Connection and complete Todoist OAuth
- 5Select the destination Todoist project from the Project dropdown
Canvas > Todoist > Create a Task > Field Mapping
Map Slack message fields to Todoist task fields
Fill in the task fields using the mapped variables from your earlier modules. Task Content should be the message text. Description should include the sender's name and the Slack channel link so there's context when someone views the task later. Priority and Due Date can be set manually or left blank for inbox defaults.
- 1Set 'Task Content' to: map '2. Text' from the Get a Message module
- 2Set 'Description' to: type 'From: ' then map '3. Real Name' from Get a User, then add ' in #' and map '1. Channel ID' from the trigger
- 3Set 'Due Date' to null (leave blank) unless you want all tasks due today
- 4Set 'Priority' to 2 (Normal) or map it conditionally if needed
- 5Click OK to save the module
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}Canvas > '+' after Todoist > Slack > Add a Reaction
Add a Slack 'Add a Reaction' confirmation module
After Todoist creates the task, close the loop by adding a checkmark reaction back to the original Slack message so the team knows the task was captured. Add a Slack 'Add a Reaction' module after the Todoist module. Map the channel ID and message timestamp from the original trigger. Set the reaction name to something distinct from the trigger emoji — use 'white_check_mark' as trigger and 'heavy_check_mark' as confirmation, for example.
- 1Click '+' after the Todoist Create a Task module
- 2Search 'Slack' and select 'Add a Reaction'
- 3Map 'Channel' to '1. Channel ID' from the Watch Reactions trigger
- 4Map 'Timestamp' to '1. Item Timestamp' from the Watch Reactions trigger
- 5Set 'Reaction' to 'heavy_check_mark' (or your chosen confirmation emoji)
Canvas > Run once (bottom left toolbar)
Run a test with a real Slack message
Before saving, click 'Run once' in the bottom left of the Make canvas. Switch to Slack and add your trigger emoji to any message in the configured channel. Make will capture the event in real time. After about 5 seconds, flip back to Make — you should see green bubbles on each module showing how many records passed through.
- 1Click 'Run once' in the bottom left of the Make canvas
- 2Open Slack and navigate to the channel you configured
- 3Find any message and add the trigger reaction (e.g. ✅)
- 4Wait 5-10 seconds and return to Make
- 5Click each green bubble to inspect the data that passed through each module
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}Canvas > Scheduling (bottom toolbar) > Immediately > Activate toggle
Set scheduling and activate the scenario
Since this scenario uses a webhook trigger, the scheduling interval only controls how often Make polls for missed events — not how fast it responds. Webhook-triggered scenarios fire within seconds regardless of schedule. Set the interval to 'Immediately' to ensure near-instant task creation. Click the toggle at the bottom of the canvas to activate the scenario.
- 1Click the clock icon in the bottom toolbar to open scheduling
- 2Set 'Run scenario' to 'Immediately'
- 3Click 'OK' to confirm
- 4Click the toggle switch at the bottom left to turn the scenario ON
- 5Confirm activation in the dialog that appears
Paste this formula into the Todoist 'Task Content' field mapping in Make (click the formula icon, not the map icon). It extracts a clean task title from the message text — stripping Slack user mentions like <@U04ABCD123> and channel references like <#C04XYZ9876|general> before the text lands in Todoist. Without this, tasks from messages with @-mentions look cluttered.
JavaScript — Custom Function{{replaceAll(▸ Show code
{{replaceAll(
replaceAll(
replaceAll(... expand to see full code
{{replaceAll(
replaceAll(
replaceAll(
2.text;
"/<@[A-Z0-9]+>/";
""
);
"/<#[A-Z0-9]+\|[a-z0-9_-]+>/";
""
);
"/\s{2,}/";
" "
)}}
-- ALSO: Conditional priority mapping based on message keywords --
-- Paste into the Priority field in the Todoist module --
{{if(
contains(lower(2.text); "urgent") ||
contains(lower(2.text); "asap") ||
contains(lower(2.text); "critical");
4;
if(
contains(lower(2.text); "soon") ||
contains(lower(2.text); "this week");
3;
2
)
)}}Going live
Production Checklist
Before you turn this on for real, confirm each item.
Troubleshooting
Common errors and how to fix them.
Frequently Asked Questions
Common questions about this workflow.
Analysis
Use Make for this if your team wants more control than Zapier gives you without writing code. The visual canvas makes the multi-step flow — reaction trigger, message fetch, user lookup, task creation, confirmation reaction — easy to map and debug. Make's webhook handling is genuinely fast: task creation happens within 3-5 seconds of the reaction in practice. You'd pick a different platform (n8n self-hosted) only if you're processing hundreds of reactions per day and want to avoid any per-operation cost ceiling.
The math is simple. Each scenario run uses 5 operations: Watch Reactions (1) + Get a Message (1) + Get a User (1) + Create a Task (1) + Add a Reaction (1). At 40 reactions per day — 1,200/month — you're at 6,000 operations monthly. Make's free tier covers 1,000 ops/month. The Core plan at $9/month covers 10,000 ops. That 40-reactions/day team pays $9/month. Zapier's equivalent (Multi-step Zap) requires the Starter plan at $19.99/month for the same volume. Make saves you $130/year on this workflow alone.
Zapier's 'New Reaction Added to Message' trigger is better documented and has a simpler setup — 6 steps instead of 10, no Router needed. If your team has zero automation experience and just wants it done in 15 minutes, Zapier wins on speed. n8n handles this well too, and the self-hosted version is free at any volume — but you're managing infrastructure. Power Automate can do this with Slack and Microsoft To Do, but there's no native Todoist connector, so you'd need HTTP modules and API keys — that's a different skill level. Pipedream is solid for developers who want to write JavaScript transforms on the message text, but offers no advantage here if you're not coding. Make is the right call for teams that want click-based configuration, a visual debugger, and the ability to extend the scenario later without starting over.
Three things you'll hit after launch. First: Slack's block-kit messages — sent by apps like Notion, GitHub, or Jira — have empty 'text' fields. The message content lives in a nested 'blocks' array that Make's Get a Message module doesn't automatically flatten. Add a fallback in the Task Content field using if(2.text; 2.text; 'See Slack link in description') or the full blocks parsing gets complex fast. Second: if your workspace uses Slack's message retention policy and deletes messages after 90 days, the Slack permalink in the Todoist task description will eventually 404. Not a workflow-breaker, but worth telling your team. Third: Make's webhook for Watch Reactions can occasionally miss events during Slack API incidents — roughly 2-3 times per year based on Slack's status history. Make doesn't retry missed webhook events, so tasks from that window won't be created. If this workflow is mission-critical, add a weekly audit: pull open Todoist tasks tagged 'slack' and cross-check against a saved Slack search for your trigger emoji.
Ideas for what to build next
- →Add keyword-based task routing — Use a second Router route to sort tasks into different Todoist projects based on keywords in the message — 'bug' or 'error' goes to a Tech Issues project, 'client' goes to Account Management. Add more routes and filters inside the existing Router.
- →Post a Slack thread reply with the Todoist task URL — After the Todoist task is created, the API response includes the task URL. Add a Slack 'Reply to a Message' module that posts the Todoist link as a thread reply on the original message, so the team can click straight to the task.
- →Sync task completion back to Slack — Build a second Make scenario using a Todoist 'Watch Tasks' trigger filtered to your Slack-sourced project. When a task is marked complete, post a message in a #done or #completed Slack channel with the task name and who closed it.
Related guides
How to Send Weekly Todoist Reports to Slack with Pipedream
~15 min setup
How to Send Weekly Todoist Reports to Slack with Power Automate
~15 min setup
How to Send Weekly Todoist Reports to Slack with n8n
~20 min setup
How to Send Weekly Todoist Reports to Slack with Zapier
~8 min setup
How to Send Weekly Todoist Reports to Slack with Make
~12 min setup
How to Assign Todoist Tasks from Slack Mentions with Pipedream
~15 min setup