

How to Broadcast Todoist Task Completions to Slack with Pipedream
When a task is marked complete in Todoist, Pipedream fires a webhook and posts a formatted message to a Slack channel within seconds.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Engineering or product teams who want real-time visibility into task progress without asking for status updates in Slack manually.
Not ideal for
Teams completing 500+ tasks per day in Todoist — at that volume, a digest summary posted once per hour is less noisy than individual announcements.
Sync type
real-timeUse case type
notificationReal-World Example
A 12-person product team at a B2B SaaS company uses this to post every completed sprint task to their #product-wins Slack channel. Before this workflow, the project manager manually updated Slack at end-of-day — by then, context was stale and engineers had already asked 'did that ship?' three times. Now the message posts within 5 seconds of the checkbox being clicked, including the task name, project, and who completed it.
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 Pipedream
Copy the pre-built Pipedream blueprint and paste it straight into Pipedream. 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 (Name) | content | |
| Project ID | project_id | |
| Completed At | completed_at | |
5 optional fields▸ show
| Task ID | id |
| Completer User ID | user_id |
| Section ID | section_id |
| Description | description |
| Labels | labels |
Step-by-Step Setup
pipedream.com > Workflows > New Workflow
Create a new Pipedream Workflow
Go to pipedream.com and sign in. Click 'Workflows' in the left sidebar, then click the blue 'New Workflow' button in the top right. You'll land on a blank canvas with a trigger slot at the top labeled 'Add a trigger'. This is where the Todoist connection starts.
- 1Log into pipedream.com
- 2Click 'Workflows' in the left sidebar
- 3Click the blue 'New Workflow' button
- 4Click the '+ Add Trigger' block at the top of the canvas
Trigger Panel > Search 'Todoist' > New Completed Task
Add the Todoist 'Task Completed' trigger
In the trigger search panel, type 'Todoist' and select it from the app list. Pipedream will show available trigger types. Select 'New Completed Task' — this fires via Todoist's webhook API every time a task is marked done. You will not need to poll on a schedule; Todoist pushes the event to Pipedream instantly.
- 1Type 'Todoist' into the trigger search bar
- 2Click the Todoist app icon
- 3Select 'New Completed Task' from the trigger list
- 4Click 'Connect a new Todoist account' if no account is linked yet
Trigger Config > Connect Account > Todoist OAuth
Authenticate your Todoist account
Click 'Connect a new Todoist account'. Pipedream opens an OAuth popup directing you to Todoist's authorization page. Log in with your Todoist credentials and click 'Agree' to grant Pipedream read access to your tasks and projects. Once authorized, the popup closes and Pipedream stores the token under Connected Accounts.
- 1Click 'Connect a new Todoist account'
- 2Log into Todoist in the OAuth popup
- 3Click 'Agree' on the permissions screen
- 4Wait for the popup to close and return to Pipedream
Trigger Config > Project dropdown
Filter to a specific Todoist project (optional but recommended)
By default the trigger fires on every completed task across all projects. In the trigger config panel, find the 'Project' dropdown and select the specific project you want to broadcast — for example, 'Q3 Sprint' or 'Product Roadmap'. If you leave it blank, every personal and shared task completion will post to Slack, which gets noisy fast.
- 1Click the 'Project' dropdown in the trigger configuration panel
- 2Select your target project from the list
- 3Leave 'Section' and 'Label' filters blank unless you need finer control
- 4Click 'Save and continue'
Trigger Config > Test Trigger button
Test the trigger to capture a real task event
Click 'Test Trigger' in Pipedream. Then go to Todoist, open the project you filtered to, and check off any task. Return to Pipedream within 30 seconds — the panel should show a live event payload including task content, project ID, completer's user ID, and completion timestamp. This payload is what all downstream steps will reference.
- 1Click 'Test Trigger' in Pipedream
- 2Switch to Todoist and mark any task complete in the filtered project
- 3Return to Pipedream and wait for the event to appear
- 4Click the event payload to expand and inspect the fields
Workflow Canvas > + Add Step > Run Node.js code
Add a Node.js code step to format the Slack message
Click the '+ Add Step' button below the trigger. Select 'Run Node.js code'. This step will take the raw Todoist payload and build a clean, readable Slack message. Using a code step here gives you full control over the message format — emojis, task name, project name, and completer's display name — rather than relying on Slack's limited block kit UI inside a pre-built action.
- 1Click '+ Add Step' below the trigger block
- 2Click 'Run Node.js code' from the step type list
- 3Paste your formatting code into the editor (see Pro Tip below)
- 4Click 'Test' to run the step against your trigger payload
Paste this into a Node.js code step placed between the Todoist trigger and the Slack action. It resolves the project name and formats a clean Slack message with an optional link back to the task. Replace the userMap object with your actual Todoist user IDs and names, which you can find in Todoist's web app under Settings > Integrations.
JavaScript — Code Stepimport axios from 'axios';▸ Show code
import axios from 'axios';
export default defineComponent({
async run({ steps, $ }) {... expand to see full code
import axios from 'axios';
export default defineComponent({
async run({ steps, $ }) {
const event = steps.trigger.event;
// Resolve project name via Todoist REST API
const projectRes = await axios.get(
`https://api.todoist.com/rest/v2/projects/${event.project_id}`,
{
headers: {
Authorization: `Bearer ${process.env.TODOIST_API_TOKEN}`,
},
}
);
const projectName = projectRes.data?.name ?? 'Unknown Project';
// Hardcoded user ID → display name map
// Get your user IDs from Todoist Settings > Integrations > API token, then GET /rest/v2/collaborators
const userMap = {
'40291847': 'Sarah Chen',
'40291901': 'Marcus Rivera',
};
const completedBy = userMap[event.user_id] ?? `User ${event.user_id}`;
// Format the completion timestamp to readable local time
const completedAt = new Date(event.completed_at).toLocaleTimeString('en-US', {
hour: 'numeric',
minute: '2-digit',
hour12: true,
timeZone: 'America/New_York', // Change to your team's timezone
});
// Build Slack message text
const taskUrl = `https://app.todoist.com/app/task/${event.id}`;
const slackMessage = [
`✅ *<${taskUrl}|${event.content}>*`,
`Completed by *${completedBy}* at ${completedAt}`,
`Project: *${projectName}*`,
].join(' · ');
return { slackMessage, projectName, completedBy };
},
});channel: {{channel}}
ts: {{ts}}
Workflow Canvas > + Add Step > Slack > Send Message to Channel
Add a Slack 'Send Message' step
Click '+ Add Step' again and search for 'Slack'. Select the Slack app, then choose the 'Send Message to Channel' action. Connect your Slack account via OAuth when prompted. In the 'Channel' field, type or select the target channel (e.g., #product-wins). In the 'Message Text' field, reference the output of your code step using the Pipedream expression syntax.
- 1Click '+ Add Step' below your code step
- 2Search for 'Slack' and click the app
- 3Select 'Send Message to Channel'
- 4Click 'Connect a new Slack account' and authorize via OAuth
- 5Set the Channel field to your target channel (e.g. #product-wins)
- 6In the Message Text field, click the expression icon and reference steps.code.$return_value.slackMessage
Workflow Canvas > Test Workflow button (top right)
Test the full workflow end-to-end
Click 'Test Workflow' at the top of the canvas. Pipedream reruns the trigger payload from Step 5 through every step. Watch each step turn green as it executes. Then open your Slack channel — the message should appear within a few seconds. Check that the task name, project, and timestamp are formatted correctly.
- 1Click 'Test Workflow' in the top toolbar
- 2Watch each step indicator — green means success, red means error
- 3Open your Slack channel to verify the message posted
- 4Inspect the step outputs panel for any field mapping issues
Slack Step > Error Handling tab
Add error handling with a fallback notification
Click the Slack step block, then click the 'Error Handling' tab in the right panel. Enable 'Continue on error' and add a second Slack step that posts to a #alerts or DM channel if the main step fails. This ensures you know immediately if the Slack API rejects the message — rather than discovering it hours later when stakeholders wonder why the channel went quiet.
- 1Click the Slack 'Send Message' step block
- 2Click the 'Error Handling' tab in the right config panel
- 3Toggle 'Continue on error' to ON
- 4Click '+ Add Step' in the error branch
- 5Add another Slack 'Send Message' action pointing to a #dev-alerts channel
Workflow Canvas > Deploy button (top right)
Deploy the workflow
Click the blue 'Deploy' button in the top right of the canvas. Pipedream activates the webhook and the workflow moves from Draft to Active status. From this point, every completed task in your filtered Todoist project will trigger a live Slack message — no manual runs required. You can monitor all executions in the 'Event History' tab.
- 1Click the blue 'Deploy' button in the top right
- 2Confirm the deployment dialog if prompted
- 3Wait for the status badge to change from 'Draft' to 'Active'
- 4Go to Todoist and complete a real task to confirm the live workflow fires
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 Pipedream for this if your team has anyone who can write 20 lines of JavaScript and wants real control over the message format. The Todoist completion webhook fires instantly, Pipedream receives it in under 2 seconds, and you can shape the Slack message exactly how you want — project name resolution, user ID lookup, label-based routing — all in a single Node.js step. The one scenario where you'd pick something else: if your whole team is non-technical and you just need a quick setup in 10 minutes with no code, use Zapier's pre-built Todoist + Slack Zap instead.
Pipedream's free tier gives you 10,000 workflow executions per month. This workflow uses 1 credit per completed task. A team closing 30 tasks per day hits 900 executions per month — well inside the free tier. At 100 tasks/day (3,000/month) you're still free. The paid tier starts at $19/month for 100,000 executions. Zapier's equivalent workflow costs $19.99/month starting from 750 tasks/month on their Starter plan. For task broadcasting specifically, Pipedream is free at almost every realistic team volume.
Zapier has a pre-built 'Task Completed in Todoist → Send Slack Message' Zap with zero code required — if you need setup in under 10 minutes and no JS, it wins on speed. Make's scenario editor lets you visually branch on labels or project names using their filter modules, which is easier to hand off to a non-developer than reading someone else's Node.js. n8n gives you a self-hosted option so your task data never touches a third-party server — relevant if your tasks contain sensitive project details. Power Automate has native Microsoft Teams support, but for Slack + Todoist it requires custom connectors and is genuinely harder to configure than Pipedream. Pipedream is still right here because the user ID → display name resolution and project name lookup both require API calls that are trivial in Node.js and painful in every no-code editor.
Three things you'll hit after setup. First: the Todoist completion webhook payload does not include the project name — only the numeric project_id. Every developer building this misses it the first time and ends up with 'Project: 2318543210' in Slack. You need a secondary REST call to /projects/{id}. Second: Slack's 'not_in_channel' error is easy to miss in Pipedream's event history because the workflow marks itself as succeeded even when the Slack API returns a non-fatal error — check your event history output carefully, not just the green checkmarks. Third: if you redeploy the workflow with a code change while the Todoist webhook is mid-flight, you may get one message sent by the old version and one by the new version for the same task completion. Pipedream deploys atomically but the window is tight — test changes in a private channel before pointing at your production Slack channel.
Ideas for what to build next
- →Route announcements by project label — Add conditional logic in your Node.js step to check the task's labels array and post to different Slack channels — 'bug' tasks go to #bugs-closed, 'feature' tasks go to #shipped. One workflow handles all routing.
- →Send a daily digest instead of per-task messages — Add a second Pipedream workflow on a daily schedule that queries the Todoist activity log API, aggregates all completions from the past 24 hours, and posts a single summary message — better for high-volume projects where per-task noise drowns out important announcements.
- →Add a Slack emoji reaction to acknowledge the post — After the message posts, use Pipedream to automatically add a 🎉 reaction to the message using Slack's reactions.add API method. It adds a small visual signal that the post is automated and celebratory, not a manual update.
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