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

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

Use case type

routing

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

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

Power Automate account with a Microsoft 365 license (the Slack and Todoist connectors are available on the free plan, but flow runs count against your daily limits)
Slack account with member access to the channel you want to monitor — admin rights are not required, but you must be in the channel
Todoist account with access to the project where tasks will be created — a free Todoist account works, but you'll be limited to 5 active projects
Permission to install third-party OAuth apps in your Slack workspace — if your workspace restricts app installs, you'll need a Slack admin to approve Power Automate
The exact emoji shortcode for the reaction you want to use as a trigger — find it by hovering over the emoji in Slack and noting the name shown in the tooltip

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Content (Title)content
Project IDproject_id
7 optional fields▸ show
Task Descriptiondescription
Due Datedue_date
Prioritypriority
Slack Channel Name
Slack Message Timestamp
Slack User ID
Labels / Section IDsection_id

Step-by-Step Setup

1

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.

  1. 1Click 'Create' in the left sidebar
  2. 2Select 'Automated cloud flow'
  3. 3Type a flow name in the 'Flow name' field
  4. 4Click 'Skip' on the trigger picker — you'll add it manually in the next step
What you should see: The flow canvas opens with an empty trigger block labeled 'Choose an operation'.
Common mistake — Don't use 'Instant cloud flow' by mistake — that requires a manual button click to run and won't fire on Slack events automatically.
2

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.

  1. 1Click the empty trigger block on the canvas
  2. 2Type 'Slack' in the search bar
  3. 3Click the Slack connector icon
  4. 4Click the 'Triggers' tab
  5. 5Select 'When a reaction is added to a message'
What you should see: The trigger block expands showing fields for 'Channel Name' and 'Reaction Name'.
Common mistake — The Slack connector here is the standard Microsoft-managed one, not a custom connector. It only supports public channels unless your Slack app has been explicitly granted private channel access.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
3

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.

  1. 1Click the 'Sign in' button inside the trigger block
  2. 2Authorize Power Automate in the Slack OAuth popup
  3. 3Select your workspace from the dropdown if prompted
  4. 4Click 'Allow'
What you should see: The trigger block shows your Slack workspace name next to a green checkmark, and the Channel Name and Reaction Name fields become active.
Common mistake — You must authorize as a user who is already a member of the channels you want to monitor. The bot cannot join channels automatically.
Power Automate settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Power Automate
popup window
Connected
green checkmark
4

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.

  1. 1Click the 'Channel Name' dropdown and select your target channel
  2. 2Click the 'Reaction Name' field
  3. 3Type the emoji shortcode without colons (e.g. 'white_check_mark')
What you should see: Both fields show your selections. The trigger is now scoped to one channel and one reaction type.
Common mistake — Reaction Name is case-sensitive and must match Slack's internal shortcode exactly. 'check' won't work — it must be 'white_check_mark'. Confirm the exact shortcode by hovering over the emoji in Slack.
Power Automate
+
click +
search apps
Slack
SL
Slack
Configure the trigger: chann…
Slack
SL
module added
5

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.

  1. 1Click '+ New step' below the trigger
  2. 2Type 'Slack' in the search bar
  3. 3Click the 'Actions' tab
  4. 4Select 'Get message'
  5. 5In 'Channel ID', click inside the field and select 'Channel ID' from the dynamic content panel
  6. 6In 'Message Timestamp', select 'Message Timestamp' from the dynamic content panel
What you should see: The Get message action block shows both fields populated with dynamic content tokens from the trigger.
Common mistake — Use 'Channel ID' (the Cx... value) from dynamic content, not 'Channel Name' — the API call requires the ID, not the human-readable name.
6

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.

  1. 1Click '+ New step'
  2. 2Search for 'Condition' and select it
  3. 3Click the left field in the condition row
  4. 4Select 'Subtype' from the Get message dynamic content
  5. 5Set the middle dropdown to 'is not equal to'
  6. 6Type 'bot_message' in the right field
What you should see: The condition block shows two branches: 'If yes' (not a bot message) and 'If no'. Your Todoist action will go in the 'If yes' branch.
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
7

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.

  1. 1Click 'Add an action' inside the 'If yes' branch
  2. 2Type 'Todoist' in the search bar
  3. 3Select the Todoist connector
  4. 4Click 'Sign in'
  5. 5Complete the Todoist OAuth flow in the popup
What you should see: The Todoist connection appears with your account email confirmed. The action picker now shows available Todoist actions.
Common mistake — The Todoist connector in Power Automate uses Todoist's REST API v2. If your Todoist account uses a legacy API token setup, OAuth here may conflict. Use a fresh OAuth login, not a copied API token.
8

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.

  1. 1Select 'Create task' from the Todoist action list
  2. 2Click the 'Content' field and type 'From Slack: ' then insert dynamic content 'Text' from Get message
  3. 3Click the 'Project ID' dropdown and select your target Todoist project
  4. 4Optionally set 'Due Date' to the expression 'utcNow()' for today's date
  5. 5Set 'Priority' to 2 (high) or leave default
What you should see: The Create task block shows Content with a mix of static text and dynamic tokens, plus a resolved Project ID.
Common mistake — The 'Content' field in Todoist supports Markdown links. If the Slack message contains special characters like '<', '>', or '&', they may arrive as HTML entities from the Slack API — use a Compose step to clean them first if needed.
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

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.

  1. 1Click 'Add an action' above the Create task step
  2. 2Search for 'Compose' and select it under Data Operation
  3. 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]'
What you should see: The Compose block shows a formatted string with dynamic tokens. The output of this Compose step can be piped into the Todoist task's Description field.

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']
      ),
      '&amp;', '&'
    ),
    '&lt;', '<'
  ),
  '&gt;', '>'
)

// 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'], '.', '')
)
10

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.

  1. 1Click 'Save' at the top of the canvas
  2. 2Click 'Test' in the top-right
  3. 3Select 'Manually' and click 'Test'
  4. 4Go to Slack and add the configured reaction to any message in the monitored channel
  5. 5Return to Power Automate and watch the run panel
What you should see: Each step shows a green checkmark. The run detail shows the Slack message text under Get message and a Todoist task ID under Create task. Check Todoist directly to confirm the task appeared.
Common mistake — If the test times out without firing, check that the reaction was added to a message in the exact channel configured — not a thread reply. Reactions on thread replies use a different Slack event type.
Power Automate
▶ Test flow
executed
Slack
Todoist
Todoist
🔔 notification
received
11

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.

  1. 1Click 'Turn on' if prompted on the canvas
  2. 2Navigate to 'My flows' in the left sidebar
  3. 3Click your flow name
  4. 4Scroll to '28-day run history' to see live run logs
What you should see: The run history table shows each reaction event as a row with a green 'Succeeded' badge. Failed runs show a red badge with an expandable error detail.

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

Cost

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.

Tradeoffs

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 reactedExtend 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 createdAfter 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 tasksBuild 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

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