Beginner~12 min setupCommunication & Project ManagementVerified April 2026
Slack logo
Todoist logo

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-time

Use case type

routing

Real-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.

/mo
505005K50K

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

Skip the setup

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.

Make account with at least the Core plan (free tier limits webhook execution to 1,000 ops/month)
Slack workspace admin access or permission to install apps — needed to authorize the Make Slack app with reactions:read and channels:history scopes
Todoist account with at least one project created — Make cannot create a project during setup, only write to an existing one
Make Slack connection authorized with: reactions:read, channels:history, users:read, reactions:write scopes
The trigger emoji decided and communicated to your team before going live — once active, every reaction of that type across configured channels creates a task

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Contentcontent
Projectproject_id
6 optional fields▸ show
Descriptiondescription
Due Datedue_date
Prioritypriority
Assigneeassignee_id
Labelslabels
Slack Message Permalinkdescription

Step-by-Step Setup

1

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.

  1. 1Click 'Create a new scenario' in the top-right corner
  2. 2Click the large '+' circle in the center of the canvas
  3. 3Type 'Slack' in the search bar
  4. 4Select 'Slack' from the results
What you should see: The Slack module picker opens showing a list of available Slack triggers and actions.
2

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.

  1. 1Select 'Watch Reactions' from the Slack triggers list
  2. 2Click 'Add' next to the Connection field to authenticate Slack
  3. 3Authorize Make in the Slack OAuth popup — approve all requested scopes
  4. 4Set 'Reaction' to the specific emoji name you'll use (e.g. white_check_mark)
  5. 5Leave 'Channel' blank to watch all channels, or pick one specific channel
What you should see: The module shows your Slack workspace name next to the connection field and the emoji name appears in the Reaction field.
Common mistake — Slack's 'Watch Reactions' webhook requires the reactions:read scope. If your Slack workspace is on a free plan, you can still use this — scope availability isn't plan-gated. But if you're re-using an old Make Slack connection, it may be missing this scope. Delete and re-add the connection to force a fresh OAuth with all scopes.
Make
+
click +
search apps
Slack
SL
Slack
Configure the Slack 'Watch R…
Slack
SL
module added
3

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.

  1. 1Click the '+' circle to the right of the Watch Reactions module
  2. 2Search for 'Slack' and select it
  3. 3Choose 'Get a Message' from the Actions list
  4. 4In the 'Channel ID' field, click the mapping icon and select '1. Channel ID' from the trigger output
  5. 5In the 'Message TS' field, map '1. Item Timestamp' from the trigger output
What you should see: The Get a Message module shows both fields populated with mapped variables from step 1, displayed as blue pills.
Common mistake — Map 'Item Timestamp' — not 'Event Timestamp'. These are two different values in the Watch Reactions output. Event Timestamp is when the reaction was added. Item Timestamp is the timestamp of the original message. Using the wrong one returns a 'message_not_found' error.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
4

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.

  1. 1Click '+' after the Get a Message module
  2. 2Search 'Slack' and select 'Get a User'
  3. 3In the 'User ID' field, map '2. User' from the Get a Message output
  4. 4Leave all other fields at their defaults
What you should see: The module preview shows a user object with fields like 'Real Name', 'Display Name', and 'Profile: Email'.
Common mistake — Bot messages have a user ID too, but 'Get a User' will return partial data for bots. If your team uses bots that post action items, add a Router after this step and filter out messages where 'Is Bot' equals true.
5

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'.

  1. 1Click '+' after Get a User and select 'Flow Control' from the module list
  2. 2Choose 'Router'
  3. 3Click the wrench icon on Route 1 to open filter settings
  4. 4Set Condition: '1. Type' > Text operators > Equal to > 'reaction_added'
  5. 5Click OK to save the filter
What you should see: Route 1 shows a filter badge. The scenario will only continue down this route when the event type is reaction_added, not reaction_removed.
Common mistake — Filters are the most common place setups break. Double-check the field name and value exactly match what your app sends — a single capital letter difference will block everything.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Todoist
TO
notified
6

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.

  1. 1Click '+' at the end of Route 1
  2. 2Search 'Todoist' and select it
  3. 3Choose 'Create a Task'
  4. 4Click 'Add' next to Connection and complete Todoist OAuth
  5. 5Select the destination Todoist project from the Project dropdown
What you should see: The Todoist module opens with a connected account and an empty field mapping form. The Project dropdown shows your Todoist project list.
Common mistake — Todoist's OAuth in Make requests access to all projects. If you want to restrict which project is written to, you must hard-code the project selection here — there's no per-project permission scope available in the Todoist API v2.
7

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.

  1. 1Set 'Task Content' to: map '2. Text' from the Get a Message module
  2. 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
  3. 3Set 'Due Date' to null (leave blank) unless you want all tasks due today
  4. 4Set 'Priority' to 2 (Normal) or map it conditionally if needed
  5. 5Click OK to save the module
What you should see: Each field in the Todoist module shows blue mapped variable pills for dynamic values and plain text for static labels.
Common mistake — Todoist's 'Task Content' field strips markdown formatting from Slack. Bold text (*word*) and inline code will appear as plain text. If message formatting matters, add a Make text transform using replace() to clean up asterisks before mapping.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
Slack fields
text
user
channel
ts
thread_ts
available as variables:
1.props.text
1.props.user
1.props.channel
1.props.ts
1.props.thread_ts
8

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.

  1. 1Click '+' after the Todoist Create a Task module
  2. 2Search 'Slack' and select 'Add a Reaction'
  3. 3Map 'Channel' to '1. Channel ID' from the Watch Reactions trigger
  4. 4Map 'Timestamp' to '1. Item Timestamp' from the Watch Reactions trigger
  5. 5Set 'Reaction' to 'heavy_check_mark' (or your chosen confirmation emoji)
What you should see: The module configuration shows both the channel and timestamp mapped, and the reaction name as a static text value.
Common mistake — Don't map the Event Timestamp here — it must be Item Timestamp, the original message's timestamp. Using Event Timestamp will cause Slack to throw a 'message_not_found' error since it's not a valid message reference.
9

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.

  1. 1Click 'Run once' in the bottom left of the Make canvas
  2. 2Open Slack and navigate to the channel you configured
  3. 3Find any message and add the trigger reaction (e.g. ✅)
  4. 4Wait 5-10 seconds and return to Make
  5. 5Click each green bubble to inspect the data that passed through each module
What you should see: Every module shows a green bubble with '1' record processed. The Todoist task appears in your selected project, and the confirmation reaction appears on the original Slack message.
Common mistake — Make's 'Run once' mode processes only the first event it receives. If you react to multiple messages during the test, only the first one will complete the full flow. React to one message, wait for the green bubbles, then test additional cases.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
Make
▶ Run once
executed
Slack
Todoist
Todoist
🔔 notification
received
10

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.

  1. 1Click the clock icon in the bottom toolbar to open scheduling
  2. 2Set 'Run scenario' to 'Immediately'
  3. 3Click 'OK' to confirm
  4. 4Click the toggle switch at the bottom left to turn the scenario ON
  5. 5Confirm activation in the dialog that appears
What you should see: The scenario toggle shows green and the status bar reads 'ON'. The scenario will now fire within seconds every time someone adds the trigger reaction in Slack.

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

VerdictWhy Make for this workflow

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.

Cost

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.

Tradeoffs

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 routingUse 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 URLAfter 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 SlackBuild 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

Was this guide helpful?
Slack + Todoist overviewMake profile →