Beginner~12 min setupCommunication & Project ManagementVerified April 2026
Slack logo
Todoist logo

How to Send Todoist Deadline Alerts to Slack with Make

Runs on a schedule, checks Todoist for tasks due today or overdue, and posts a formatted Slack alert to the right channel before deadlines are missed.

Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.

Best for

Teams who manage project milestones in Todoist and need the whole team notified in Slack before deadlines slip.

Not ideal for

If you need alerts within seconds of a task being created, use Make with a Todoist webhook trigger instead of this scheduled approach.

Sync type

scheduled

Use case type

notification

Real-World Example

💡

A 12-person product agency tracks client deliverables in Todoist with due dates on every task. Before this automation, PMs checked Todoist manually each morning and still missed same-day deadlines until late afternoon. Now Make runs every morning at 8 AM, pulls every task due that day or overdue, and posts a bulleted list into the project's dedicated Slack channel — the team sees exactly what's at risk before standup 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 Make

Copy the pre-built Make blueprint and paste it straight into Make. 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 account with tasks that have due dates assigned — the 'overdue' filter only works on dated tasks
Todoist OAuth permission scopes: task:read and data:read — granted automatically during Make's OAuth flow
Slack account with permission to add apps to your workspace — you need to be a workspace admin or have the 'Manage App' permission enabled
Slack OAuth permission scopes: chat:write and channels:read — required for Make to post messages and resolve channel names
A Make account on any plan — the free tier includes 1,000 operations/month, which covers roughly 20 daily runs checking 50 tasks each

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Content (Name)content
Due Datedue.date
Task URLurl
5 optional fields▸ show
Project IDproject_id
Prioritypriority
Assignee IDassignee_id
Description / Notesdescription
Label Nameslabels

Step-by-Step Setup

1

make.com > Scenarios > Create a new scenario

Create a new Make scenario

Log into Make at make.com and click the blue 'Create a new scenario' button in the top-right corner of the Scenarios dashboard. You'll land on a blank canvas with a large '+' icon in the center. This is where you'll add your first module. Give the scenario a name immediately — click the default name at the top-left and type something like 'Todoist Deadline Alerts → Slack'. Naming it now prevents confusion when you have multiple scenarios later.

  1. 1Click 'Create a new scenario' in the top-right
  2. 2Click the scenario name at the top-left and rename it to 'Todoist Deadline Alerts → Slack'
  3. 3Click the large '+' icon in the center of the canvas to add the first module
What you should see: You should see the module search dialog open, with a search bar and a grid of app icons.
Common mistake — Make auto-saves scenario names only after you click elsewhere. If you close the tab immediately, the name reverts to 'New scenario'.
2

Canvas > + Module > Todoist > Search Tasks

Add the Todoist 'Search Tasks' module

In the module search dialog, type 'Todoist' and select the Todoist app. From the list of available actions, choose 'Search Tasks' — this is a scheduled pull, not a real-time event trigger, which is what you want here. You'll be prompted to connect your Todoist account if you haven't already. Click 'Add' next to the connection field and authorize Make via OAuth. Make will redirect you to Todoist's login page and back.

  1. 1Type 'Todoist' in the module search bar
  2. 2Click the Todoist app icon
  3. 3Select 'Search Tasks' from the action list
  4. 4Click 'Add' next to Connection and authorize via Todoist OAuth
  5. 5Click 'Save' after authorization redirects you back to Make
What you should see: The Todoist module appears on the canvas with your account email shown in the Connection field and no red error indicators.
Common mistake — If you have multiple Todoist workspaces, Make connects to whichever account you're currently logged into on Todoist's website. Log into the correct Todoist account before authorizing.
3

Canvas > Todoist Module > Edit > Filter field

Configure the task filter for due and overdue tasks

Inside the Search Tasks module configuration panel, you need to set the filter so only tasks due today or earlier are returned. In the 'Filter' field, type 'overdue' — Todoist's API accepts this as a natural-language filter that returns all tasks with a due date of today or any past date. Leave 'Project ID' blank to search across all projects, or paste a specific project ID if you want to scope alerts to one project. Set 'Limit' to 50 to avoid hitting the module's default cap of 2 records.

  1. 1Click on the Todoist Search Tasks module to open its settings
  2. 2In the 'Filter' field, type: overdue
  3. 3Leave Project ID blank (or paste your project ID for scoped alerts)
  4. 4Set the Limit field to 50
  5. 5Click OK to save the module settings
What you should see: The module shows 'Filter: overdue' and 'Limit: 50' in its summary card on the canvas.
Common mistake — Todoist's filter syntax is case-sensitive in some versions of the API. Use lowercase 'overdue' — 'Overdue' with a capital O may return zero results.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Todoist
TO
notified
4

Canvas > Todoist Module > Right-click > Add Router

Add a Router to split today vs. overdue tasks

Click the small wrench icon on the right edge of the Todoist module and select 'Add a router'. The Router module splits the flow into two paths: one for tasks due exactly today (high priority alert) and one for tasks that are past due (urgent alert). This lets you send differently-worded Slack messages depending on severity. The Router appears as a small diamond shape on the canvas with two outgoing paths.

  1. 1Right-click the Todoist Search Tasks module on the canvas
  2. 2Select 'Add a router' from the context menu
  3. 3Confirm the Router appears as a diamond connected to the Todoist module
  4. 4Note the two empty outgoing path connectors labeled '1' and '2'
What you should see: A Router module appears on the canvas connected to the Todoist module, with two empty outgoing paths ready for filter conditions.
5

Canvas > Router > Path 1 > Filter icon

Set Router path 1 filter — due today

Click the filter icon (funnel symbol) on Router path 1. In the condition editor, set the left operand to 'Due Date' from the Todoist module output, set the operator to 'Equal to', and set the right operand using the 'now' date formula: formatDate(now; 'YYYY-MM-DD'). This matches only tasks whose due date is today's date. Click OK to save. Label this path 'Due Today' by clicking the path name and typing it — this makes the canvas readable.

  1. 1Click the funnel (filter) icon on Router path 1
  2. 2Set Condition A left operand to: {{1.due.date}} (Todoist Due Date field)
  3. 3Set operator to: Equal to
  4. 4Set right operand to: {{formatDate(now; 'YYYY-MM-DD')}}
  5. 5Click OK and rename the path 'Due Today'
What you should see: Path 1 shows the filter condition summary 'Due Date Equal to [today's date formula]' beneath the router path label.
Common mistake — Todoist returns due dates in 'YYYY-MM-DD' format with no time component for all-day tasks. If your tasks have specific times, the due field includes a datetime — adjust the formatDate pattern to match your data or the filter will never match.
6

Canvas > Router > Path 2 > Filter icon

Set Router path 2 filter — overdue tasks

Click the filter icon on Router path 2. Set the left operand to the Todoist Due Date field, set the operator to 'Less than', and the right operand to {{formatDate(now; 'YYYY-MM-DD')}}. This catches everything with a due date before today — meaning already overdue. Label this path 'Overdue'. Any task not matched by path 1 but matched here flows into a separate Slack message with more urgent language.

  1. 1Click the funnel icon on Router path 2
  2. 2Set left operand to: {{1.due.date}}
  3. 3Set operator to: Less than
  4. 4Set right operand to: {{formatDate(now; 'YYYY-MM-DD')}}
  5. 5Click OK and rename the path 'Overdue'
What you should see: Path 2 shows 'Due Date Less than [today's date formula]' and is labeled 'Overdue' on the canvas.
Common mistake — If a task has no due date at all, Todoist returns null for the due field. A null date will not match either path's filter and the task will be silently skipped — this is intentional behavior, not a bug.
7

Canvas > Router Path 1 > + Module > Slack > Create a Message

Add Slack 'Create a Message' module to path 1 (due today)

Click the '+' at the end of Router path 1 and search for Slack. Select 'Create a Message'. Connect your Slack account via OAuth — Make will ask for permission to post messages. In the Channel field, type your channel name (e.g. #project-deadlines) or paste the channel ID for reliability. In the Text field, build your message using Todoist fields: start with '📅 *Due Today:* ' then map {{1.content}} for the task name, and on the next line map {{1.due.date}} and {{1.url}} for context.

  1. 1Click '+' at the end of Router path 1
  2. 2Search for 'Slack' and select 'Create a Message'
  3. 3Click 'Add' next to Connection and authorize Slack via OAuth
  4. 4In Channel, enter your channel name or ID (e.g. #project-deadlines)
  5. 5In Text, paste: 📅 *Due Today:* {{1.content}} — Due: {{1.due.date}} | {{1.url}}
What you should see: The Slack module appears on path 1 with your workspace name in the Connection field and the message preview visible in the Text field.
Common mistake — Slack channel names are case-sensitive and must include the # prefix. If your channel name has changed since you last used it, the message will fail silently — use the channel ID instead to avoid this.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
8

Canvas > Router Path 2 > + Module > Slack > Create a Message

Add Slack 'Create a Message' module to path 2 (overdue)

Repeat the same Slack module addition on Router path 2, but change the message text to reflect urgency. Start the message with '🚨 *OVERDUE:* ' so the team immediately knows this task is past due. Map the same fields: {{1.content}}, {{1.due.date}}, and {{1.url}}. You can optionally add {{1.assignee_id}} if you want to tag the responsible person — but note this outputs a numeric ID, not a username, so you'd need a lookup step to make it readable.

  1. 1Click '+' at the end of Router path 2
  2. 2Select Slack > Create a Message (reuse the existing connection)
  3. 3In Channel, use the same channel as path 1 or a different escalation channel
  4. 4In Text, paste: 🚨 *OVERDUE:* {{1.content}} — Was due: {{1.due.date}} | {{1.url}}
  5. 5Click OK to save
What you should see: A second Slack module appears on path 2 with a visually distinct message text from path 1.
Common mistake — Do not map {{1.assignee_id}} directly into the Slack message text unless you add a Todoist 'Get a User' lookup module first. The raw ID (e.g. 12345678) will appear in Slack as a number, not a name.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
9

Canvas > Todoist Module > Clock icon > Scheduling

Set the scenario schedule

Click the clock icon on the Todoist module (the first module in the scenario) to set the run schedule. Select 'At regular intervals' or 'At a specific time'. For most teams, 'At a specific time' with a daily run at 8:00 AM works best — this posts the alert before standup. If your team works across time zones, choose 8:00 AM in the timezone where most of the team starts their day, then set that timezone in the dropdown. Make runs scenarios in UTC by default unless you override it.

  1. 1Click the clock icon on the Todoist Search Tasks module
  2. 2Select 'At a specific time'
  3. 3Set time to 08:00 AM
  4. 4Set the correct timezone (e.g. America/New_York)
  5. 5Set repeat to 'Every day' and click Save
What you should see: The Todoist module shows a clock icon with '08:00 Daily' visible in its summary card on the canvas.
Common mistake — Confirm your workflow timezone matches your business timezone — n8n uses the instance timezone by default. Also verify the workflow is saved and set to Active, since Schedule Triggers won't fire on inactive workflows.
10

Canvas > Run once button (bottom toolbar)

Test the scenario with real data

Click 'Run once' at the bottom of the canvas. Make will execute one pass of the scenario immediately, regardless of the schedule. Go to your Todoist account and ensure at least one task is due today or overdue before running. Watch the canvas — each module turns green when it executes successfully, and you can click any module to inspect the exact data it received and sent. Check your Slack channel for the test message within 30 seconds.

  1. 1Confirm at least one Todoist task is due today or overdue
  2. 2Click 'Run once' in the bottom toolbar
  3. 3Watch modules turn green (or red on error)
  4. 4Click the Todoist module bubble to inspect what tasks were returned
  5. 5Check your Slack channel for the test alert message
What you should see: Each module shows a green bubble with a number indicating how many records were processed, and a Slack message appears in your target channel within 30 seconds.
Common mistake — If the Todoist module returns 0 records during the test, your filter is not matching. Create a test task in Todoist with today's date, wait 5 seconds, then run again — Todoist's API updates within a few seconds of task creation.
Make
▶ Run once
executed
Slack
Todoist
Todoist
🔔 notification
received
11

Canvas > Toggle switch (bottom-left) > ON

Activate the scenario

Once the test passes, flip the toggle in the bottom-left from 'OFF' to 'ON'. The scenario is now live and will run on the schedule you set. Make shows the next scheduled run time in the scenario list on the dashboard. You can monitor execution history under 'History' — each run logs which modules fired, how many records processed, and any errors. Check the history after the first scheduled run the next morning to confirm real tasks are being caught.

  1. 1Click the ON/OFF toggle in the bottom-left of the canvas
  2. 2Confirm it switches to 'ON' (turns blue)
  3. 3Click 'Save' to lock in all changes
  4. 4Navigate to Scenarios dashboard and confirm 'Next run' shows tomorrow at 08:00
What you should see: The scenario appears in your Scenarios list with a blue 'Active' indicator and a 'Next run' timestamp matching your configured schedule.

Paste this into a Make 'Set Variable' module placed between the Router and each Slack module. It builds a urgency label and a clean due date string, then formats the final Slack message text so you don't have to manually concatenate fields inside the Slack module's Text field.

JavaScript — Custom Function// Make Custom Function — paste into a Tools > Set Variable module
▸ Show code
// Make Custom Function — paste into a Tools > Set Variable module
// Place this between the Router path and the Slack module on each path
// Variable 1: urgencyLabel

... expand to see full code

// Make Custom Function — paste into a Tools > Set Variable module
// Place this between the Router path and the Slack module on each path

// Variable 1: urgencyLabel
// Set to one of two values depending on which Router path is executing
if(
  {{1.due.date}} = formatDate(now; 'YYYY-MM-DD');
  '📅 *Due Today*';
  '🚨 *OVERDUE*'
)

// Variable 2: formattedDueDate
// Converts raw date string to human-readable format for Slack display
formatDate(
  {{1.due.date}};
  'dddd, MMMM D YYYY'
)

// Variable 3: priorityLabel
// Maps Todoist numeric priority to a readable label
if(
  {{1.priority}} = 1; '🔴 Urgent';
  if(
    {{1.priority}} = 2; '🟠 High';
    if(
      {{1.priority}} = 3; '🟡 Medium';
      '⚪ Normal'
    )
  )
)

// Variable 4: slackMessageText
// Final assembled message — reference {{slackMessageText}} in the Slack module Text field
concatenate(
  {{urgencyLabel}}; ': '; {{1.content}};
  ' — '; {{formattedDueDate}};
  ' | Priority: '; {{priorityLabel}};
  ' | '; {{1.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

VerdictWhy Make for this workflow

Use Make for this if you want conditional logic controlling which tasks go to which Slack channels without writing a line of code. The Router module handles the 'due today vs. overdue' split visually — Zapier would require two separate Zaps to replicate this, doubling your task count and making changes harder to manage. Make is also the right call if your team is checking tasks across multiple Todoist projects and needs different Slack channels per project, since you can chain routers and set filter conditions on project ID in a single scenario. The one case where you'd skip Make: if you need alerts within seconds of a task being created or updated, Make's minimum 1-minute polling schedule (paid plan) may not be fast enough — n8n with a cron trigger and a direct Todoist API call would give you the same result with more control over timing.

Cost

The math on operations is simple. Each scenario run uses roughly 3 operations per task processed: one for the Todoist Search Tasks module, one for the Router evaluation, and one for the Slack Create a Message module. If you have an average of 8 tasks due or overdue per day and run once daily, that's 24 operations/day — about 720/month, comfortably inside Make's free tier of 1,000. If you run every 15 minutes instead, that's 96 runs/day × 24 operations = 2,304 operations/day, which blows past the free tier in less than 24 hours. The Core plan at $9/month gives you 10,000 operations and is the right fit for any team running this more than once daily.

Tradeoffs

Zapier can do this workflow in about 8 minutes of setup using its 'Schedule' trigger + Todoist 'Find Tasks' search + Slack 'Send Channel Message' action, but you'd need two separate Zaps for the due-today vs. overdue split, and Zapier's free tier caps you at 100 tasks/month — one busy week of deadline alerts will hit that ceiling. n8n handles the same conditional routing with an IF node and gives you full JavaScript access to build any message format you want, but you're self-hosting or paying $20/month on cloud and the setup takes 3x as long. Power Automate is a non-starter here unless your team is already in the Microsoft 365 ecosystem — Todoist's connector in Power Automate is community-built and has had reliability issues with the filter query parameter. Pipedream gives you the most flexibility with a Node.js step that can call the Todoist API directly with any filter Todoist supports, but the free tier limits to 100 workflow invocations/day. Make hits the best balance: visual routing, a real free tier for daily runs, and no code required.

Three things you'll run into after the scenario is live. First, Todoist returns tasks from shared projects only if the authorized account is a member — if a colleague owns a project and shares it with you, the API will return those tasks, but if they revoke access, the scenario silently returns fewer results with no error. Check membership quarterly. Second, Todoist's 'due.date' field returns a plain date string ('2024-03-15') for all-day tasks but a full ISO datetime ('2024-03-15T14:00:00Z') for time-specific tasks — if your team mixes both, your Router filter on formatDate comparison will behave inconsistently until you normalize both sides with formatDate(). Third, Slack will not deliver messages to archived channels and returns no error — the Make run logs as successful, the Slack module shows a message ID, and the channel is silent. If alerts stop appearing, the first thing to check is whether someone archived the target channel.

Ideas for what to build next

  • Add a Daily Digest Instead of Per-Task MessagesInstead of one Slack message per task, use Make's Array Aggregator module to collect all due/overdue tasks from the run and post a single bulleted Slack message. This cuts Slack noise significantly when 10+ tasks are due on the same day.
  • Escalate to a Manager Channel for High-Priority Overdue TasksAdd a third Router path that filters for Todoist priority = 1 (Urgent) and posts to a separate #escalations Slack channel. This lets leadership see critical deadline misses without having to monitor every project channel.
  • Mark Notified Tasks in Todoist with a LabelAfter the Slack module fires, add a Todoist 'Update a Task' module to apply a 'notified' label to each task. This gives you an audit trail inside Todoist and can be used in future filter logic to suppress repeat notifications.

Related guides

Was this guide helpful?
Slack + Todoist overviewMake profile →