

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
scheduledUse case type
notificationReal-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.
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 | content | |
| Project Name | project_id | |
| Completed Date | completed_at | |
5 optional fields▸ show
| Task Description | description |
| Assignee Name | responsible_uid |
| Due Date | due |
| Priority | priority |
| Labels | labels |
Step-by-Step Setup
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.
- 1Click 'My flows' in the left sidebar
- 2Click '+ New flow' in the top-left
- 3Select 'Automated cloud flow' from the dropdown
- 4Name the flow 'Todoist Completion → Slack'
- 5Click 'Skip' to dismiss the trigger picker dialog
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.
- 1Click the 'Add a trigger' placeholder block
- 2Type 'Todoist' in the search bar on the right panel
- 3Click the Todoist connector icon
- 4Select 'When a task is completed' from the trigger list
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.
- 1Click the 'Sign in' button inside the Todoist trigger card
- 2Log in to Todoist in the pop-up window
- 3Click 'Agree' on the Todoist permissions screen
- 4Wait for the pop-up to close automatically
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.
- 1Click the 'Project' dropdown inside the trigger card
- 2Select a specific project or leave as 'All projects'
- 3Click 'Save' in the top-right corner to preserve this setting
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.
- 1Click '+ New step' below the trigger card
- 2Search for 'Condition' in the action picker
- 3Select 'Condition' under the Control category
- 4Click inside the left value field and pick 'Project Name' from dynamic content
- 5Set operator to 'contains' and enter your project name in the right field
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.
- 1Click 'Add an action' inside the 'If yes' branch
- 2Search 'Slack' and click the Slack connector
- 3Select 'Post message (V2)'
- 4Click 'Sign in' in the action card
- 5Select your Slack workspace and click 'Allow'
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.
- 1Click 'Channel Name or ID' and select your Slack channel (e.g. #product-wins)
- 2Click inside the 'Message Text' field
- 3Type '✅ *' then insert 'Task Content' from dynamic content
- 4Type '* completed in *' then insert 'Project Name'
- 5Type '* — completed by ' then insert 'Assignee Name' if available
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.
- 1Click the '+' icon between the Todoist trigger and Condition cards
- 2Search 'Parse JSON' and select 'Data Operations – Parse JSON'
- 3Click the 'Content' field and insert the 'Body' token from the Todoist trigger
- 4Paste the JSON schema into the 'Schema' field (see pro tip below)
- 5Click 'Done'
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.
- 1Click 'Add an action' inside the 'If no' branch
- 2Search 'Terminate' and select it under Control
- 3Set Status to 'Succeeded'
- 4Leave the Comment field blank or add 'Task filtered out'
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.
- 1Click 'Save' in the top-right corner
- 2Click 'Test' and select 'Manually'
- 3Open Todoist and mark a task complete in your target project
- 4Wait up to 5 minutes for the poll to fire
- 5Return to Power Automate and check the run result
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.
- 1Click the back arrow from the canvas to the flow detail page
- 2Confirm the flow toggle reads 'On'
- 3Complete 2-3 tasks in Todoist over the next hour
- 4Return to the flow detail page and click 'Run history'
- 5Click each run to verify the Slack message content is correct
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
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.
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.
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 Posts — Switch 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 Channel — Add 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 Reporting — Add 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
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