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

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

scheduled

Use case type

reporting

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

/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 Pro or Business account with API access enabled (free Todoist accounts are blocked by the Power Automate connector)
Slack workspace where you have permission to post in the target standup channel
Microsoft account with Power Automate access — Microsoft 365 Business Basic or higher, or a Power Automate Per User plan
Todoist OAuth credentials: the account used must own or be a member of the projects you want to pull tasks from
Slack OAuth credentials: the user account used to connect must have chat:write permission in the standup channel (not restricted to read-only)

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Contentcontent
Due Datedue.date
Slack Channel Name
Message Text
5 optional fields▸ show
Prioritypriority
Assignee User IDresponsible_uid
Project IDproject_id
Task URLurl
Labelslabels

Step-by-Step Setup

1

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

  1. 1Sign in at make.powerautomate.com
  2. 2Click 'My flows' in the left sidebar
  3. 3Click '+ New flow'
  4. 4Select 'Scheduled cloud flow'
  5. 5Name the flow 'Todoist Standup to Slack'
What you should see: A dialog box appears asking you to set the start time, repeat frequency, and interval before you hit Create.
Common mistake — Do NOT select 'Automated cloud flow' — that waits for an event trigger. You need the Scheduled type so the flow fires at a fixed time each morning regardless of Todoist activity.
2

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.

  1. 1Set 'Repeat every' to 1 Week
  2. 2Expand 'On these days' and check Monday, Tuesday, Wednesday, Thursday, Friday
  3. 3Set the time field to 08:45 AM
  4. 4Confirm your timezone in the timezone dropdown
  5. 5Click Create
What you should see: The flow designer opens with a single Recurrence trigger card showing your weekday schedule.
Common mistake — Power Automate's Recurrence trigger stores time in UTC internally. If your team is in EST (UTC-5), enter 13:45 UTC to fire at 8:45 AM EST. Getting this wrong means your standup post arrives at the wrong time.
3

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.

  1. 1Click '+ New step'
  2. 2Type 'Todoist' in the connector search bar
  3. 3Select the Todoist connector
  4. 4Choose the action 'Get tasks (V2)'
  5. 5Click 'Sign in' and complete Todoist OAuth authentication
What you should see: The 'Get tasks (V2)' action card appears with a green lock icon indicating an active connection, and the Project ID field is now editable.
Common mistake — The Todoist connector in Power Automate requires a Todoist Pro or Business account for API access. Personal free accounts will authenticate but the connector returns a 403 error when the flow runs.
Power Automate settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Power Automate
popup window
Connected
green checkmark
4

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.

  1. 1Click inside the 'Filter' field of the Get tasks (V2) action
  2. 2Type: today
  3. 3Optionally set 'Project ID' to a specific project ID from your Todoist sidebar URL
  4. 4Leave all other fields at their defaults
What you should see: The action card shows 'today' in the Filter field. When you test the step, the output panel shows an array of task objects with content, due date, and priority fields.
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 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.

  1. 1Click '+ New step'
  2. 2Search for 'Initialize variable' and select it
  3. 3Set Name to: StandupMessage
  4. 4Set Type to: String
  5. 5Leave Value empty
What you should see: The Initialize variable card appears with 'StandupMessage' as String and no default value.
Common mistake — Place Initialize variable BEFORE any loop. If you drag it inside an Apply to each loop, Power Automate resets the variable on every iteration, wiping the accumulated message.
6

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.

  1. 1Click '+ New step' and select 'Apply to each'
  2. 2In 'Select an output' click the dynamic content panel and choose 'value' from Get tasks (V2)
  3. 3Inside the loop, click 'Add an action'
  4. 4Search for 'Append to string variable' and select it
  5. 5Set Name to StandupMessage, then set Value to: '• ' + dynamic field 'content' + ' (Due: ' + dynamic field 'due date' + ')' + newline
What you should see: The loop card shows 'Apply to each — value' and contains one nested Append action. Running a test populates StandupMessage with bullet-pointed task lines.
Common mistake — The dynamic content panel inside a loop shows both task-level fields and the parent array. Make sure you select 'content' from the Todoist task object, not the outer 'value' array — selecting the array inserts '[object Object]' into your message.
7

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.

  1. 1Click '+ New step' after the Apply to each block (outside it)
  2. 2Search 'Compose' and select the Data Operation Compose action
  3. 3In Inputs, click 'Expression' tab and type: concat('*📋 Standup — ', formatDateTime(utcNow(), 'dddd, MMMM d'), '*', decodeUriComponent('%0A'), variables('StandupMessage'))
  4. 4Click OK to save the expression
What you should see: The Compose card shows the expression. When tested, the output preview displays a formatted string starting with '📋 Standup — Monday, June 2' followed by bullet-pointed tasks.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
8

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.

  1. 1Click '+ New step'
  2. 2Type 'Slack' in the connector search bar
  3. 3Select the Slack connector
  4. 4Choose 'Post message (V2)'
  5. 5Click 'Sign in' and complete Slack OAuth in the popup
What you should see: The Post message (V2) card shows a green connection indicator and the Channel Name field becomes editable.
Common mistake — The Power Automate Slack connector posts as the authenticated user, not as a bot. Your standup messages will appear to come from a personal account. If you want bot branding, you need to use Slack's Incoming Webhooks via an HTTP action instead — covered in the Pro Tip section.
9

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.

  1. 1Click the 'Channel Name' dropdown and type or select your channel, e.g. standup
  2. 2Click inside 'Message Text'
  3. 3Open the dynamic content panel and select 'Outputs' from the Compose action
  4. 4Leave Message Type as 'Text'
What you should see: The Post message card shows your channel name and the Compose output token in the Message Text field.
Common mistake — Channel names in this connector are case-sensitive and must not include the # symbol. Enter 'standup' not '#standup' — the connector adds the # automatically and duplicating it causes a channel-not-found error at runtime.
10

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.

  1. 1Click 'Save' in the top-right toolbar
  2. 2Click 'Test'
  3. 3Select 'Manually' and click 'Run flow'
  4. 4Watch the run detail panel for green checkmarks on each step
  5. 5Open Slack and verify the message appeared in your standup channel
What you should see: All steps show green checkmarks. The Slack channel receives a formatted message listing today's Todoist tasks with a date header.
Power Automate
▶ Test flow
executed
Slack
Todoist
Todoist
🔔 notification
received
11

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

  1. 1Navigate to My flows in the left sidebar
  2. 2Locate 'Todoist Standup to Slack' in the list
  3. 3Confirm the Status column shows 'On'
  4. 4Click the flow name to open the detail page
  5. 5Check '28 day run history' after the first scheduled run to confirm success
What you should see: The flow status shows 'On' and the next run time matches your configured schedule.

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.

1

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.

2

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.

3

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

VerdictWhy n8n for this workflow

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.

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.

Tradeoffs

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 groupingIf 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 dayAdd 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 channelsAdd 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

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