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

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

scheduled

Use case type

notification

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

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

Power Automate account with a license that includes Premium connectors — the Todoist connector is Premium tier
Todoist account with at least one project containing tasks that have due dates set
Slack workspace admin or permission to add apps — required to authorize the Slack connector via OAuth
Slack channel already created where alerts will be posted — the flow cannot create channels
Todoist API access — your Todoist account must not be on a restricted plan that blocks third-party integrations

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Contentcontent
Due Datedue.date
6 optional fields▸ show
Task IDid
Prioritypriority
Project IDproject_id
Assigneeassignee_id
Task URLurl
Descriptiondescription

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

  1. 1Navigate to make.powerautomate.com
  2. 2Click 'My flows' in the left sidebar
  3. 3Click '+ New flow' near the top of the page
  4. 4Select 'Scheduled cloud flow'
  5. 5Enter a flow name and set the starting time and recurrence before clicking 'Create'
What you should see: You land in the flow designer with a 'Recurrence' trigger card already placed at the top of the canvas.
Common mistake — Do not pick 'Automated cloud flow' here. Todoist's Power Automate connector has no event-based trigger for due date changes — only an automated flow would leave you with no valid trigger option.
2

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.

  1. 1Click the 'Recurrence' card to open its configuration panel
  2. 2Set 'Interval' to 1
  3. 3Set 'Frequency' to 'Day'
  4. 4Click 'Show advanced options'
  5. 5Enter the start time in UTC format, e.g. '2024-01-01T13:00:00Z' for 8am EST
What you should see: The trigger card shows your interval, frequency, and start time. No connection is needed for this step — Recurrence is built into Power Automate.
Common mistake — Power Automate stores and evaluates the start time in UTC. If your team is in EST (UTC-5), 8am local = 13:00 UTC. Getting this wrong means alerts fire at the wrong time silently — there's no validation error.
Power Automate
+
click +
search apps
Slack
SL
Slack
Configure the Recurrence tri…
Slack
SL
module added
3

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.

  1. 1Click '+ New step'
  2. 2Type 'Todoist' in the connector search bar
  3. 3Select the Todoist connector
  4. 4Choose 'List tasks' from the action list
  5. 5Click 'Sign in' if prompted and authorize with your Todoist credentials
What you should see: A 'List tasks' action card appears with a 'Project Id' dropdown. You should see a green connection indicator at the top of the action card showing your Todoist account name.
4

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.

  1. 1Click the 'Project Id' field inside the 'List tasks' card
  2. 2Wait for the dropdown to load your Todoist projects
  3. 3Select the project you want to monitor for deadlines
  4. 4Leave all other fields as default
What you should see: The Project Id field shows the name of your selected project. No other fields need to be filled in this step.
Common mistake — The Todoist connector returns tasks from one project at a time. If your team spreads work across 5+ projects, you'll need to add a 'List tasks' action for each one, which bloats the flow. In that case, consider calling the Todoist REST API with an HTTP action instead — it supports filtering by due date natively.
5

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.

  1. 1Click '+ New step'
  2. 2Search for 'Initialize variable' and select it
  3. 3Set 'Name' to TodayDate
  4. 4Set 'Type' to String
  5. 5Click the 'fx' expression button in the 'Value' field and enter: formatDateTime(utcNow(), 'yyyy-MM-dd')
What you should see: The variable card shows Name: TodayDate, Type: String, Value: formatDateTime(utcNow(), 'yyyy-MM-dd') in the expression chip.
Common mistake — The expression formatDateTime(utcNow(), 'yyyy-MM-dd') returns UTC date — not your local date. If your team is in a timezone behind UTC, a task due 'today' locally might already appear as tomorrow in UTC after midnight UTC. Add addDays(utcNow(), 0, 'your-timezone') or use convertTimeZone() if this matters for your team.
6

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.

  1. 1Click '+ New step'
  2. 2Search 'Filter array' and select it from Data Operation
  3. 3In the 'From' field, select 'value' from List tasks dynamic content
  4. 4Click 'Edit in advanced mode' to write the condition manually
  5. 5Enter: @lessOrEquals(item()?['due']?['date'], variables('TodayDate'))
What you should see: The Filter array card shows a condition using the due date field and your TodayDate variable. Tasks without a due date will be excluded automatically because the comparison returns false for null values.
Common mistake — Todoist tasks without a due date return null for the due date field. The lessOrEquals() expression on a null value doesn't throw an error in Power Automate — it just evaluates to false and correctly excludes undated tasks. You don't need a separate null check.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Todoist
TO
notified
7

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.

  1. 1Click '+ New step'
  2. 2Select 'Control' category
  3. 3Choose 'Apply to each'
  4. 4In the output field, select 'Body' from the Filter array dynamic content
What you should see: An 'Apply to each' loop card appears with an empty action area inside it and shows 'Body' as the input source.
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.
8

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.

  1. 1Inside the Apply to each loop, click '+ Add an action'
  2. 2Search 'Condition' and select it from Control
  3. 3In the left value field, pick the task due date from dynamic content
  4. 4Set the operator dropdown to 'is less than'
  5. 5In the right value field, select the TodayDate variable
What you should see: A Condition card appears inside the loop with two branches labeled 'If yes' and 'If no'. The condition expression references the task due date and TodayDate variable.
Common mistake — Dynamic content inside an Apply to each loop sometimes shows fields from outside the loop. Make sure you're selecting the due date from the current loop item — it should be labeled under 'Apply to each' in the dynamic content panel, not from 'List tasks' directly.
9

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.

  1. 1Inside the 'If yes' branch, click '+ Add an action'
  2. 2Search 'Slack' and select the Slack connector
  3. 3Choose 'Post message' action
  4. 4Authorize Slack via OAuth if prompted — select the correct workspace
  5. 5Set Channel name to your target Slack channel (e.g. project-alerts)
  6. 6Build the message: type '🔴 OVERDUE: ' then insert Content dynamic content, then ' | Due: ' then due date dynamic content
What you should see: The Slack Post message card shows your channel and a message body mixing static text and dynamic task fields. You'll see the Slack connection name appear at the top of the card.
Common mistake — The Slack connector's 'Channel name' field expects the channel name without the # symbol in some versions of the connector. Test with and without it if your first run fails with a 'channel not found' error.
10

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.

  1. 1Inside the 'If no' branch, click '+ Add an action'
  2. 2Search 'Slack' and select Post message
  3. 3The existing Slack connection will be reused automatically
  4. 4Set Channel name to the same channel as the Yes branch
  5. 5Build the message: type '🟡 DUE TODAY: ' then insert Content and due date dynamic content
What you should see: A second Slack Post message card appears in the No branch with a distinct message prefix. Both branches of the condition now have Slack actions.
11

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.

  1. 1Click 'Save' in the top right corner
  2. 2Click 'Test' next to the Save button
  3. 3Select 'Manually' and click 'Run flow'
  4. 4Watch the step-by-step execution in the run panel
  5. 5Open your Slack channel and confirm the alert messages appeared
What you should see: The run history shows all steps with green checkmarks. Your Slack channel shows one message per matched task with the correct 🔴 or 🟡 prefix and task content.
Common mistake — If the run succeeds but Slack shows no messages, the Filter array returned zero matching tasks — not an error. Check that your test Todoist project actually contains tasks with due dates on or before today.

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']
  )
)
Power Automate
▶ Test flow
executed
Slack
Todoist
Todoist
🔔 notification
received

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

Cost

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.

Tradeoffs

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 summaryInstead 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 channelsAdd 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 buttonUpgrade 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

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