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

How to Broadcast Todoist Task Completions in Slack with Power Automate

When a task is marked complete in Todoist, Power Automate posts a formatted announcement to a Slack channel so your team sees wins in real time.

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 Todoist completions surfaced in Slack without adding another SaaS tool.

Not ideal for

Teams who need instant sub-minute delivery — Power Automate polls Todoist every 1–5 minutes, so use Make or Zapier if latency matters.

Sync type

scheduled

Use case type

notification

Real-World Example

💡

A 12-person product team at a B2B SaaS company tracks sprint tasks in Todoist and communicates in Slack. Before this flow, the team lead manually posted 'Done' updates in #product-updates 2-3 times per week, often forgetting tasks completed over the weekend. After setup, every completed Todoist task drops into #product-wins automatically within 5 minutes, including the task name, project, and who completed it.

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.

Todoist account with at least one project containing tasks you can complete during testing
Slack workspace where you have permission to post messages — and membership in the target channel if it is private
Microsoft 365 account with Power Automate access (free plan works; premium connectors not required for Todoist or Slack)
Todoist OAuth permission to allow Power Automate read access to your tasks and projects
Slack OAuth permission to allow Power Automate to post messages on your behalf in the target workspace

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Contentcontent
Project Nameproject_id
Completed Datecompleted_at
5 optional fields▸ show
Task Descriptiondescription
Assignee Nameresponsible_uid
Due Datedue
Prioritypriority
Labelslabels

Step-by-Step Setup

1

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

Sign in and create a new Automated cloud flow

Go to make.powerautomate.com and sign in with your Microsoft 365 account. From the left sidebar, click 'My flows', then click '+ New flow' in the top-left corner. A dropdown appears — select 'Automated cloud flow'. In the dialog box, give your flow a name like 'Todoist Completion → Slack' and skip the trigger search for now by clicking 'Skip' at the bottom. You'll add the trigger manually in the next step.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click '+ New flow' in the top-left
  3. 3Select 'Automated cloud flow' from the dropdown
  4. 4Name the flow 'Todoist Completion → Slack'
  5. 5Click 'Skip' to dismiss the trigger picker dialog
What you should see: You land on the flow canvas with an empty 'Add a trigger' block at the top.
Common mistake — If you don't see '+ New flow', your Microsoft 365 license may not include Power Automate. Check with your IT admin — you need at least the free Power Automate plan attached to your account.
2

Flow canvas > Add a trigger > Search: Todoist > When a task is completed

Add the Todoist 'Task completed' trigger

Click the 'Add a trigger' block on the canvas. A right-hand panel opens with a search bar. Type 'Todoist' and select the Todoist connector from the results. Scroll through the trigger list until you find 'When a task is completed' and click it. Power Automate will immediately ask you to authenticate your Todoist account.

  1. 1Click the 'Add a trigger' placeholder block
  2. 2Type 'Todoist' in the search bar on the right panel
  3. 3Click the Todoist connector icon
  4. 4Select 'When a task is completed' from the trigger list
What you should see: A Todoist trigger card appears on the canvas with a 'Sign in' button and configuration fields below it.
Common mistake — The Todoist connector in Power Automate polls for completions roughly every 1–5 minutes depending on your plan. There is no webhook-based instant trigger available here — this is a known limitation of the connector.
Power Automate
+
click +
search apps
Slack
SL
Slack
Add the Todoist 'Task comple…
Slack
SL
module added
3

Todoist trigger card > Sign in > Todoist OAuth pop-up

Authenticate your Todoist connection

Click 'Sign in' inside the trigger card. A pop-up browser window opens pointing to Todoist's OAuth page. Log in with the Todoist account that owns the projects you want to monitor. Click 'Agree' to grant Power Automate read access. The pop-up closes and Power Automate shows your email address next to a green checkmark inside the trigger card.

  1. 1Click the 'Sign in' button inside the Todoist trigger card
  2. 2Log in to Todoist in the pop-up window
  3. 3Click 'Agree' on the Todoist permissions screen
  4. 4Wait for the pop-up to close automatically
What you should see: The trigger card now shows your Todoist email address and the 'Sign in' button is replaced by your connection name.
Common mistake — If your Todoist account uses Google or Apple SSO, use that same login method in the pop-up — entering a password directly will fail if you've never set one.
4

Todoist trigger card > Project dropdown

Configure the Todoist trigger filter

Inside the Todoist trigger card, you'll see a 'Project' dropdown. If you want the flow to fire for all projects, leave it set to 'All projects'. To target a specific project — say, your sprint board — click the dropdown and select the project name. There are no additional filter options in this connector for labels or assignees at the trigger level; you'll handle those with a condition in a later step.

  1. 1Click the 'Project' dropdown inside the trigger card
  2. 2Select a specific project or leave as 'All projects'
  3. 3Click 'Save' in the top-right corner to preserve this setting
What you should see: The trigger card shows your selected project name (or 'All projects') in the Project field.
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

Flow canvas > + New step > Control > Condition

Add a Condition to filter out irrelevant completions

Click the '+ New step' button below the trigger card. Search for 'Condition' and select the built-in Control action. This step prevents noise — for example, you might only want to announce tasks from a specific project or tasks with a specific label. In the left condition field, click inside and select 'Project Name' from the dynamic content panel. Set the operator to 'contains' and type your target project name in the right field.

  1. 1Click '+ New step' below the trigger card
  2. 2Search for 'Condition' in the action picker
  3. 3Select 'Condition' under the Control category
  4. 4Click inside the left value field and pick 'Project Name' from dynamic content
  5. 5Set operator to 'contains' and enter your project name in the right field
What you should see: A Condition card appears with two branches: 'If yes' and 'If no'. Your project name filter is visible in the condition row.
Common mistake — Dynamic content from the Todoist trigger can be sparse. If 'Project Name' doesn't appear, click 'See more' in the dynamic content panel — Power Automate hides fields after the first few.
6

Condition > If yes > Add an action > Slack > Post message (V2) > Sign in

Authenticate your Slack connection

Inside the 'If yes' branch, click 'Add an action'. Search for 'Slack' in the action picker. Select the Slack connector, then choose 'Post message (V2)'. A 'Sign in' button appears — click it. An OAuth pop-up opens for Slack. Select your workspace from the dropdown, then click 'Allow'. Power Automate stores this as a reusable Slack connection.

  1. 1Click 'Add an action' inside the 'If yes' branch
  2. 2Search 'Slack' and click the Slack connector
  3. 3Select 'Post message (V2)'
  4. 4Click 'Sign in' in the action card
  5. 5Select your Slack workspace and click 'Allow'
What you should see: The Slack action card shows your workspace name and the 'Sign in' button is replaced by a green connection indicator.
Common mistake — The Slack account you authenticate with must have permission to post in your target channel. If the channel is private, that user must be a member of it — otherwise the post will silently fail.
7

Post message (V2) card > Channel Name or ID > Message Text

Configure the Slack message content

Inside the 'Post message (V2)' card, click the 'Channel Name or ID' dropdown and select your target Slack channel — for example, #product-wins. In the 'Message Text' field, build your announcement using dynamic content from the Todoist trigger. Click inside the Message Text field, then use the dynamic content panel to insert fields. A good format: '✅ *[Task Content]* completed in *[Project Name]* by [Assignee Name]'. You can type static text and insert dynamic tokens inline.

  1. 1Click 'Channel Name or ID' and select your Slack channel (e.g. #product-wins)
  2. 2Click inside the 'Message Text' field
  3. 3Type '✅ *' then insert 'Task Content' from dynamic content
  4. 4Type '* completed in *' then insert 'Project Name'
  5. 5Type '* — completed by ' then insert 'Assignee Name' if available
What you should see: The Message Text field shows a mix of static text and blue dynamic content tokens representing Todoist fields.
Common mistake — Slack's Post message (V2) action in Power Automate does not support Block Kit by default. If you want rich formatting with buttons or sections, you'll need the 'Post message using Bot token' action and a custom JSON body instead.
8

Flow canvas > between trigger and condition > + New step > Data Operations > Parse JSON

Add a Parse JSON step to extract nested Todoist data

The Todoist trigger returns a raw JSON body that sometimes includes nested objects like 'due' dates and 'labels' as arrays. To access these cleanly, click '+ New step' before your Condition step and add a 'Data Operations – Parse JSON' action. In the 'Content' field, insert the 'Body' token from the Todoist trigger. Paste the schema from the pro tip section below into the Schema field. This gives you clean dynamic tokens like 'due date' and 'label names' throughout the rest of the flow.

  1. 1Click the '+' icon between the Todoist trigger and Condition cards
  2. 2Search 'Parse JSON' and select 'Data Operations – Parse JSON'
  3. 3Click the 'Content' field and insert the 'Body' token from the Todoist trigger
  4. 4Paste the JSON schema into the 'Schema' field (see pro tip below)
  5. 5Click 'Done'
What you should see: New dynamic content tokens appear — including 'due string', 'labels', and 'description' — that you can now use in your Slack message.
Common mistake — If you click 'Generate from sample' to auto-build the schema, paste an actual completed task's JSON body from Todoist's REST API response, not a guess. A wrong schema silently drops fields.
9

Condition > If no > Add an action > Control > Terminate

Handle the 'If no' branch to avoid errors

Click inside the 'If no' branch of your Condition. Add a 'Terminate' action and set Status to 'Succeeded'. This tells Power Automate to end the run cleanly when a task doesn't match your filter, rather than letting the run show as failed or skipped. Without this, your run history fills with red failed runs that are actually just filtered-out tasks.

  1. 1Click 'Add an action' inside the 'If no' branch
  2. 2Search 'Terminate' and select it under Control
  3. 3Set Status to 'Succeeded'
  4. 4Leave the Comment field blank or add 'Task filtered out'
What you should see: The 'If no' branch shows a Terminate card with Status set to Succeeded.
10

Flow canvas top bar > Save > Test > Manually

Test the flow with a real Todoist task

Click 'Save' in the top-right corner of the canvas. Then click 'Test' next to it and select 'Manually'. Power Automate will wait for a trigger event. Open Todoist in another browser tab and mark a task complete in your target project. Wait up to 5 minutes for the poll interval to fire. Return to Power Automate — the test panel should show the run executing. If the Condition passes, you'll see a green checkmark on the Slack action.

  1. 1Click 'Save' in the top-right corner
  2. 2Click 'Test' and select 'Manually'
  3. 3Open Todoist and mark a task complete in your target project
  4. 4Wait up to 5 minutes for the poll to fire
  5. 5Return to Power Automate and check the run result
What you should see: The run history shows a green succeeded run. The Slack channel receives a message with the task name, project, and assignee.
Common mistake — If the test run shows the Slack action was skipped, your Condition evaluated to false. Check that the 'Project Name' token from the Todoist trigger matches exactly what you typed in the condition — it's case-sensitive.
Power Automate
▶ Test flow
executed
Slack
Todoist
Todoist
🔔 notification
received
11

My flows > [Your flow name] > Run history

Turn the flow on and monitor run history

Click the back arrow to return to the flow detail page. The flow status should show 'On' by default after saving. Confirm by checking the toggle at the top of the flow detail page — it should read 'On'. For the first 48 hours, check 'Run history' on this page after a few completions to confirm the Slack messages look right and no runs are erroring. You can click any run to see each action's input and output.

  1. 1Click the back arrow from the canvas to the flow detail page
  2. 2Confirm the flow toggle reads 'On'
  3. 3Complete 2-3 tasks in Todoist over the next hour
  4. 4Return to the flow detail page and click 'Run history'
  5. 5Click each run to verify the Slack message content is correct
What you should see: Run history shows green succeeded entries for each completed Todoist task that matched your filter. Each run detail shows the exact Slack message that was sent.

Paste this expression into a 'Compose' action placed directly after the Parse JSON step. It builds the full Slack message string with priority emoji, null-safe assignee, and a formatted completion date — then you reference the Compose output in your Slack 'Message Text' field instead of building it inline.

JavaScript — Code Step// Power Automate — Compose action expression
▸ Show code
// Power Automate — Compose action expression
// Paste into the 'Inputs' field of a Compose action
// Outputs a clean Slack message string

... expand to see full code

// Power Automate — Compose action expression
// Paste into the 'Inputs' field of a Compose action
// Outputs a clean Slack message string

concat(
  if(equals(body('Parse_JSON')?['priority'], 1), '🔴 ', 
    if(equals(body('Parse_JSON')?['priority'], 2), '🟠 ', '✅ ')
  ),
  '*', body('Parse_JSON')?['content'], '*',
  ' completed in *', body('Parse_JSON')?['project_name'], '*',
  ' — by ',
  if(
    empty(body('Parse_JSON')?['assignee_name']),
    'team',
    body('Parse_JSON')?['assignee_name']
  ),
  ' on ',
  formatDateTime(body('Parse_JSON')?['completed_at'], 'MMM d, h:mm tt')
)

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 lives inside Microsoft 365 and already has Power Automate licenses — you're paying for it anyway, and adding this flow costs you nothing extra. It's also the right call if your IT department restricts third-party SaaS tools, since Power Automate is already approved in most enterprise Microsoft environments. The one scenario where you should pick something else: if your team has more than 50 task completions per day across multiple projects, the per-poll latency and duplicate risk on Power Automate's Todoist connector become real operational headaches. Use Make instead — it handles higher volume more cleanly at the same price point.

Cost

The math is straightforward. The free Power Automate plan gives you 750 flow runs per month. Each task completion uses 1 run (or 2 if you count the Terminate branch). A team completing 20 tasks per day hits 600 runs/month — under the free limit. At 30+ tasks/day you're over 900 runs/month and need the Power Automate per-user plan at $15/month. Make's free tier gives you 1,000 operations/month; a comparable flow uses 3–4 operations per task, so you'd get roughly 250 task completions free before hitting Make's paid tier at $9/month. For most teams, Make is cheaper by $6/month on paid plans.

Tradeoffs

Make handles this use case with a cleaner Todoist module that has better label and filter support at the trigger level — you can filter by label directly without a Condition step. Zapier's Todoist trigger is near-identical to Power Automate's in terms of polling, but Zapier's multi-step Zaps cost more at scale ($19.99/month for 750 tasks). n8n gives you full control with a self-hosted Todoist node and can use Todoist's real webhook API directly, eliminating polling latency entirely — but you're managing infrastructure. Pipedream offers a Todoist source with near-instant delivery via webhooks and is free up to 10,000 invocations/month, making it the best option on pure latency and cost. Power Automate still wins for teams already inside the Microsoft 365 ecosystem where IT approvals, SSO, and existing licenses remove every other platform from consideration.

Three things you'll hit after setup. First, the Todoist connector occasionally double-fires on the same task ID if you complete and then re-open and re-complete a task quickly — your Slack channel gets two identical messages. Add a SharePoint deduplication check on task ID if your team does a lot of task corrections. Second, the 'Assignee Name' field returns null for unassigned tasks — if you don't handle this with an expression, your Slack message literally posts 'completed by null'. The Compose expression in the pro tip above fixes this. Third, Todoist's completed_at timestamp comes through in UTC with no formatting — you'll need the formatDateTime() expression to make it readable; raw output like '2024-10-14T16:42:00Z' sitting in a Slack message looks broken to non-technical stakeholders.

Ideas for what to build next

  • Add a Daily Digest Instead of Per-Task PostsSwitch to a Scheduled cloud flow that runs once at 5 PM, queries Todoist's completed tasks for the day via HTTP action, and posts a single bulleted Slack summary. This cuts noise for high-output teams.
  • Route High-Priority Completions to a Separate ChannelAdd a second Condition inside the 'If yes' branch that checks if priority equals 1. Route P1 completions to #leadership-updates and everything else to #team-wins. Two Slack actions, one flow.
  • Log Completions to a SharePoint List for ReportingAdd a 'Create item' SharePoint action after the Slack post to write task name, project, assignee, and completion date to a SharePoint list. This gives you a searchable completion log and lets you build Power BI reports on team output over time.

Related guides

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