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

How to Send Todoist Deadline Alerts to Slack with Zapier

Automatically sends a Slack channel message whenever a Todoist task is due today or overdue, keeping teams aware of approaching deadlines without manual checking.

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

Best for

Small project teams who manage deadlines in Todoist and need the whole team to see upcoming due dates in a shared Slack channel without checking Todoist manually.

Not ideal for

Teams with hundreds of tasks due daily — the noise will drown out real alerts; use a digest filter in Make instead.

Sync type

scheduled

Use case type

notification

Real-World Example

💡

A 10-person product agency uses this to post into #project-deadlines whenever a Todoist task tagged 'milestone' hits its due date. Before the automation, the project lead manually reviewed Todoist every morning and pinged teammates one by one — reminders were missed 2-3 times per sprint. Now the Slack alert fires within 15 minutes of the scheduled check and the whole team sees it without any manual work.

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

Before You Start

Make sure you have everything ready.

Todoist account with at least one project containing tasks that have due dates set
Slack workspace where you have permission to add apps and post to the target channel
Zapier account — free tier works for setup and low volume, but polling is every 2 hours; paid Starter plan ($19.99/month) polls every 15 minutes
Todoist tasks must have explicit due dates assigned — tasks without due dates will not trigger this Zap

Optional

Slack admin approval if your workspace restricts third-party app installations (needed before connecting Slack to Zapier)

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Name
Due Date
Task URL
5 optional fields▸ show
Priority
Project Name
Assignee Name
Description
Label

Step-by-Step Setup

1

zapier.com > Dashboard > Create Zap

Create a new Zap in Zapier

Log into zapier.com and click the orange 'Create Zap' button in the top-left sidebar. You'll land on the Zap editor, which shows a two-panel view: the step list on the left and the configuration panel on the right. The editor starts with a blank trigger step labeled '1. Trigger'. Every step below builds on this starting point. Name the Zap something clear like 'Todoist Deadline → Slack Alert' using the title field at the top.

  1. 1Log in at zapier.com
  2. 2Click 'Create Zap' in the left sidebar
  3. 3Click the title field at the top and type 'Todoist Deadline → Slack Alert'
  4. 4Click the '1. Trigger' step to open the trigger configuration panel
What you should see: You should see the trigger configuration panel open on the right with an 'App & Event' search box.
2

Zap Editor > Trigger > App & Event

Set Todoist as the trigger app

In the trigger panel, type 'Todoist' into the app search box and select it from the dropdown. Zapier will then ask you to pick a Trigger Event. Choose 'Task Due' from the list — this is the event that fires when a task's due date matches today's date according to Zapier's scheduled poll. Note that Zapier polls Todoist approximately every 15 minutes on paid plans and every 2 hours on the free tier, so this is not true real-time. Click 'Continue' after selecting the event.

  1. 1Type 'Todoist' in the app search field
  2. 2Select 'Todoist' from the results
  3. 3Click the 'Trigger Event' dropdown
  4. 4Select 'Task Due'
  5. 5Click 'Continue'
What you should see: You should see the 'Task Due' event confirmed and a 'Continue' button that advances to the account connection step.
Common mistake — Zapier's 'Task Due' trigger fires based on the task's due date string, not the exact due time. If your Todoist tasks have specific due times (e.g., 2:00 PM), Zapier will still trigger at its next scheduled poll after midnight on that date — not at 2 PM.
Zapier
+
click +
search apps
Slack
SL
Slack
Set Todoist as the trigger app
Slack
SL
module added
3

Zap Editor > Trigger > Account

Connect your Todoist account

Click 'Sign in to Todoist' in the account panel. A popup window will open asking you to authorize Zapier to access your Todoist account. Log in with your Todoist credentials and click 'Allow'. Once authorized, the popup closes and Zapier shows your Todoist account email in the connection dropdown. If you manage multiple Todoist accounts, verify the correct one is selected here before continuing.

  1. 1Click 'Sign in to Todoist'
  2. 2Log in with your Todoist email and password in the popup
  3. 3Click 'Allow' to grant Zapier access
  4. 4Confirm the correct account email appears in the connection dropdown
  5. 5Click 'Continue'
What you should see: You should see your Todoist email address listed under 'Account' with a green checkmark.
Common mistake — Todoist uses OAuth. If your company uses SSO or Google login for Todoist, click 'Continue with Google' inside the Zapier popup rather than entering a password directly — entering a password for an SSO account will fail silently.
Zapier settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Zapier
popup window
Connected
green checkmark
4

Zap Editor > Trigger > Configure

Configure the Todoist trigger filters

In the 'Configure' tab of the trigger step, Zapier will ask you which Todoist project to watch. Open the 'Project' dropdown and select the project containing your deadline-sensitive tasks. If you want to watch all projects, leave this set to 'All Projects', but be aware this will trigger on every task due across your entire Todoist account. You can also optionally filter by label — if you tag milestone tasks with a Todoist label like 'milestone', enter that label name in the Label field to reduce noise.

  1. 1Click the 'Project' dropdown
  2. 2Select a specific project or leave as 'All Projects'
  3. 3Optionally click the 'Label' dropdown and select a label like 'milestone'
  4. 4Click 'Continue'
What you should see: The configure tab should show your selected project (or 'All Projects') and any label filters you set, with a 'Continue' button available.
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

Zap Editor > Trigger > Test

Test the Todoist trigger

Click 'Test trigger' to pull a sample task from Todoist. Zapier fetches up to 3 recent tasks matching your configuration and displays them as sample data. Check that the sample task has a 'Due Date' field populated — if it shows as blank or null, the task you're viewing in the sample has no due date set. Pick the sample record that best represents a real milestone task (one with a due date, priority, and project name) before proceeding. You'll use this sample data to map fields in the Slack step.

  1. 1Click 'Test trigger'
  2. 2Review the sample task data that appears
  3. 3Confirm the 'Due Date' field shows a real date value
  4. 4Click 'Choose' next to the sample record you want to use for mapping
  5. 5Click 'Continue with selected record'
What you should see: You should see a sample Todoist task with fields like Task Name, Due Date, Project Name, Priority, and URL visible in the data panel.
Common mistake — If no samples appear, it means no tasks in the selected project match the trigger criteria right now. Create a test task in Todoist with today's date as the due date, wait 2 minutes, then click 'Test trigger' again.
Zapier
▶ Turn on & test
executed
Slack
Todoist
Todoist
🔔 notification
received
6

Zap Editor > + > Filter by Zapier

Add a Filter step to catch overdue tasks

Click the '+' button below the trigger step and select 'Filter' from the built-in tools. This step prevents the Zap from firing on tasks that were already handled in a previous run. Set the filter condition to: 'Due Date' — 'Exists'. This ensures only tasks with an actual due date pass through. For catching overdue tasks (past due date), you'll add a second condition using 'Only continue if' — 'Due Date' — 'Is before' — use Zapier's date formatter with today's value or today. Without this filter, tasks without due dates will occasionally slip through and post confusing blank-date alerts to Slack.

  1. 1Click the '+' icon below the Trigger step
  2. 2Select 'Filter' from the list of built-in tools
  3. 3Set condition 1: field = 'Due Date', rule = 'Exists'
  4. 4Click '+ AND' to add a second condition
  5. 5Set condition 2: field = 'Due Date', rule = 'Is before or on', value = 'Today'
  6. 6Click 'Continue'
What you should see: The filter step should show 'Your Zap would have continued' in green, confirming the sample task passes the filter.
Common mistake — Zapier's 'Is before' date comparison uses UTC. If your team is in UTC-5 or later, a task due at midnight local time may not pass the filter until 5 AM UTC the next morning. Factor this in when scheduling your Zap's notification timing.
7

Zap Editor > + > Action > App & Event

Add Slack as the action app

Click the '+' button below the Filter step and search for 'Slack' in the action app search box. Select it and choose 'Send Channel Message' as the Action Event — this posts a message to a public or private Slack channel. Click 'Continue'. This action type is the right choice here because deadline alerts should be visible to the whole team in a shared channel, not sent as a direct message to one person.

  1. 1Click the '+' icon below the Filter step
  2. 2Type 'Slack' in the app search box
  3. 3Select 'Slack' from the results
  4. 4Click the 'Action Event' dropdown and select 'Send Channel Message'
  5. 5Click 'Continue'
What you should see: You should see the Slack action panel open with 'Send Channel Message' confirmed as the event and a prompt to connect your Slack account.
8

Zap Editor > Action > Account

Connect your Slack workspace

Click 'Sign in to Slack'. A popup will ask you to select your Slack workspace from a dropdown or enter your workspace URL. Select the correct workspace and click 'Allow' to grant Zapier permission to post messages. Zapier requires the 'chat:write' and 'channels:read' OAuth scopes — if your Slack workspace has restrictions on app installations, a Slack admin must approve this before the connection will succeed. Once connected, your workspace name appears in the account dropdown.

  1. 1Click 'Sign in to Slack'
  2. 2Select your workspace in the popup
  3. 3Click 'Allow' to grant the required permissions
  4. 4Verify your workspace name appears in the account dropdown
  5. 5Click 'Continue'
What you should see: Your Slack workspace name should appear under 'Account' with a green checkmark next to it.
Common mistake — If your Slack workspace restricts app installs to admins only, the OAuth popup will show an error after you click Allow. You or your Slack admin need to pre-approve Zapier at your-workspace.slack.com/admin/apps before this step will work.
9

Zap Editor > Action > Configure

Configure the Slack message

In the 'Configure' tab, select the target Slack channel from the 'Channel' dropdown — type the channel name to search. Then build the message text using Todoist data fields from the trigger. Click inside the 'Message Text' field and use the data picker (the blue '+' icon) to insert dynamic values. A clear message format works well here: start with an emoji prefix, then the task name, due date, priority, and a link to the task. Set 'Bot Name' to something like 'Deadline Bot' and optionally upload a clock emoji as the bot icon URL.

  1. 1Click the 'Channel' dropdown and select your target channel (e.g., #project-deadlines)
  2. 2Click inside the 'Message Text' field
  3. 3Type '⏰ *Deadline Alert:* ' then click the blue '+' to insert the 'Task Name' field
  4. 4Press Enter and type '*Due:* ' then insert the 'Due Date' field
  5. 5Press Enter and type '*Priority:* ' then insert the 'Priority' field
  6. 6Press Enter and type '*Link:* ' then insert the 'URL' field
  7. 7Set 'Bot Name' to 'Deadline Bot'
  8. 8Click 'Continue'
What you should see: The message preview should show a formatted alert with the sample task name, due date, priority level, and clickable Todoist URL.
Common mistake — Todoist's Priority field returns a number (1–4) where 1 is the highest priority (P1) and 4 is no priority. Your Slack message will show '1' or '4' as raw numbers unless you use a Formatter step (added before this step) to remap them to 'P1', 'P2', 'P3', or 'None'.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
10

Zap Editor > + (between Filter and Slack) > Formatter by Zapier > Utilities > Lookup Table

Add a Formatter step to translate Priority numbers (optional but recommended)

Go back and insert a Zapier Formatter step between the Filter and the Slack action. Click the '+' between those two steps, choose 'Formatter by Zapier', then select 'Utilities' and the 'Lookup Table' transform. Map the input value to the Todoist 'Priority' field. Then enter four rows in the lookup table: input '1' → output 'P1 (Urgent)', '2' → 'P2 (High)', '3' → 'P3 (Medium)', '4' → 'No Priority'. After saving this step, go back to the Slack message and replace the raw Priority field with the Formatter output field instead.

  1. 1Click the '+' icon between the Filter step and the Slack step
  2. 2Search for 'Formatter by Zapier' and select it
  3. 3Choose 'Utilities' as the transform type
  4. 4Select 'Lookup Table' from the dropdown
  5. 5Set 'Lookup Value' to the Todoist 'Priority' field
  6. 6Add rows: 1 → P1 (Urgent), 2 → P2 (High), 3 → P3 (Medium), 4 → No Priority
  7. 7Click 'Continue', then test the step
  8. 8Return to the Slack step and swap the raw Priority field for the Formatter output
What you should see: The Formatter test result should show 'P1 (Urgent)' or similar readable text instead of the raw number '1'.
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 entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
11

Zap Editor > Action > Test > Publish

Test and activate the Zap

Click 'Test step' on the Slack action to send a real test message to the target channel. Check your Slack channel immediately — the message should appear within 30 seconds. Verify the task name, due date, priority label, and URL all appear correctly formatted. If everything looks right, click 'Publish Zap' in the top-right corner to turn the Zap on. Zapier will now poll Todoist on its scheduled interval and post to Slack automatically when tasks are due.

  1. 1Click 'Test step' on the Slack action
  2. 2Open Slack and check the target channel for the test message
  3. 3Verify all fields (task name, due date, priority, URL) look correct
  4. 4Click 'Publish Zap' in the top-right corner
  5. 5Confirm the Zap status shows 'On' in the Zapier dashboard
What you should see: A formatted Slack message from 'Deadline Bot' should appear in your chosen channel with the task details, and the Zap status should show as 'On' with a green indicator.
Common mistake — Clicking 'Test step' sends a real message to the actual Slack channel — not a sandbox. Give your team a heads-up before testing if the channel is actively used, so they don't act on a test alert.

This Code by Zapier step runs after the trigger and before the Slack action. It calculates how many days until (or past) the task due date, formats a human-readable urgency label, and builds the full message string so you don't need multiple Formatter steps. Paste this into a 'Code by Zapier' (JavaScript) action step, and set the input data fields to map 'taskName', 'dueDate', 'priority', 'assignee', and 'taskUrl' from the Todoist trigger output.

JavaScript — Code Step// Input data from Zapier: taskName, dueDate, priority, assignee, taskUrl
▸ Show code
// Input data from Zapier: taskName, dueDate, priority, assignee, taskUrl
const taskName = inputData.taskName || 'Unnamed Task';
const dueDate = inputData.dueDate || '';

... expand to see full code

// Input data from Zapier: taskName, dueDate, priority, assignee, taskUrl
const taskName = inputData.taskName || 'Unnamed Task';
const dueDate = inputData.dueDate || '';
const rawPriority = parseInt(inputData.priority, 10) || 4;
const assignee = inputData.assignee || 'Unassigned';
const taskUrl = inputData.taskUrl || '';

// Priority lookup
const priorityMap = { 1: 'P1 (Urgent)', 2: 'P2 (High)', 3: 'P3 (Medium)', 4: 'No Priority' };
const priorityLabel = priorityMap[rawPriority] || 'Unknown';

// Days until/since due
const today = new Date();
today.setHours(0, 0, 0, 0);
const due = new Date(dueDate);
due.setHours(0, 0, 0, 0);
const diffMs = due - today;
const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24));

let urgencyLabel;
if (diffDays < 0) {
  urgencyLabel = `🔴 OVERDUE by ${Math.abs(diffDays)} day(s)`;
} else if (diffDays === 0) {
  urgencyLabel = '🟠 Due TODAY';
} else if (diffDays === 1) {
  urgencyLabel = '🟡 Due TOMORROW';
} else {
  urgencyLabel = `🟢 Due in ${diffDays} days`;
}

const message = [
  `⏰ *Deadline Alert*`,
  `*Task:* ${taskName}`,
  `*Status:* ${urgencyLabel}`,
  `*Due Date:* ${dueDate}`,
  `*Priority:* ${priorityLabel}`,
  `*Assigned to:* ${assignee}`,
  `*Link:* ${taskUrl}`
].join('\n');

output = [{ message, urgencyLabel, priorityLabel, diffDays }];

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 Zapier for this workflow

Use Zapier for this if your team is non-technical, you need the workflow running within an hour, and you have fewer than 50 tasks hitting their due dates per day. The Zap editor guides you through every step with no code, the Todoist and Slack connections are pre-built and well-maintained, and the setup genuinely takes under 20 minutes. If you need alerts within 2 minutes of a task becoming due, or if you're managing hundreds of tasks across 10+ projects, switch to Make — its Todoist module supports more granular filtering and its scheduling is more configurable.

Cost

Real cost math: each Zap run here uses 3–4 tasks (trigger + filter + optional formatter + Slack action). At 20 deadline alerts per month, that's 80 tasks — well inside Zapier's free tier (100 tasks/month). At 100 alerts/month, you're at 400 tasks and need the Starter plan at $19.99/month. Make handles the same 100 alerts for free on its free tier (1,000 operations/month). If you're already paying for another Zapier workflow, this Zap fits inside your existing plan at no extra cost and the economics flip in Zapier's favor.

Tradeoffs

Make's Watch Tasks trigger is genuinely better here — it supports filtering by due date range (e.g., due within 3 days) natively, without a separate filter module, and its scheduling can be set to exact times like 8:00 AM daily. n8n's Todoist node supports the same polling approach but requires self-hosting or n8n Cloud ($20/month), which is overkill for a two-app notification. Power Automate has no native Todoist connector — you'd need a custom HTTP connector or a third-party premium connector, which adds 30+ minutes of setup time and cost. Pipedream's Todoist source is solid and fires faster than Zapier's polling, but it requires JavaScript familiarity. Zapier wins here not because it's technically superior but because it's the fastest path to a working, reliable alert for a team that doesn't want to maintain code or infrastructure.

Three things you'll discover after you go live: First, Todoist's Priority field returns integers (1 = urgent, 4 = none) — your first Slack message will say 'Priority: 1' and your team will have no idea what that means. Add the Lookup Table Formatter step before you publish. Second, if anyone on your team has Todoist tasks without due dates, those tasks will surface in the trigger's sample data during setup and cause confusing test results — always check that 'Due Date' is populated in your test sample before mapping fields. Third, on the free Zapier plan, the 2-hour polling delay means a task due at 9 AM might not alert until 11 AM. If your team expects same-morning alerts, this is a real operational gap — budget for the Starter plan or move to Make.

Ideas for what to build next

  • Add an Overdue Escalation to a Second ChannelFork the Zap using a Paths step: tasks overdue by more than 2 days post to #escalations with an @channel mention, while same-day tasks go to the normal #project-deadlines channel. This separates routine reminders from genuine blockers.
  • Send a Daily Digest Instead of Per-Task AlertsSwap the per-task Slack message for a Zapier Digest step that collects all due tasks during the day and posts one summary message to Slack each morning at 9 AM. This cuts Slack noise significantly for teams with 10+ tasks due per day.
  • Create a Todoist Task Automatically When a Slack Reminder is AcknowledgedBuild a reverse Zap triggered by a Slack emoji reaction (e.g., ✅) on the deadline alert message that marks the corresponding Todoist task as complete. This closes the loop without teammates switching apps.

Related guides

Was this guide helpful?
Slack + Todoist overviewZapier profile →