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

How to Assign Todoist Tasks from Slack Mentions with Make

Watches specific Slack channels for @mentions and instantly creates an assigned Todoist task with the message text, sender, and channel as context.

Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.

Best for

Teams using project-specific Slack channels who want mentions to automatically generate assigned tasks without switching apps.

Not ideal for

Teams with more than 10 active channels needing different routing logic — use a dedicated project tool with native Slack integration like Linear or Asana instead.

Sync type

real-time

Use case type

routing

Real-World Example

💡

A 12-person product team has channels like #design-requests and #eng-bugs. When a designer writes '@jordan can you fix the button spacing on checkout?', Make catches that message and creates a Todoist task assigned to Jordan in the Design project with the full message as the task description. Before this, mentions got buried in Slack threads and nothing got tracked — the team lost roughly 3-4 action items per week.

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.

Slack workspace admin access or permission to install Make as a Slack app and invite it to channels
Todoist account with at least one project set up and team members added as collaborators on that project
Make account with an active scenario slot (free tier allows 2 active scenarios)
Slack OAuth scopes required: channels:history, users:read, users:read.email — confirm these are granted during Make's Slack connection flow
Todoist OAuth scopes required: data:read_write — granted automatically during Make's Todoist OAuth flow

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Message Text
Channel ID
Message Sender User ID
Mentioned User ID
Slack User Email
Todoist Project ID
Todoist Assignee ID
3 optional fields▸ show
Task Description
Message Timestamp
Task Due Date

Step-by-Step Setup

1

make.com > Scenarios > Create a new scenario

Create a new Make scenario

Log into Make at make.com and click the blue 'Create a new scenario' button in the top right. You'll land on the blank visual canvas with a large '+' circle in the center. This is where you'll add your first module. Give the scenario a name immediately using the pencil icon at the top — something like 'Slack Mention → Todoist Task' so you can find it later.

  1. 1Click 'Create a new scenario' in the top right
  2. 2Click the pencil icon next to 'New scenario' at the top
  3. 3Type a name like 'Slack Mention → Todoist Task'
  4. 4Press Enter to save the name
What you should see: You should see a named, empty scenario canvas with a single '+' trigger circle in the center.
2

Scenario canvas > + > Slack > Watch Messages

Add the Slack trigger module

Click the '+' circle on the canvas to open the module picker. Search for 'Slack' and select it. From the list of triggers, choose 'Watch Messages' — this is the instant webhook-based trigger, not the polling one. You'll be prompted to connect your Slack account if you haven't already; click 'Add' and follow the OAuth flow to authorize Make in your Slack workspace.

  1. 1Click the '+' circle on the canvas
  2. 2Type 'Slack' in the search box
  3. 3Select 'Slack' from the results
  4. 4Choose 'Watch Messages' from the trigger list
  5. 5Click 'Add' next to the connection field and complete the Slack OAuth flow
What you should see: The Slack module appears on the canvas with a lightning bolt icon indicating it's an instant trigger. The connection field shows your Slack workspace name in green.
Common mistake — Make's Slack 'Watch Messages' trigger requires the Slack app to be invited to each channel you want to monitor. If you skip this, the trigger fires zero events. Run '/invite @Make' in every channel you plan to watch.
Make
+
click +
search apps
Slack
SL
Slack
Add the Slack trigger module
Slack
SL
module added
3

Slack module > Settings panel > Channel ID

Configure the Slack trigger for your target channel

In the Slack module settings, set the 'Channel ID' field to the specific channel you want to watch — for example, #design-requests or #eng-bugs. Click the Channel ID field and start typing the channel name; Make will autocomplete from your workspace. Set 'Trigger on' to 'New Message' and leave 'Include Bot Messages' set to No to avoid infinite loops if any bots post in those channels.

  1. 1Click the Channel ID field and start typing your channel name
  2. 2Select the correct channel from the autocomplete dropdown
  3. 3Set 'Trigger on' to 'New Message'
  4. 4Set 'Include Bot Messages' to 'No'
  5. 5Click 'OK' to save the module settings
What you should see: The module settings panel shows your chosen channel name (not just an ID) and 'New Message' as the trigger event. The module card on the canvas shows the channel name beneath the Slack icon.
Common mistake — If you need to watch multiple channels, don't duplicate this trigger — you'll create separate scenarios or use a single trigger on a shared channel. Watching 10+ channels with separate scenarios on Make's free tier will hit the 2-scenario active limit immediately.
4

Scenario canvas > Arrow between modules > Filter (funnel icon)

Add a filter to check for @mentions

Click the small filter icon (the funnel) on the arrow between the Slack module and the next empty slot. This filter ensures the scenario only continues when the message actually contains an @mention. Without this, every single message in the channel creates a Todoist task — which is not what you want. In the filter condition, set the field to 'Text', set the operator to 'Contains', and enter '<@' as the value (that's the raw format Slack uses for user mentions in its API payload).

  1. 1Hover over the arrow after the Slack module until the funnel icon appears
  2. 2Click the funnel icon to open the Filter settings
  3. 3Set Field to 'Text' from the Slack output variables
  4. 4Set Operator to 'Contains (case insensitive)'
  5. 5Type '<@' in the value field
  6. 6Click 'OK' to apply the filter
What you should see: A small orange funnel icon now appears on the arrow between the Slack module and the next step, showing the filter is active. The label reads 'Text contains <@'.
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
5

Scenario canvas > + > Tools > Set Variable

Parse the @mention to extract the user ID

Add a 'Tools > Set Variable' module after the filter. Slack encodes mentions as '<@U12345ABC>' in message text. You need to extract the user ID between '<@' and '>'. In the variable value field, use Make's substring and indexOf functions to pull the ID out. Set Variable Name to 'mentioned_user_id' and paste the formula from the pro_tip_code section into the Variable Value field. This gives you a clean user ID like 'U12345ABC' that you'll resolve in the next step.

  1. 1Click the '+' after the filter to add a new module
  2. 2Search for 'Tools' and select it
  3. 3Choose 'Set Variable' from the module list
  4. 4Set Variable Name to 'mentioned_user_id'
  5. 5Paste the substring formula into the Variable Value field
  6. 6Click 'OK' to save
What you should see: The Set Variable module appears on the canvas. When you run a test, the output panel shows 'mentioned_user_id: U12345ABC' with a real Slack user ID — not the full '<@U12345ABC>' string.
Common mistake — If a message mentions multiple users, this formula only captures the first mention. That's intentional here — task assignment to one person. For multi-assignee handling you'd need a Repeater module and that adds significant complexity.
6

Scenario canvas > + > Slack > Get a User

Look up the Slack user's name

Add a Slack module for 'Get a User'. Map the 'User ID' field to the 'mentioned_user_id' variable from the previous step. This call returns the user's real name and email, which you'll use to set the Todoist task assignee and make the task description human-readable. Without this step, your Todoist tasks will show raw IDs instead of names.

  1. 1Click '+' to add a module after Set Variable
  2. 2Select 'Slack' from the app list
  3. 3Choose 'Get a User' from the action list
  4. 4Map the User ID field to '{{mentioned_user_id}}' from the previous module
  5. 5Click 'OK' to save
What you should see: Running a test on this module returns a JSON object with fields including 'real_name', 'name', and 'profile.email' populated with real values from your workspace.
Common mistake — This API call counts as one Make operation. At 1,000 Slack mentions/month, that's 1,000 extra operations — factor this into your plan math.
7

Scenario canvas > + > Tools > Set Variable

Map the channel to a Todoist project

Add a 'Tools > Set Variable' module to map the Slack channel name to a specific Todoist project ID. This is the core routing logic. Use Make's if() function to check the channel name and return the right Todoist project ID. For example: if the channel is #design-requests, route to your Design project ID; if it's #eng-bugs, route to Engineering. You can get Todoist project IDs from the Todoist API or by running a 'List Projects' module and noting the IDs in the output.

  1. 1Click '+' to add another Set Variable module
  2. 2Set Variable Name to 'target_project_id'
  3. 3Open the formula editor and write an if() expression mapping channel names to project IDs
  4. 4Test the formula by clicking 'Run once' and checking the output panel
  5. 5Click 'OK' to save
What you should see: The output panel shows 'target_project_id: 2345678901' — a numeric Todoist project ID corresponding to the channel the message came from.
Common mistake — Todoist project IDs are long integers, not names. Copy them exactly from the Todoist API output or from a 'List Projects' test run. Mistyping one digit silently routes tasks to the wrong project with no error.
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

Scenario canvas > + > Todoist > List Collaborators

Find the Todoist collaborator to assign

Add a Todoist module for 'Get a Project Collaborator' or use 'List Collaborators' to find the right person by email. Map the email field to the Slack user's profile email from Step 6. This returns a Todoist user ID that you'll use in the task creation step. If your Slack emails don't match Todoist emails, you'll need a manual mapping table in a Google Sheet or Make's Data Store — plan for this before going live.

  1. 1Click '+' to add a Todoist module
  2. 2Connect your Todoist account via OAuth if not already connected
  3. 3Choose 'List Collaborators' from the module list
  4. 4Set the Project ID field to '{{target_project_id}}' from Step 7
  5. 5Add a subsequent filter or iterator to match by email against the Slack user email from Step 6
What you should see: Running a test returns an array of collaborator objects. Each has an 'id' and 'email'. You can see your team members listed with their Todoist numeric user IDs.
Common mistake — Todoist only allows task assignment to users who are already collaborators on that specific project. If the mentioned user isn't added to the project in Todoist, the task creation will fail with a 400 error. Add all team members to the relevant Todoist projects before activating this scenario.
9

Scenario canvas > + > Todoist > Create a Task

Create the Todoist task

Add a Todoist module for 'Create a Task'. Map Content to the Slack message text from Step 2. Map Project ID to '{{target_project_id}}'. Map Assignee ID to the collaborator ID resolved in Step 8. Set Description to include the Slack channel name, the sender's name (from Slack message 'User' field), and the timestamp so anyone reading the task knows exactly where it came from. Set a due date of today or leave it blank depending on your team's preference.

  1. 1Click '+' to add a Todoist module
  2. 2Select 'Create a Task'
  3. 3Map 'Content' to the Slack message text variable
  4. 4Map 'Project ID' to '{{target_project_id}}'
  5. 5Map 'Assignee ID' to the collaborator ID from Step 8
  6. 6Set 'Description' to a formatted string including channel name, sender name, and message link
What you should see: A test run creates a real task in Todoist assigned to the correct person, in the correct project, with the Slack message as the task content. Open Todoist and confirm the task appears under the right project and assignee.
10

Scenario canvas > Module right-click > Add error handler | Scenario Settings > gear icon

Add error handling to the scenario

Click the wrench icon on any module where failure is likely — specifically the Todoist 'Create a Task' module and the 'Get a User' Slack module. Set the error handler to 'Break' so the scenario stops cleanly rather than silently skipping. In the scenario settings (top right gear icon), enable 'Auto commit' to save scenario state between runs and enable 'Sequential processing' so messages don't race if two @mentions arrive within seconds of each other.

  1. 1Right-click the Todoist 'Create a Task' module
  2. 2Select 'Add error handler'
  3. 3Choose 'Break' as the error handler type
  4. 4Click the gear icon in the top right of the canvas
  5. 5Enable 'Sequential processing' in scenario settings
  6. 6Click 'Save' on the settings panel
What you should see: The Todoist task module now shows a red error handler route branching off it. In Scenario Settings, 'Sequential processing' shows a checkmark.
Common mistake — Setting 'Ignore' as an error handler here would silently swallow failures — you'd never know a task wasn't created. Always use 'Break' for task creation workflows so failures surface in the Make execution history.
11

Scenario canvas > Save button > ON/OFF toggle

Activate the scenario and run a live test

Click the blue 'Save' button, then flip the toggle at the bottom of the canvas from OFF to ON. Post a test message in your target Slack channel that @mentions a team member — something like '@sarah can you review the homepage copy?'. Watch the Make scenario execution history refresh. Within 10-15 seconds you should see a green execution record. Open Todoist and confirm the task appeared assigned to Sarah in the correct project.

  1. 1Click the blue 'Save' button in the bottom right
  2. 2Flip the scenario toggle from OFF to ON
  3. 3Post a test @mention message in your watched Slack channel
  4. 4Click 'History' in the top menu to watch executions come in
  5. 5Open Todoist and verify the task was created with correct assignment and project
What you should see: The execution history shows a green checkmark within 15 seconds of posting the Slack message. The Todoist task exists with the correct content, assignee, and project. The task description includes the channel name and sender.

This formula goes in the Variable Value field of the 'Set Variable' module in Step 5. It extracts a clean Slack user ID from the raw message text. Paste it into the formula editor — click the 'fx' icon in the Variable Value field to open it.

JavaScript — Custom Function{{substring(
▸ Show code
{{substring(
  1.text,
  add(

... expand to see full code

{{substring(
  1.text,
  add(
    indexOf(1.text, "<@"),
    2
  ),
  subtract(
    indexOf(
      substring(
        1.text,
        add(indexOf(1.text, "<@"), 2),
        length(1.text)
      ),
      ">"
    ),
    0
  )
)}}

// What this does:
// 1. indexOf(1.text, "<@") finds the position of the mention start
// 2. add(..., 2) skips past the "<@" characters
// 3. The outer substring starts from that position
// 4. The inner indexOf finds the closing ">" in the remaining string
// 5. Result is a clean user ID like "U08XYZ3456"
// Replace "1.text" with your actual Slack module number if it's not module 1
// Example input:  "<@U08XYZ3456> can you fix this?"
// Example output: "U08XYZ3456"
Make
▶ Run once
executed
Slack
Todoist
Todoist
🔔 notification
received

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 visual routing logic that's easy to hand off to a non-developer. The Router and filter modules let you see exactly which channel maps to which project without reading code. Make also handles the webhook connection to Slack natively — no server setup, no ngrok. The one scenario where you'd pick something else: if you already have n8n self-hosted and your team has a developer available, n8n's code node gives you cleaner multi-mention parsing in about 8 lines of JavaScript versus Make's nested substring formulas.

Cost

The operation math is straightforward. Each Slack mention that passes the filter runs through 5 modules: Set Variable (mention parse), Slack Get User, Set Variable (project mapping), Todoist List Collaborators, Todoist Create Task. That's 5 operations per task. At 200 Slack @mentions per month across your channels, you're spending 1,000 operations. Make's free tier gives you 1,000 operations/month — you'll hit the ceiling fast. The Core plan at $9/month includes 10,000 operations, which covers 2,000 tasks/month comfortably. Zapier would cost $19.99/month for the same volume on their Starter plan, and you'd still need a multi-step Zap structure that's harder to debug.

Tradeoffs

Zapier handles the basic version of this in about 8 minutes with their Slack + Todoist native integration, but it can't do conditional channel-to-project routing without a Formatter step and some creative workarounds — you'd hit the 3-step Zap limit on the free tier immediately. n8n does the mention parsing more cleanly with a single Function node and handles multiple mentions per message natively, but the setup takes 3x longer. Power Automate has a Todoist connector but it's limited — the task creation action doesn't support assignee_id as of early 2024, which makes this workflow broken on that platform. Pipedream has excellent Slack and Todoist components but you're writing more code than most operations teams want to maintain. Make is the right call here because the visual scenario matches how non-developers think about routing rules.

Three things you'll hit after setup. First, Slack's API returns channel IDs in the message payload, not channel names — your if() routing formula needs to compare against IDs like 'C04ABCDEF12', not display names like 'design-requests'. Grab those IDs from Slack by right-clicking the channel name and copying the link. Second, Todoist task assignment silently fails with a generic 400 if the assignee isn't a project collaborator — there's no helpful error message differentiating this from other 400s. Third, Make's Slack webhook connection drops without warning if the Make app loses channel membership. Build a weekly check into your workflow review: post a test @mention every Monday and confirm the execution history shows a green run.

Ideas for what to build next

  • Post a Slack confirmation when the task is createdAdd a Slack 'Create a Message' module at the end of the scenario that replies in-thread to the original message with a link to the new Todoist task. This closes the loop so the sender knows the task was captured without checking Todoist manually.
  • Sync Todoist task completion back to SlackBuild a second Make scenario that watches for Todoist task completions in your mapped projects and posts a message to the originating Slack channel. You'll need to store the channel ID on the task description (which this workflow already does) and parse it back out on completion.
  • Add priority detection from message keywordsExtend the Set Variable formula in Step 7 to also set a Todoist priority level based on keywords in the message text — if the message contains 'urgent' or 'asap', map to priority 1 (red). Use Make's contains() function nested inside the existing if() block.

Related guides

Was this guide helpful?
Slack + Todoist overviewMake profile →