

How to Post Todoist Standup Summaries to Slack with Power Automate
Every morning, Power Automate pulls each team member's due tasks from Todoist and posts a formatted summary to the designated Slack channel — no manual reporting needed.
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 want scheduled Todoist task digests posted to Slack without writing code.
Not ideal for
Teams that need real-time task updates pushed to Slack the moment a task changes — use Make's Todoist webhook trigger instead.
Sync type
scheduledUse case type
reportingReal-World Example
A 12-person product team uses this to post each person's due-today Todoist tasks to #standup every weekday at 9:00 AM. Before this flow, the team lead spent 10-15 minutes each morning DMing four people to collect updates. Now the channel auto-populates before anyone opens their laptop.
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 | |
| Due Date | due.date | |
| Slack Channel Name | ||
| Message Text | ||
5 optional fields▸ show
| Priority | priority |
| Assignee User ID | responsible_uid |
| Project ID | project_id |
| Task URL | url |
| Labels | labels |
Step-by-Step Setup
make.powerautomate.com > My flows > + New flow > Scheduled cloud flow
Create a new Scheduled cloud flow
Go to make.powerautomate.com and sign in. In the left sidebar click 'My flows', then click '+ New flow' and select 'Scheduled cloud flow' from the dropdown. This flow type fires on a calendar schedule — exactly what standup delivery needs. Give it a clear name like 'Todoist Standup to Slack'.
- 1Sign in at make.powerautomate.com
- 2Click 'My flows' in the left sidebar
- 3Click '+ New flow'
- 4Select 'Scheduled cloud flow'
- 5Name the flow 'Todoist Standup to Slack'
New flow dialog > Starting / Repeat every / On these days
Set the schedule to weekday mornings
In the 'Build a scheduled flow' dialog, set Starting to today's date, set Repeat every to '1 Week', then expand the advanced options and check only Monday through Friday. Set the time to 08:45 AM in your local timezone — this gives the flow time to complete before your 9:00 AM standup. Click Create.
- 1Set 'Repeat every' to 1 Week
- 2Expand 'On these days' and check Monday, Tuesday, Wednesday, Thursday, Friday
- 3Set the time field to 08:45 AM
- 4Confirm your timezone in the timezone dropdown
- 5Click Create
Flow designer > + New step > Search 'Todoist' > Get tasks (V2)
Connect your Todoist account
Click '+ New step' below the Recurrence trigger. In the action search bar, type 'Todoist' and select the Todoist connector. Choose the action 'Get tasks (V2)'. Power Automate will prompt you to create a new Connection — click 'Sign in' and authenticate with the Todoist account that has access to the relevant projects. The connection is saved for reuse.
- 1Click '+ New step'
- 2Type 'Todoist' in the connector search bar
- 3Select the Todoist connector
- 4Choose the action 'Get tasks (V2)'
- 5Click 'Sign in' and complete Todoist OAuth authentication
Flow designer > Get tasks (V2) > Filter field
Filter tasks due today
Inside the 'Get tasks (V2)' action, you need to pull only tasks due on the day the flow runs. Set the 'Filter' field to the Todoist filter string: 'today'. This uses Todoist's native filter syntax and returns all tasks due today across the selected project. Leave 'Project ID' blank to pull across all projects, or enter a specific project ID to scope it.
- 1Click inside the 'Filter' field of the Get tasks (V2) action
- 2Type: today
- 3Optionally set 'Project ID' to a specific project ID from your Todoist sidebar URL
- 4Leave all other fields at their defaults
Flow designer > + New step > Search 'Initialize variable'
Initialize a variable to build the message
Click '+ New step' and search for 'Initialize variable'. Add this action and name the variable 'StandupMessage' with type String. Leave the Value field empty — you'll append task lines to it in the next step. This variable accumulates all task rows into a single formatted block before posting to Slack.
- 1Click '+ New step'
- 2Search for 'Initialize variable' and select it
- 3Set Name to: StandupMessage
- 4Set Type to: String
- 5Leave Value empty
Flow designer > + New step > Apply to each > Append to string variable
Loop through tasks and build the message
Click '+ New step', search for 'Apply to each', and select it. In the 'Select an output from previous steps' field, click the dynamic content picker and select 'value' from the Get tasks (V2) output — this is the array of task objects. Inside the loop, add an 'Append to string variable' action. Set Name to 'StandupMessage' and set Value to a formatted line using dynamic content from each task.
- 1Click '+ New step' and select 'Apply to each'
- 2In 'Select an output' click the dynamic content panel and choose 'value' from Get tasks (V2)
- 3Inside the loop, click 'Add an action'
- 4Search for 'Append to string variable' and select it
- 5Set Name to StandupMessage, then set Value to: '• ' + dynamic field 'content' + ' (Due: ' + dynamic field 'due date' + ')' + newline
Flow designer > + New step (after loop) > Data Operation > Compose
Add a header line to the message
After the Apply to each loop (not inside it), add another 'Compose' action. This builds the final message by prepending a header to the accumulated task list. In the Inputs field, construct the full message: a date header using the formatDateTime expression, your team's standup prompt text, then the StandupMessage variable. This keeps the Slack post readable.
- 1Click '+ New step' after the Apply to each block (outside it)
- 2Search 'Compose' and select the Data Operation Compose action
- 3In Inputs, click 'Expression' tab and type: concat('*📋 Standup — ', formatDateTime(utcNow(), 'dddd, MMMM d'), '*', decodeUriComponent('%0A'), variables('StandupMessage'))
- 4Click OK to save the expression
channel: {{channel}}
ts: {{ts}}
Flow designer > + New step > Search 'Slack' > Post message (V2)
Connect your Slack account
Click '+ New step', search for 'Slack', and select the Slack connector. Choose the action 'Post message (V2)'. Click 'Sign in' to create a new Slack connection. You'll be redirected to Slack's OAuth screen — sign in with the workspace account that has permission to post in your standup channel. Slack requires the 'chat:write' scope, which the connector requests automatically.
- 1Click '+ New step'
- 2Type 'Slack' in the connector search bar
- 3Select the Slack connector
- 4Choose 'Post message (V2)'
- 5Click 'Sign in' and complete Slack OAuth in the popup
Flow designer > Post message (V2) > Channel Name / Message Text
Configure the Slack message destination
In the 'Post message (V2)' action, set Channel Name to your standup channel (e.g., #standup or #team-daily). In the Message Text field, select the dynamic content output from the Compose action in Step 7 — this inserts the fully formatted task summary. Set Message Type to 'Text' unless you want to use Block Kit JSON.
- 1Click the 'Channel Name' dropdown and type or select your channel, e.g. standup
- 2Click inside 'Message Text'
- 3Open the dynamic content panel and select 'Outputs' from the Compose action
- 4Leave Message Type as 'Text'
Flow designer > Save > Test > Manually > Run flow
Test the flow end-to-end
Click 'Save' in the top right of the flow designer, then click 'Test' and select 'Manually'. Power Automate runs the flow immediately using today's date. Watch the run detail view — each step turns green on success or red on failure with an error message. Check your Slack channel for the posted message within 30-60 seconds of the test completing.
- 1Click 'Save' in the top-right toolbar
- 2Click 'Test'
- 3Select 'Manually' and click 'Run flow'
- 4Watch the run detail panel for green checkmarks on each step
- 5Open Slack and verify the message appeared in your standup channel
make.powerautomate.com > My flows > [Flow name] > Status
Enable the flow for production
After a successful test, the flow is already active if you clicked Save. Confirm it's turned on by going to 'My flows', finding 'Todoist Standup to Slack', and checking the status column shows 'On'. The next scheduled run fires at your configured weekday time. You can monitor run history from the flow detail page under '28 day run history'.
- 1Navigate to My flows in the left sidebar
- 2Locate 'Todoist Standup to Slack' in the list
- 3Confirm the Status column shows 'On'
- 4Click the flow name to open the detail page
- 5Check '28 day run history' after the first scheduled run to confirm success
Paste this expression into the Inputs field of the Compose action (Step 7) using the Expression editor tab. It builds a fully formatted Slack message with priority emoji indicators, bold task names, and clickable URLs — without needing any additional actions in the flow.
JavaScript — Code Stepconcat(▸ Show code
concat(
'*📋 Daily Standup — ', formatDateTime(utcNow(), 'dddd, MMMM d, yyyy'), '*',
decodeUriComponent('%0A'),... expand to see full code
concat(
'*📋 Daily Standup — ', formatDateTime(utcNow(), 'dddd, MMMM d, yyyy'), '*',
decodeUriComponent('%0A'),
decodeUriComponent('%0A'),
variables('StandupMessage')
)
// Inside the Append to string variable (Step 6), use this as the Value expression:
concat(
if(equals(items('Apply_to_each')?['priority'], 4), '🔴 ',
if(equals(items('Apply_to_each')?['priority'], 3), '🟠 ',
if(equals(items('Apply_to_each')?['priority'], 2), '🟡 ', '⚪ ')
)
),
'*', items('Apply_to_each')?['content'], '*',
' — <', items('Apply_to_each')?['url'], '|view task>',
decodeUriComponent('%0A')
)Scaling Beyond 50+ tasks returned per daily run+ Records
If your volume exceeds 50+ tasks returned per daily run records, apply these adjustments.
Scope by project to reduce payload
If your team has 50+ tasks due on any given day, pulling all projects creates a Slack message that exceeds readable length. Set Project ID on each Get tasks action to pull only from active sprint projects. Aim for 5-15 tasks per standup post.
Avoid Apply to each loops on large arrays
Power Automate's Apply to each loop makes one internal iteration per task. At 50+ tasks, run time climbs above 60 seconds and can hit the flow step limit (600 actions per run on standard plans). Use a Select action to transform the array in one step instead of looping — Select maps 'content' and 'due.date' fields across the whole array at once.
Split large teams into multiple flows
If you're running standups for 10+ team members each with their own project scope, one flow trying to handle all of them will time out. Create one Scheduled flow per team or department, each scoped to its own project IDs and posting to its own Slack channel.
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 is already on Microsoft 365 and you want the flow to live inside your existing tenant without adding another paid SaaS tool. The Todoist and Slack connectors are both pre-built — no custom HTTP calls required. Power Automate also handles the schedule natively with the Recurrence trigger, which is more reliable than cron-based setups in self-hosted tools. The one scenario where you'd skip Power Automate: if your team uses Google Workspace instead of Microsoft 365, the licensing math stops working and Make gives you the same result for $9/month with no per-user seat cost.
On pricing: Power Automate counts this workflow as roughly 8 actions per run (Recurrence + Get tasks + Initialize variable + Apply to each iterations + Compose + Post message). At 5 runs per week, that's ~20 runs per month. On the Microsoft 365 Business Basic plan you get 6,000 flow runs per month included — this workflow costs you nothing extra. On a standalone Power Automate Per User plan ($15/user/month), you still pay nothing additional since the runs are included. Make would cost $9/month for the same workflow. Zapier would cost $19.99/month at the Starter tier. Power Automate wins on cost if you already have a Microsoft 365 seat.
Make handles this use case with a cleaner iterator module and lets you use Todoist's webhook trigger for real-time task updates — Power Automate's Todoist connector is scheduled-only, no webhooks. Zapier's Todoist integration includes a 'New Due Task Today' trigger that fires in near-real-time without needing to build a schedule — simpler setup, 10 minutes vs. 30 minutes here. n8n gives you full JavaScript in the Code node to format the Slack message any way you want, including Block Kit JSON for interactive buttons — Power Automate's Slack connector only sends plain text or basic markdown. Pipedream lets you call the Todoist REST API directly with full pagination control, which matters if you have edge cases around recurring tasks. Power Automate is still the right call if you need this workflow inside a Microsoft-controlled environment — IT governance, data residency, and Azure AD authentication all point here.
Three things you'll hit after setup. First: the Todoist connector silently returns zero tasks when the 'today' filter matches nothing — your flow shows green but Slack gets a blank or header-only message. Add a length check before the Slack action. Second: Todoist recurring tasks sometimes show a 'due.datetime' field (with time) instead of 'due.date' (date only) depending on how the task was created — expressions referencing 'due.date' return null for those tasks and your message shows 'Due: ' with nothing after it. Use the coalesce() expression to fall back gracefully: coalesce(items('Apply_to_each')?['due']?['date'], 'No date set'). Third: Power Automate throttles the Slack connector at 100 requests per connection per 60 seconds — irrelevant for standup use, but if you ever expand this flow to post individual DMs to 20+ people in one run, you'll start seeing 429 errors mid-flow with no automatic retry.
Ideas for what to build next
- →Add per-person task grouping — If your Todoist projects have tasks assigned to multiple team members, add a Select action to group tasks by responsible_uid before building the message — each person's section gets its own header in the Slack post.
- →Post a completion summary at end of day — Add a second Scheduled flow that runs at 5:00 PM using Todoist's 'completed today' filter and posts a done-items digest to the same Slack channel — closes the loop on what actually shipped.
- →Route summaries to per-project Slack channels — Add a Condition action after the loop to check each task's project_id and route the summary to different channels — engineering tasks go to #eng-standup, sales tasks go to #sales-standup.
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