

How to Send Todoist Deadline Alerts to Slack with Power Automate
A scheduled Power Automate flow checks Todoist daily for tasks due today or overdue, then posts targeted Slack alerts to the right channel.
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 pay for Power Automate Premium and want deadline alerts without adding another tool.
Not ideal for
Teams needing sub-minute alert latency — the scheduled trigger runs at best every minute but realistically every 5-15 minutes.
Sync type
scheduledUse case type
notificationReal-World Example
A 12-person product team at a mid-market SaaS company manages sprint tasks in Todoist and communicates in Slack. Before this flow, overdue tasks sat unnoticed until standups — sometimes 18+ hours after the deadline passed. Now the flow runs every morning at 8am and posts overdue and same-day due tasks directly to #product-sprints, so the whole team sees blockers before the day starts.
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 | |
6 optional fields▸ show
| Task ID | id |
| Priority | priority |
| Project ID | project_id |
| Assignee | assignee_id |
| Task URL | url |
| Description | description |
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 with your Microsoft 365 account. Click 'My flows' in the left sidebar, then '+ New flow' at the top. Select 'Scheduled cloud flow' from the dropdown — this is the right type because Todoist doesn't push webhook events natively for deadline checks. Name the flow something like 'Todoist Deadline Alerts to Slack'.
- 1Navigate to make.powerautomate.com
- 2Click 'My flows' in the left sidebar
- 3Click '+ New flow' near the top of the page
- 4Select 'Scheduled cloud flow'
- 5Enter a flow name and set the starting time and recurrence before clicking 'Create'
Flow designer > Recurrence trigger card > Show advanced options
Configure the Recurrence trigger
Click the 'Recurrence' trigger card to expand its settings. Set the 'Interval' to 1 and 'Frequency' to 'Day' for a once-daily morning check, or set Frequency to 'Hour' with Interval 4 for more frequent checks throughout the workday. Set the 'Start time' to your team's local morning time in UTC — for a 8am EST start, enter '2024-01-01T13:00:00Z'. Leave time zone set to UTC unless you explicitly add a time zone field.
- 1Click the 'Recurrence' card to open its configuration panel
- 2Set 'Interval' to 1
- 3Set 'Frequency' to 'Day'
- 4Click 'Show advanced options'
- 5Enter the start time in UTC format, e.g. '2024-01-01T13:00:00Z' for 8am EST
Flow designer > + New step > Search 'Todoist' > List tasks
Add the Todoist 'List tasks' action
Click '+ New step' below the trigger. In the search bar, type 'Todoist' and select it from the connector list. Choose the action 'List tasks'. This action pulls all tasks from a project you specify, which you'll then filter for deadline proximity in the next step. If you haven't connected Todoist before, Power Automate will prompt you to sign in.
- 1Click '+ New step'
- 2Type 'Todoist' in the connector search bar
- 3Select the Todoist connector
- 4Choose 'List tasks' from the action list
- 5Click 'Sign in' if prompted and authorize with your Todoist credentials
Flow designer > List tasks card > Project Id dropdown
Select the target Todoist project
In the 'List tasks' action card, click the 'Project Id' dropdown. Power Automate will fetch your Todoist projects via the API and display them by name. Select the project containing the tasks you want to monitor — for example, 'Q2 Product Roadmap'. If you want to monitor all projects, you'll need separate 'List tasks' actions per project or a different approach using Todoist's REST API directly via HTTP action.
- 1Click the 'Project Id' field inside the 'List tasks' card
- 2Wait for the dropdown to load your Todoist projects
- 3Select the project you want to monitor for deadlines
- 4Leave all other fields as default
Flow designer > + New step > Variables > Initialize variable
Initialize a variable to hold today's date
Click '+ New step' and search for 'Initialize variable'. Add this action and name the variable 'TodayDate'. Set the type to 'String'. In the value field, click the expression editor (the 'fx' button) and enter the expression: formatDateTime(utcNow(), 'yyyy-MM-dd'). This gives you today's date in the same format Todoist uses for its due dates, so you can do a clean string comparison in the next step.
- 1Click '+ New step'
- 2Search for 'Initialize variable' and select it
- 3Set 'Name' to TodayDate
- 4Set 'Type' to String
- 5Click the 'fx' expression button in the 'Value' field and enter: formatDateTime(utcNow(), 'yyyy-MM-dd')
Flow designer > + New step > Data Operation > Filter array
Apply a filter to identify due and overdue tasks
Click '+ New step' and add a 'Filter array' action from the Data Operation connector. In the 'From' field, select 'value' from the 'List tasks' dynamic content — this is the array of tasks returned by Todoist. In the filter condition, set the left side to the task's due date field: select 'due date' from dynamic content inside the Filter array. Set the operator to 'is less than or equal to'. Set the right side to the TodayDate variable. This catches tasks due today and any that are already overdue.
- 1Click '+ New step'
- 2Search 'Filter array' and select it from Data Operation
- 3In the 'From' field, select 'value' from List tasks dynamic content
- 4Click 'Edit in advanced mode' to write the condition manually
- 5Enter: @lessOrEquals(item()?['due']?['date'], variables('TodayDate'))
Flow designer > + New step > Control > Apply to each
Add an Apply to each loop over filtered tasks
Click '+ New step' and add an 'Apply to each' control action. In the 'Select an output from previous steps' field, select 'Body' from the Filter array dynamic content. Every action you add inside this loop will run once per task that matched the deadline filter. This is where you'll build and send the Slack message in the next step.
- 1Click '+ New step'
- 2Select 'Control' category
- 3Choose 'Apply to each'
- 4In the output field, select 'Body' from the Filter array dynamic content
Flow designer > Apply to each > + Add an action > Control > Condition
Add a Condition to split overdue vs. due today
Inside the 'Apply to each' loop, add a 'Condition' control. Set the left value to the task's due date from dynamic content. Set the operator to 'is less than'. Set the right value to the TodayDate variable. The 'Yes' branch handles overdue tasks and the 'No' branch handles tasks due today. You'll post different Slack messages in each branch — overdue gets a red warning prefix, due today gets a yellow reminder prefix. This gives recipients immediate context without opening Todoist.
- 1Inside the Apply to each loop, click '+ Add an action'
- 2Search 'Condition' and select it from Control
- 3In the left value field, pick the task due date from dynamic content
- 4Set the operator dropdown to 'is less than'
- 5In the right value field, select the TodayDate variable
Flow designer > Apply to each > Condition > If yes > + Add an action > Slack > Post message
Post overdue task alert to Slack (Yes branch)
Inside the 'If yes' branch, add the Slack action 'Post message'. Connect your Slack workspace if prompted — Power Automate will redirect you to Slack's OAuth page. Set the 'Channel name' field to your target channel, e.g. #project-alerts. In the 'Message text' field, build a message using dynamic content: start with a literal string '🔴 OVERDUE: ', then add the task content field, then ' | Due: ', then the task due date field. This gives your team all the critical info in one line without clicking through to Todoist.
- 1Inside the 'If yes' branch, click '+ Add an action'
- 2Search 'Slack' and select the Slack connector
- 3Choose 'Post message' action
- 4Authorize Slack via OAuth if prompted — select the correct workspace
- 5Set Channel name to your target Slack channel (e.g. project-alerts)
- 6Build the message: type '🔴 OVERDUE: ' then insert Content dynamic content, then ' | Due: ' then due date dynamic content
Flow designer > Apply to each > Condition > If no > + Add an action > Slack > Post message
Post due-today task reminder to Slack (No branch)
Inside the 'If no' branch, add another Slack 'Post message' action. Use the same channel as the overdue alert. For the message text, prefix with '🟡 DUE TODAY: ' followed by the task content dynamic content and due date. Using the same channel for both overdue and due-today keeps all deadline-related noise in one place, making it easy to scan. If you want these separated, use different channels per branch.
- 1Inside the 'If no' branch, click '+ Add an action'
- 2Search 'Slack' and select Post message
- 3The existing Slack connection will be reused automatically
- 4Set Channel name to the same channel as the Yes branch
- 5Build the message: type '🟡 DUE TODAY: ' then insert Content and due date dynamic content
Flow designer > Save > Test > Manually > Run flow
Test the flow and verify Slack output
Click 'Save' in the top right of the flow designer, then click 'Test' and choose 'Manually' to trigger a test run immediately without waiting for the schedule. Watch the run history panel — each step turns green on success or red on failure. Click into the Filter array step to see how many tasks it returned. Check your Slack channel to confirm messages arrived with the correct format and emoji prefix. If zero tasks appear, temporarily modify a Todoist task to have a past due date to force a match.
- 1Click 'Save' in the top right corner
- 2Click 'Test' next to the Save button
- 3Select 'Manually' and click 'Run flow'
- 4Watch the step-by-step execution in the run panel
- 5Open your Slack channel and confirm the alert messages appeared
Paste this expression into a 'Compose' action inside the Apply to each loop, before the Slack Post message step. Reference the Compose output in the Slack message field instead of building the string manually. This keeps message formatting consistent and easier to update.
JavaScript — Code Stepif(▸ Show code
if(
less(item()?['due']?['date'], variables('TodayDate')),
concat(... expand to see full code
if(
less(item()?['due']?['date'], variables('TodayDate')),
concat(
'🔴 OVERDUE: ',
item()?['content'],
' | Due: ',
item()?['due']?['date'],
' | Priority: ',
if(equals(item()?['priority'], 4), 'Urgent',
if(equals(item()?['priority'], 3), 'High',
if(equals(item()?['priority'], 2), 'Medium', 'Normal')
)
),
' | ',
item()?['url']
),
concat(
'🟡 DUE TODAY: ',
item()?['content'],
' | Due: ',
item()?['due']?['date'],
' | ',
item()?['url']
)
)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 already lives in the Microsoft 365 ecosystem. The Slack and Todoist connectors are pre-built, OAuth auth takes under 2 minutes per connection, and the scheduled trigger is reliable within about 30 seconds of its configured time. It also makes sense if your IT org mandates staying inside Microsoft's tenant for data handling — all flow execution logs stay in your Power Automate environment. The one case where you'd pick something else: if your team doesn't have a Power Automate Premium license, the Todoist connector is gated behind it, and paying $15/user/month just to get deadline alerts is hard to justify.
On cost: the Todoist Premium connector costs $15/user/month on the Power Automate Premium plan. The flow itself runs once per day (or per your schedule) and consumes roughly 20-40 actions per run depending on how many tasks match — well within the 40,000 action/month included limit. At 30 tasks/month matching the filter, you're at roughly 600-1,200 actions/month total, which is essentially free on top of the license cost. The license is the only real cost, and if your org already pays for it, this workflow runs at zero marginal cost.
Make handles this specific workflow more elegantly than Power Automate for one reason: Make's Todoist module supports filtering by due date natively in the trigger, so you don't need to write a Filter array condition manually. Zapier's Todoist integration has a 'Task Due' trigger but it only fires when you set a due date, not when a date arrives — useless for deadline monitoring. n8n gives you the most flexibility with its Cron trigger plus a direct HTTP node hitting Todoist's REST API, and it's free to self-host. Pipedream is overkill for this use case — you'd write 30 lines of JavaScript to do what Power Automate's Filter array does with a point-and-click expression. Power Automate is still the right call if you're in a Microsoft shop, but if you're purely on free tools, n8n self-hosted beats Power Automate on cost by $15/month every month.
Three things you'll hit after setup. First, the Todoist connector's due date field returns a nested object — item()?['due']?['date'] — not a flat string. If you reference item()?['due'] in your filter, you're comparing an object to a date string and everything returns false. Second, recurring tasks in Todoist reset their due date after completion, which means a recurring task that's overdue will re-appear in every run of this flow until someone completes it — without a deduplication list, you'll spam the Slack channel. Third, if you enable Apply to each concurrency above 10, you'll start hitting Slack's rate limit of 1 message per second and get 429 errors on roughly every other message. Keep concurrency at 5-10 and you'll stay clean.
Ideas for what to build next
- →Add a daily digest summary — Instead of one Slack message per task, collect all matched tasks into an HTML table and post a single digest message. Use an 'Append to string variable' inside the loop and post once after the loop ends — this cuts channel noise significantly for teams with 10+ daily tasks.
- →Route alerts by Todoist project to separate Slack channels — Add a Switch control inside the loop that checks the project_id field and routes to different Slack channels based on the project. Engineering tasks go to #eng-standup, marketing tasks go to #marketing-sprints — same flow, less cross-team noise.
- →Mark tasks complete from Slack using a button — Upgrade the Slack message to a Block Kit interactive message with a 'Mark Complete' button. Use a separate Power Automate Instant flow triggered by an HTTP webhook to receive the button click and call the Todoist 'Complete task' action — this closes the loop without anyone opening Todoist.
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