

How to Turn Slack Messages into Todoist Tasks with Power Automate
When a Slack message gets a specific emoji reaction, Power Automate instantly creates a Todoist task with the message text, sender, and channel as the task content.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Microsoft 365 teams who already use Power Automate and want action items from Slack captured in Todoist without switching context.
Not ideal for
Teams needing keyword-based triggers — Power Automate's Slack connector doesn't support message content filtering natively, so you'll need extra logic.
Sync type
real-timeUse case type
routingReal-World Example
A 20-person product team at a SaaS company uses this to capture action items buried in #sprint-planning. A designer adds a ✅ reaction to any message that needs follow-up, and within 30 seconds a Todoist task appears in the team's shared project. Before this, someone had to manually copy action items into Todoist after every planning meeting — things got missed at least twice a 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 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.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Task Content (Title) | content | |
| Project ID | project_id | |
7 optional fields▸ show
| Task Description | description |
| Due Date | due_date |
| Priority | priority |
| Slack Channel Name | |
| Slack Message Timestamp | |
| Slack User ID | |
| Labels / Section ID | section_id |
Step-by-Step Setup
make.powerautomate.com > Create > Automated cloud flow
Create a new Automated cloud flow
Go to make.powerautomate.com and sign in with your Microsoft 365 account. Click 'Create' in the left sidebar, then select 'Automated cloud flow' from the three options shown. Give the flow a name — something like 'Slack Reaction to Todoist Task' — so it's identifiable later. You'll be prompted to search for a trigger before the flow editor opens.
- 1Click 'Create' in the left sidebar
- 2Select 'Automated cloud flow'
- 3Type a flow name in the 'Flow name' field
- 4Click 'Skip' on the trigger picker — you'll add it manually in the next step
Flow canvas > Choose an operation > Search 'Slack' > Triggers tab
Add the Slack 'When a reaction is added to a message' trigger
Click the empty trigger block and type 'Slack' in the search bar. Select the Slack connector from the results — it shows the Slack bolt logo. From the list of triggers, choose 'When a reaction is added to a message'. This trigger fires in real-time via webhook whenever someone adds an emoji reaction in a channel you specify.
- 1Click the empty trigger block on the canvas
- 2Type 'Slack' in the search bar
- 3Click the Slack connector icon
- 4Click the 'Triggers' tab
- 5Select 'When a reaction is added to a message'
channel: {{channel}}
ts: {{ts}}
Trigger block > Sign in > Slack OAuth popup
Connect your Slack account
Click 'Sign in' when prompted inside the trigger block. A browser popup opens asking you to authorize Power Automate's access to your Slack workspace. Sign in with the Slack account that has access to the channels you want to monitor. The connection is saved under your Power Automate Connections and can be reused across flows.
- 1Click the 'Sign in' button inside the trigger block
- 2Authorize Power Automate in the Slack OAuth popup
- 3Select your workspace from the dropdown if prompted
- 4Click 'Allow'
Trigger block > Channel Name dropdown > Reaction Name field
Configure the trigger: channel and reaction
In the 'Channel Name' dropdown, select the Slack channel you want to monitor — for example, #sprint-planning. In the 'Reaction Name' field, type the emoji shortcode without colons — type 'white_check_mark' for ✅, or 'pushpin' for 📌. This is the specific reaction that will trigger task creation. Only messages in that channel with that exact reaction will fire the flow.
- 1Click the 'Channel Name' dropdown and select your target channel
- 2Click the 'Reaction Name' field
- 3Type the emoji shortcode without colons (e.g. 'white_check_mark')
Flow canvas > + New step > Search 'Slack' > Actions > Get message
Add a 'Get message' action to fetch the full message text
The reaction trigger only gives you the message timestamp and channel — it doesn't include the actual message text. Click '+ New step' and search for 'Slack'. Select the action 'Get message'. This fetches the full message content using the channel ID and message timestamp provided by the trigger. You'll need both to retrieve the right message.
- 1Click '+ New step' below the trigger
- 2Type 'Slack' in the search bar
- 3Click the 'Actions' tab
- 4Select 'Get message'
- 5In 'Channel ID', click inside the field and select 'Channel ID' from the dynamic content panel
- 6In 'Message Timestamp', select 'Message Timestamp' from the dynamic content panel
Flow canvas > + New step > Condition
Add a Condition to filter out bot messages
You don't want tasks created from bot messages or automated notifications. Click '+ New step' and search for 'Condition'. In the condition editor, set the left field to the dynamic content value 'Subtype' from the Get message action. Set the operator to 'is not equal to' and the right value to 'bot_message'. This ensures only human messages get converted to tasks.
- 1Click '+ New step'
- 2Search for 'Condition' and select it
- 3Click the left field in the condition row
- 4Select 'Subtype' from the Get message dynamic content
- 5Set the middle dropdown to 'is not equal to'
- 6Type 'bot_message' in the right field
Condition > If yes branch > Add an action > Search 'Todoist' > Sign in
Connect your Todoist account
Inside the 'If yes' branch, click 'Add an action'. Search for 'Todoist' in the connector search bar. Select the Todoist connector. You'll see a prompt to sign in — click it and authorize via Todoist's OAuth popup. Use the Todoist account that owns or has access to the project where tasks should be created.
- 1Click 'Add an action' inside the 'If yes' branch
- 2Type 'Todoist' in the search bar
- 3Select the Todoist connector
- 4Click 'Sign in'
- 5Complete the Todoist OAuth flow in the popup
If yes branch > Todoist > Create task
Add the 'Create task' Todoist action and map fields
Select 'Create task' from the Todoist actions list. The action block shows fields for Content, Project ID, Due Date, and Priority. Map these using dynamic content from earlier steps. For Content, combine the Slack message text with context — for example, prefix it with 'From @[User] in #[Channel]:' followed by the message body. Set Project ID by selecting your target Todoist project from the dropdown.
- 1Select 'Create task' from the Todoist action list
- 2Click the 'Content' field and type 'From Slack: ' then insert dynamic content 'Text' from Get message
- 3Click the 'Project ID' dropdown and select your target Todoist project
- 4Optionally set 'Due Date' to the expression 'utcNow()' for today's date
- 5Set 'Priority' to 2 (high) or leave default
If yes branch > Add an action > Data Operation > Compose
Add a Compose action to build a clean task description
Before the Create task action, click 'Add an action' and search for 'Compose' — it's a Data Operation action. Use this step to build a formatted task description that includes the Slack channel name, the user who sent the message, the message timestamp converted to a readable date, and a direct link back to the Slack message. This gives whoever picks up the task full context without opening Slack.
- 1Click 'Add an action' above the Create task step
- 2Search for 'Compose' and select it under Data Operation
- 3In the Inputs field, build your description using dynamic content: 'Channel: #[Channel Name] | Sent by: [User] | Link: https://slack.com/archives/[Channel ID]/p[Message Timestamp]'
Paste this into a 'Compose' action placed between 'Get message' and 'Create task'. It resolves the raw Slack timestamp into a readable date, strips HTML entities from the message text, caps content at 490 characters, and builds a direct deep-link URL back to the original Slack message. Reference the Compose output in the Todoist Content and Description fields.
JavaScript — Code Step// Power Automate Compose — paste each expression into its own Compose step▸ Show code
// Power Automate Compose — paste each expression into its own Compose step // Step A: Clean message text (strip HTML entities, cap at 490 chars) replace(
... expand to see full code
// Power Automate Compose — paste each expression into its own Compose step
// Step A: Clean message text (strip HTML entities, cap at 490 chars)
replace(
replace(
replace(
if(
greater(length(body('Get_message')?['text']), 490),
concat(substring(body('Get_message')?['text'], 0, 490), '...'),
body('Get_message')?['text']
),
'&', '&'
),
'<', '<'
),
'>', '>'
)
// Step B: Convert Slack timestamp to readable date
// Slack timestamps are Unix epoch with microseconds (e.g. 1712145600.000200)
formatDateTime(
addSeconds(
'1970-01-01T00:00:00Z',
int(first(split(triggerBody()?['event']?['event_ts'], '.')))
),
'yyyy-MM-dd HH:mm UTC'
)
// Step C: Build Slack deep link
// Channel IDs start with C, timestamps need the dot removed and prefixed with p
concat(
'https://slack.com/archives/',
triggerBody()?['event']?['item']?['channel'],
'/p',
replace(triggerBody()?['event']?['item']?['ts'], '.', '')
)Flow canvas > Save > Test > Manually > Test
Test the flow with a live Slack reaction
Click 'Save' at the top of the flow canvas, then click 'Test' in the top-right corner. Select 'Manually' and then 'Test'. Power Automate will wait for a real trigger event. Go to Slack, find a message in your configured channel, and add the reaction you specified. Return to Power Automate — the test panel should show each step turning green within 15-30 seconds.
- 1Click 'Save' at the top of the canvas
- 2Click 'Test' in the top-right
- 3Select 'Manually' and click 'Test'
- 4Go to Slack and add the configured reaction to any message in the monitored channel
- 5Return to Power Automate and watch the run panel
make.powerautomate.com > My flows > [Flow name] > 28-day run history
Turn the flow on and monitor the run history
Click 'Turn on' if the flow isn't already active after saving. Navigate to 'My flows' in the left sidebar and click the flow name to open its detail page. The '28-day run history' section at the bottom shows every trigger event, whether it succeeded or failed, and the exact inputs and outputs at each step. Check this after your team uses the reaction for the first time in a real conversation.
- 1Click 'Turn on' if prompted on the canvas
- 2Navigate to 'My flows' in the left sidebar
- 3Click your flow name
- 4Scroll to '28-day run history' to see live run logs
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 Power Automate for this if your team already lives in the Microsoft 365 ecosystem. The Slack and Todoist connectors are pre-built, the OAuth flow takes under 3 minutes, and if your organization uses SharePoint or Teams alongside Slack, you can extend this flow to log tasks there too without adding another tool. Power Automate also handles the webhook registration for you — you never touch Slack's API dashboard directly. The one scenario where you'd switch: if your team is on a free Microsoft plan without Power Automate access, or if you need keyword-based triggers instead of reaction-based ones. In those cases, Make is faster to configure for this specific workflow.
The cost math is straightforward. Power Automate's standard Microsoft 365 license includes 6,000 cloud flow runs per month, shared across all your flows. This workflow uses 1 run per reaction event. A team of 20 people adding 5 reactions per day averages 3,100 runs per month — well inside the free limit. If you're on the Power Automate free plan (Microsoft account only, no 365), you get 750 runs/month, which covers roughly 25 reactions per day. Beyond that, Power Automate Per User plan is $15/user/month for unlimited runs. Zapier's equivalent would cost $19.99/month just for 2-step Zaps at 750 tasks — Power Automate is cheaper at scale if you're already paying for Microsoft 365.
Make handles the same flow for free up to 1,000 operations/month and gives you a cleaner visual canvas for the 'get message then create task' sequence — no hunting through dynamic content panels. Zapier's Slack trigger for reactions is more reliable than Power Automate's in practice (fewer webhook drops reported), and setup takes 6 minutes versus 15. n8n lets you self-host and adds JavaScript transforms directly on the message text before it hits Todoist — useful if you want to strip Slack markup like <@U04KRM> mentions from the task title. Pipedream gives you full Node.js and handles Slack's real event payload directly via webhook, which means no polling lag at all. Power Automate is still the right call here if you're managing this for a corporate team with Microsoft 365 licensing in place — IT already trusts it, the connectors are enterprise-supported, and you don't need a separate account.
Three things you'll hit after setup. First, the Slack webhook subscription silently drops every 2-4 weeks in some tenants — the flow stops triggering with no error notification unless you've configured failure emails. Toggle the flow off and on to re-register. Second, Slack message text arrives with its own markup syntax: user mentions come through as '<@U04KRMB92>' not '@john', and channel links as '<#C01ABC123|sprint-planning>'. This appears verbatim in Todoist tasks unless you add expressions to strip or replace those patterns. Third, if you're monitoring a high-traffic channel like #general, the flow will fire on every reaction of that emoji type — not just action-item reactions. Scope your monitoring channel tightly from day one, or add a secondary condition checking that the message was sent in the last 2 hours to avoid retroactive task creation from old messages.
Ideas for what to build next
- →Add Todoist task assignee based on who reacted — Extend the flow to look up the Slack user who added the reaction using the Slack 'Get user profile' action, match them to a Todoist collaborator by email, and auto-assign the task. This removes the 'who owns this?' ambiguity from team-captured tasks.
- →Post a Slack confirmation message when the task is created — After the Todoist Create task action, add a Slack 'Post message' action that replies in the original thread with a confirmation: 'Task created in Todoist: [task URL]'. Team members get instant confirmation that the action item was captured.
- →Set up a daily digest of Slack-captured tasks — Build a second Scheduled cloud flow that runs every morning at 9am, queries Todoist for all tasks with a 'from-slack' label created in the last 24 hours, and posts a summary to a designated #daily-tasks Slack channel. This replaces the need to check Todoist manually.
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