

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-timeUse case type
routingReal-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.
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 | ||
| 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
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.
- 1Click 'Create a new scenario' in the top right
- 2Click the pencil icon next to 'New scenario' at the top
- 3Type a name like 'Slack Mention → Todoist Task'
- 4Press Enter to save the name
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.
- 1Click the '+' circle on the canvas
- 2Type 'Slack' in the search box
- 3Select 'Slack' from the results
- 4Choose 'Watch Messages' from the trigger list
- 5Click 'Add' next to the connection field and complete the Slack OAuth flow
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.
- 1Click the Channel ID field and start typing your channel name
- 2Select the correct channel from the autocomplete dropdown
- 3Set 'Trigger on' to 'New Message'
- 4Set 'Include Bot Messages' to 'No'
- 5Click 'OK' to save the module settings
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).
- 1Hover over the arrow after the Slack module until the funnel icon appears
- 2Click the funnel icon to open the Filter settings
- 3Set Field to 'Text' from the Slack output variables
- 4Set Operator to 'Contains (case insensitive)'
- 5Type '<@' in the value field
- 6Click 'OK' to apply the filter
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.
- 1Click the '+' after the filter to add a new module
- 2Search for 'Tools' and select it
- 3Choose 'Set Variable' from the module list
- 4Set Variable Name to 'mentioned_user_id'
- 5Paste the substring formula into the Variable Value field
- 6Click 'OK' to save
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.
- 1Click '+' to add a module after Set Variable
- 2Select 'Slack' from the app list
- 3Choose 'Get a User' from the action list
- 4Map the User ID field to '{{mentioned_user_id}}' from the previous module
- 5Click 'OK' to save
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.
- 1Click '+' to add another Set Variable module
- 2Set Variable Name to 'target_project_id'
- 3Open the formula editor and write an if() expression mapping channel names to project IDs
- 4Test the formula by clicking 'Run once' and checking the output panel
- 5Click 'OK' to save
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.
- 1Click '+' to add a Todoist module
- 2Connect your Todoist account via OAuth if not already connected
- 3Choose 'List Collaborators' from the module list
- 4Set the Project ID field to '{{target_project_id}}' from Step 7
- 5Add a subsequent filter or iterator to match by email against the Slack user email from Step 6
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.
- 1Click '+' to add a Todoist module
- 2Select 'Create a Task'
- 3Map 'Content' to the Slack message text variable
- 4Map 'Project ID' to '{{target_project_id}}'
- 5Map 'Assignee ID' to the collaborator ID from Step 8
- 6Set 'Description' to a formatted string including channel name, sender name, and message link
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.
- 1Right-click the Todoist 'Create a Task' module
- 2Select 'Add error handler'
- 3Choose 'Break' as the error handler type
- 4Click the gear icon in the top right of the canvas
- 5Enable 'Sequential processing' in scenario settings
- 6Click 'Save' on the settings panel
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.
- 1Click the blue 'Save' button in the bottom right
- 2Flip the scenario toggle from OFF to ON
- 3Post a test @mention message in your watched Slack channel
- 4Click 'History' in the top menu to watch executions come in
- 5Open Todoist and verify the task was created with correct assignment and project
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"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 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.
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.
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 created — Add 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 Slack — Build 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 keywords — Extend 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
How to Assign Todoist Tasks from Slack Mentions with Pipedream
~15 min setup
How to Assign Todoist Tasks from Slack Mentions with Power Automate
~15 min setup
How to Assign Todoist Tasks from Slack Mentions with n8n
~20 min setup
How to Assign Todoist Tasks from Slack Mentions with Zapier
~8 min setup
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