Intermediate~15 min setupCommunication & Project ManagementVerified April 2026
Slack logo
Todoist logo

How to Assign Todoist Tasks from Slack Mentions with Power Automate

Automatically creates a Todoist task assigned to a specific team member whenever they are mentioned in a designated Slack channel, pulling the channel name and message text as task context.

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

Best for

Teams already inside the Microsoft 365 ecosystem who use Slack for project channels and Todoist for individual task tracking

Not ideal for

Teams that need bidirectional sync between Todoist and Slack — this flow only moves data one direction

Sync type

real-time

Use case type

routing

Real-World Example

💡

A 22-person product agency uses project-specific Slack channels like #client-acme and #client-globex. When a project manager types '@jordan please write the QA checklist for launch', the flow fires within 90 seconds and creates a Todoist task in the Agency Work project assigned to Jordan, with the full Slack message as the task description and the channel name as a label. Before this, Jordan missed roughly 3-4 task requests per week because they were buried in Slack threads.

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 Power Automate

Copy the pre-built Power Automate blueprint and paste it straight into Power Automate. 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 or a user account with the 'users:read', 'users:read.email', 'channels:history', and 'chat:write' OAuth scopes available for the Power Automate connection
Todoist account with at least one existing project — tasks cannot be created without a target project ID
Power Automate account with a license that includes premium connectors (the Slack connector is a premium connector and requires a paid Power Automate plan or Microsoft 365 plan that includes Power Automate premium)
Access to make.powerautomate.com — confirm you can create Automated cloud flows (some organizational policies restrict flow creation to specific users)
The Slack channels you want to monitor must be public or the authenticated Slack user must be a member of those private channels

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Contentcontent
Project IDproject_id
Slack User ID
Assignee Display Name
Slack Channel Name
5 optional fields▸ show
Task Descriptiondescription
Labellabels
Prioritypriority
Due Datedue_date
Message Timestamp

Step-by-Step Setup

1

make.powerautomate.com > My flows > + New flow > Automated cloud flow

Create a new Automated cloud flow in Power Automate

Go to make.powerautomate.com and sign in. In the left sidebar click 'My flows', then click '+ New flow' in the top menu. Select 'Automated cloud flow' from the dropdown — this is the correct type because the trigger is an external event, not a schedule. Give your flow a name like 'Slack Mention → Todoist Task' and click 'Create'.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click '+ New flow' at the top of the page
  3. 3Select 'Automated cloud flow'
  4. 4Enter a flow name: 'Slack Mention → Todoist Task'
  5. 5Click 'Skip' on the trigger picker — you will set it in the next step
What you should see: The flow canvas opens with an empty trigger block labeled 'When this happens...' at the top.
Common mistake — Do not choose 'Instant cloud flow' — that requires manual triggering and will not fire on Slack messages.
2

Flow canvas > Trigger block > Search: Slack > When a new message is posted to a channel

Add the Slack trigger: 'When a new message is posted to a channel'

Click the empty trigger block on the canvas. In the search bar type 'Slack' and select the Slack connector. Choose the trigger 'When a new message is posted to a channel'. This trigger uses a webhook registered by Power Automate directly with Slack's API — no polling interval to configure. You will be prompted to authenticate your Slack workspace if you have not connected it before.

  1. 1Click the trigger block labeled 'When this happens...'
  2. 2Type 'Slack' in the connector search bar
  3. 3Click the Slack connector card
  4. 4Select 'When a new message is posted to a channel' from the trigger list
  5. 5Click 'Sign in' and authenticate with your Slack workspace credentials
What you should see: The trigger block now shows the Slack logo and the trigger name. A 'Channel Name' dropdown appears below it.
Common mistake — The Slack connector in Power Automate requires the workspace admin to approve the OAuth connection if your org has app approval policies enabled. Check with your Slack admin before building — a blocked connection silently fails.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
3

Flow canvas > Slack trigger > Channel Name dropdown

Select the target Slack channel

In the trigger configuration, click the 'Channel Name' dropdown. Power Automate will load the list of public channels your authenticated Slack user can see. Select the specific project channel you want to monitor, such as #client-acme. If you want to monitor multiple channels, you will need to either duplicate this flow per channel or use a filter in a later step after selecting a broad channel.

  1. 1Click the 'Channel Name' dropdown inside the trigger block
  2. 2Wait for the channel list to load (takes 3-5 seconds)
  3. 3Select your target channel, e.g., 'client-acme'
  4. 4Leave all other trigger fields at their defaults
What you should see: The channel name appears in the trigger block. The trigger is now scoped to messages in that specific channel only.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.
4

Flow canvas > + New step > Control > Condition

Add a Condition to filter only messages containing an @mention

Not every message in the channel should create a task — only messages where a team member is mentioned. Click '+ New step', search for 'Condition', and select the 'Condition' control. In the left value field, insert the dynamic value 'Text' from the Slack trigger (this is the raw message text). Set the operator to 'contains'. In the right value field, type '<@' — this is how Slack encodes user mentions in its API payload (e.g., '<@U04XKBT2J>'). Only messages with at least one mention will pass through to the Yes branch.

  1. 1Click '+ New step' below the trigger
  2. 2Search for 'Condition' and select it from Control
  3. 3Click into the left value field and select dynamic value 'Text' from the Slack trigger
  4. 4Set the operator dropdown to 'contains'
  5. 5Type '<@' in the right value field
What you should see: A Condition block appears with a 'Yes' branch and a 'No' branch. All subsequent task-creation steps will go inside the 'Yes' branch.
Common mistake — Slack encodes mentions as '<@USERID>' not '@displayname' in the raw API text. Do not filter on '@' alone — that also catches channel-wide mentions like @here and @channel, which would spam Todoist with tasks.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Todoist
TO
notified
5

Flow canvas > Yes branch > Add an action > Data Operation > Compose

Parse the mentioned user ID from the message text

Inside the 'Yes' branch, click 'Add an action'. Search for 'Compose' and add a Data Operation > Compose action. You will use a Power Automate expression to extract the user ID from the raw Slack mention string. In the Inputs field, click 'Expression' tab and enter the formula shown in the pro tip section. This extracts the string between '<@' and '>' to get the raw Slack user ID (e.g., U04XKBT2J). You will map this to the Todoist assignee in a later step.

  1. 1Click 'Add an action' inside the Yes branch
  2. 2Search for 'Compose' and select 'Data Operation > Compose'
  3. 3Click into the Inputs field
  4. 4Switch to the 'Expression' tab in the dynamic content panel
  5. 5Enter the extraction expression (see pro tip) and click OK
What you should see: The Compose action shows the expression formula in the Inputs field. The output of this step will be the raw Slack user ID string.
Common mistake — If a message contains multiple mentions, this expression extracts only the first one. For multi-assignee scenarios you would need a separate loop — out of scope for this single-task flow.
6

Flow canvas > Yes branch > Add an action > Slack > Get user profile

Look up the Slack user's display name

The Compose step outputs a Slack user ID like U04XKBT2J, which is not human-readable. Add a new action: search for 'Slack' and choose 'Get user profile'. Pass in the output of the Compose step (Outputs from the previous action) as the User ID field. This API call returns the user's display name, real name, and email. You will use the display name as the assignee label on the Todoist task.

  1. 1Click 'Add an action' below the Compose step
  2. 2Search for 'Slack' in the connector search
  3. 3Select 'Get user profile'
  4. 4In the User ID field, insert the dynamic value 'Outputs' from the previous Compose step
What you should see: The 'Get user profile' action block shows the User ID mapped. When you test the flow, this step will return the user's real name and email fields.
Common mistake — The 'Get user profile' action requires the 'users:read' and 'users:read.email' OAuth scopes on your Slack connection. If these are missing, the step returns a 403 and the flow stops here — check your connection scopes in the Power Automate Connections panel.
7

Flow canvas > Yes branch > Add an action > Todoist > Sign in

Connect your Todoist account

Add a new action and search for 'Todoist'. Select 'Todoist' from the connector list. Power Automate will immediately prompt you to sign in — click 'Sign in' and authenticate with the Todoist account that owns the project you want tasks created in. This creates a Connection entry in your Power Automate Connections list. The connection is tied to a single Todoist account, so tasks will appear in that account's projects.

  1. 1Click 'Add an action' below the Slack user profile step
  2. 2Search for 'Todoist' in the connector search bar
  3. 3Select any Todoist action temporarily to trigger authentication
  4. 4Click 'Sign in' in the connection prompt
  5. 5Authenticate with your Todoist credentials in the popup window
What you should see: A green checkmark appears next to the Todoist connection name. You are now ready to configure the task creation action.
Power Automate settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Power Automate
popup window
Connected
green checkmark
8

Flow canvas > Yes branch > Todoist > Create task

Add the Todoist 'Create task' action and map fields

With Todoist connected, change the action to 'Create task'. The action form shows fields for Content, Project ID, Due Date, Priority, and Labels. Map the fields as follows: set Content to a combination of the Slack message Text dynamic value; set Project ID by clicking the dropdown and selecting your target project; set Labels to the Slack Channel Name dynamic value from the trigger so each task is tagged with its source channel. Leave Due Date blank unless your team uses a standard SLA.

  1. 1Change or set the Todoist action to 'Create task'
  2. 2Click the Content field and insert dynamic value 'Text' from the Slack trigger
  3. 3Click the Project ID dropdown and select your target Todoist project
  4. 4Click the Labels field and insert dynamic value 'Channel Name' from the Slack trigger
  5. 5Optionally set Priority to 2 (high) for mention-based tasks
What you should see: The Create task block shows all mapped fields populated. The Content field shows the Slack message token, and the Project ID shows your selected project name.
Common mistake — Todoist's Power Automate connector uses numeric Project IDs internally. If you type a project name that doesn't match exactly, the task will fail silently. Always select from the dropdown rather than typing manually.
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
9

Flow canvas > Yes branch > Todoist > Create task > Description field

Add a task description with channel and sender context

The Todoist 'Create task' action has a Description field (sometimes labeled 'Note'). Click it and build a context string using dynamic values: insert 'Channel Name' from the Slack trigger, then the Slack message 'Text', then 'Message Timestamp' formatted as a readable date. This gives the assignee full context without needing to open Slack. The description should read something like: 'From #client-acme on [timestamp]: [full message text]'.

  1. 1Click the Description field inside the Create task action
  2. 2Type 'From #' then insert the dynamic value 'Channel Name'
  3. 3Type ' on ' then insert dynamic value 'Message Timestamp'
  4. 4Press Enter and insert dynamic value 'Text' from the Slack trigger
What you should see: The Description field shows a mix of static text and dynamic value tokens. On test run, the created Todoist task will have a full-context description.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.

This expression goes in the Inputs field of the Compose action (Step 5). It extracts the Slack user ID from the raw mention string format '<@USERID>'. Paste it in the Expression tab of the dynamic content panel — do not type it in the regular field editor or the syntax will break.

JavaScript — Code Step// Power Automate Expression — paste into the Compose action's Inputs field
▸ Show code
// Power Automate Expression — paste into the Compose action's Inputs field
// Extracts Slack user ID from mention format: <@U04XKBT2J>
substring(

... expand to see full code

// Power Automate Expression — paste into the Compose action's Inputs field
// Extracts Slack user ID from mention format: <@U04XKBT2J>

substring(
  triggerBody()?['text'],
  add(indexOf(triggerBody()?['text'], '<@'), 2),
  sub(
    indexOf(triggerBody()?['text'], '>'),
    add(indexOf(triggerBody()?['text'], '<@'), 2)
  )
)

// Result: 'U04XKBT2J'
// Use 'Outputs' from this Compose step as the User ID input in Get user profile

// Bonus: readable timestamp expression for the task description field
// Paste this separately in the Description field expression editor:
formatDateTime(
  addSeconds('1970-01-01T00:00:00Z', int(first(split(triggerBody()?['ts'], '.')))),
  'yyyy-MM-dd HH:mm'
)
// Result: '2024-04-12 14:00'
10

Flow canvas > Yes branch > Add an action > Slack > Post message

Post a confirmation message back to Slack

Add one final action inside the Yes branch: search for Slack and select 'Post message'. Set the Channel to the same channel from the trigger. In the Message Text field, type 'Task created for ' and then insert the 'Real Name' dynamic value from the 'Get user profile' step. This closes the loop so the team knows the task was captured without checking Todoist manually.

  1. 1Click 'Add an action' below the Todoist Create task step
  2. 2Search for 'Slack' and select 'Post message'
  3. 3Set Channel to the same channel from the trigger using the dynamic value 'Channel Name'
  4. 4In Message Text type 'Task created for ' and insert dynamic value 'Real Name' from Get user profile
  5. 5Click Save
What you should see: The flow now has five blocks in the Yes branch: Compose, Get user profile, Todoist connection, Create task, Post message. The No branch remains empty.
Common mistake — The Slack 'Post message' action posts as the authenticated user, not as a bot. If your team has strict channel posting policies, the message may appear to come from a personal account rather than an integration bot.
11

Flow canvas > Save > Test > Manually

Test the flow end-to-end and turn it on

Click 'Save' in the top menu, then click 'Test' and select 'Manually'. Go to the target Slack channel and post a message that includes a @mention, such as '@jordan please review the landing page copy'. Return to Power Automate — the test panel will show each step either green (success) or red (failure) with the actual data passed. Verify the Todoist task appeared in the correct project and the Slack confirmation message posted. Once confirmed, the flow is already live — no additional activation step is needed after a successful test save.

  1. 1Click 'Save' in the top toolbar
  2. 2Click 'Test' then select 'Manually'
  3. 3Go to your Slack channel and post a message with a @mention
  4. 4Return to Power Automate and watch the test run panel
  5. 5Check Todoist to confirm the task was created in the correct project
What you should see: All steps in the test run show green checkmarks. A new task appears in Todoist with the message text as content and the channel name as a label. A confirmation message appears in the Slack channel.
Power Automate
▶ Test flow
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 n8n for this workflow

Use Power Automate for this if your organization is already on Microsoft 365 and your team's IT department manages data residency or compliance requirements — Power Automate keeps the flow execution inside your Microsoft tenant, which matters for some industries. It is also the right call if you are building this alongside other internal Microsoft tools like Teams, SharePoint, or Dataverse and want one unified automation platform. The one scenario where you should pick something else: if your team has no Microsoft 365 presence at all, the premium connector cost for Slack alone makes Power Automate the most expensive option for what is a simple webhook-to-API task.

Cost

Power Automate's pricing for this flow works out to roughly 0.002 USD per run (cloud flows with premium connectors cost 15 USD/month per user for unlimited runs under fair-use limits, or 0.001 USD per API call if you are on the pay-per-use plan). At 200 Slack mentions per month — a realistic number for a 10-person team across 3 channels — you are looking at $0.20/month on pay-per-use, or flat-rate covered under a Microsoft 365 E3/E5 license you likely already own. Zapier would charge you $19.99/month minimum for multi-step Zaps at this volume. Make handles 200 operations free. If cost is your primary concern, Make wins by a wide margin.

Tradeoffs

Make handles this specific use case more cleanly — it has a dedicated Slack 'Watch Mentions' trigger that fires only on actual @mentions, saving you the Condition filter step entirely. Zapier has a cleaner Todoist integration with a native 'Create Task' Zap that exposes more fields in the UI without expression formulas. n8n lets you write JavaScript directly to parse the mention string and handle multi-assignee messages in a single node — no separate Compose step needed. Pipedream gives you the fastest iteration cycle with live code execution and better error visibility than Power Automate's run history UI. Power Automate is still the right answer here when the decision is made at the IT level, not the ops level — enterprise governance and existing licensing override the UX advantages of the other platforms.

Three things you will hit after setup. First, Slack's API delivers message edits as new events — if someone edits a message containing a mention, your flow creates a second duplicate task. Add a condition checking that the Slack trigger's 'Previous Message' field is empty to block edits from triggering. Second, the Todoist Power Automate connector occasionally returns a 429 rate-limit error during rapid bursts — it uses Todoist's REST API v2 which allows 450 requests per minute, but Power Automate's retry logic defaults to 3 attempts with exponential backoff, so you rarely see data loss, just delayed task creation. Third, if you rename a Todoist project, the numeric Project ID stays the same and the flow keeps working — but if you delete and recreate a project, the ID changes and the flow silently starts failing until you update the dropdown selection manually.

Ideas for what to build next

  • Add due date parsing from message textUse Power Automate's AI Builder text recognition or a simple contains() expression to detect date phrases like 'by Friday' in the Slack message and map them to the Todoist due_date field automatically.
  • Route tasks to different Todoist projects by channelAdd a Switch control after the Condition step that checks the Channel Name value and sets a different Project ID variable for each channel — so #client-acme tasks go to the Acme project and #client-globex tasks go to the Globex project.
  • Post a daily digest of open tasks back to each channelBuild a second Scheduled cloud flow that runs at 9am, queries Todoist for incomplete tasks with a specific channel label, and posts a formatted summary to that Slack channel — closing the loop so the whole team sees what's outstanding.

Related guides

Was this guide helpful?
Slack + Todoist overviewPower Automate profile →