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

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

Use case type

notification

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

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

Todoist account with at least one active project containing tasks you can mark complete
Todoist API access — available on free and Pro plans; no special tier needed for webhooks via Pipedream
Slack workspace where you have permission to add apps and post to the target channel
Slack bot OAuth scopes: chat:write and channels:read — your workspace admin may need to approve the Pipedream Slack app
Pipedream account — the free tier supports up to 10,000 events/month which covers most team-sized task volumes

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Content (Name)content
Project IDproject_id
Completed Atcompleted_at
5 optional fields▸ show
Task IDid
Completer User IDuser_id
Section IDsection_id
Descriptiondescription
Labelslabels

Step-by-Step Setup

1

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.

  1. 1Log into pipedream.com
  2. 2Click 'Workflows' in the left sidebar
  3. 3Click the blue 'New Workflow' button
  4. 4Click the '+ Add Trigger' block at the top of the canvas
What you should see: You should see the trigger selection panel open on the right side of the screen with a search bar and app list.
Common mistake — Pipedream auto-saves workflow state but does NOT activate the workflow until you click 'Deploy'. Do not close the tab mid-setup assuming it will hold your trigger config.
2

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.

  1. 1Type 'Todoist' into the trigger search bar
  2. 2Click the Todoist app icon
  3. 3Select 'New Completed Task' from the trigger list
  4. 4Click 'Connect a new Todoist account' if no account is linked yet
What you should see: You should see a green 'Connected' badge next to your Todoist account name and a 'Test Trigger' button appear below the configuration panel.
Common mistake — Todoist's webhook only fires for tasks completed inside Todoist's own app or API — tasks completed via third-party integrations (like Alexa or some calendar apps) may not trigger this event.
Pipedream
+
click +
search apps
Slack
SL
Slack
Add the Todoist 'Task Comple…
Slack
SL
module added
3

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.

  1. 1Click 'Connect a new Todoist account'
  2. 2Log into Todoist in the OAuth popup
  3. 3Click 'Agree' on the permissions screen
  4. 4Wait for the popup to close and return to Pipedream
What you should see: Your Todoist email address should appear in the account dropdown, and the trigger configuration panel should show project filter options.
Common mistake — If you have a Todoist Business workspace AND a personal account, make sure you authorize the correct one. The OAuth flow defaults to whichever account is currently logged into your browser — open an incognito window if you need to switch.
4

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.

  1. 1Click the 'Project' dropdown in the trigger configuration panel
  2. 2Select your target project from the list
  3. 3Leave 'Section' and 'Label' filters blank unless you need finer control
  4. 4Click 'Save and continue'
What you should see: The selected project name appears in the Project field. When you run the test in the next step, only tasks from that project will appear.
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

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.

  1. 1Click 'Test Trigger' in Pipedream
  2. 2Switch to Todoist and mark any task complete in the filtered project
  3. 3Return to Pipedream and wait for the event to appear
  4. 4Click the event payload to expand and inspect the fields
What you should see: You should see a JSON payload with fields including 'content', 'project_id', 'completed_at', 'user_id', and 'id' populated with real values from your test task.
Common mistake — If no event appears after 60 seconds, check that the task you completed belongs to the exact project you selected in Step 4. Completing a task in a sub-project does not always roll up to the parent project filter.
Pipedream
▶ Deploy & test
executed
Slack
Todoist
Todoist
🔔 notification
received
6

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.

  1. 1Click '+ Add Step' below the trigger block
  2. 2Click 'Run Node.js code' from the step type list
  3. 3Paste your formatting code into the editor (see Pro Tip below)
  4. 4Click 'Test' to run the step against your trigger payload
What you should see: The step output should show a 'slackMessage' object with a formatted text string ready to pass to Slack.
Common mistake — The Todoist 'user_id' field in the completion event is a numeric ID, not a display name. If you want to show who completed the task, you need to call the Todoist /users endpoint in this code step — or hardcode a name map — to resolve it to a readable name.

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 };
  },
});
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
7

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.

  1. 1Click '+ Add Step' below your code step
  2. 2Search for 'Slack' and click the app
  3. 3Select 'Send Message to Channel'
  4. 4Click 'Connect a new Slack account' and authorize via OAuth
  5. 5Set the Channel field to your target channel (e.g. #product-wins)
  6. 6In the Message Text field, click the expression icon and reference steps.code.$return_value.slackMessage
What you should see: The Slack step configuration panel shows your channel name and a preview of the message text expression referencing the code step output.
Common mistake — Slack's OAuth bot token needs the 'chat:write' scope. If your Slack workspace admin has restricted app installations, the OAuth popup may fail silently. Ask your admin to pre-approve Pipedream in Slack's App Directory settings before you start.
8

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.

  1. 1Click 'Test Workflow' in the top toolbar
  2. 2Watch each step indicator — green means success, red means error
  3. 3Open your Slack channel to verify the message posted
  4. 4Inspect the step outputs panel for any field mapping issues
What you should see: A formatted message appears in your Slack channel with the completed task name, project, and completion time. All three workflow steps show green checkmarks.
9

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.

  1. 1Click the Slack 'Send Message' step block
  2. 2Click the 'Error Handling' tab in the right config panel
  3. 3Toggle 'Continue on error' to ON
  4. 4Click '+ Add Step' in the error branch
  5. 5Add another Slack 'Send Message' action pointing to a #dev-alerts channel
What you should see: The workflow canvas shows a red error branch below the Slack step with a separate notification step attached to it.
10

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.

  1. 1Click the blue 'Deploy' button in the top right
  2. 2Confirm the deployment dialog if prompted
  3. 3Wait for the status badge to change from 'Draft' to 'Active'
  4. 4Go to Todoist and complete a real task to confirm the live workflow fires
What you should see: The workflow status badge shows 'Active' in green. Within 5 seconds of completing a Todoist task, the message appears in your Slack channel.
Common mistake — Deploying a new version of an in-flight workflow replaces the previous version immediately. If you're iterating on the message format, do your testing in a private Slack channel first so you don't spam #product-wins with test messages.

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

Cost

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.

Tradeoffs

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 labelAdd 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 messagesAdd 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 postAfter 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

Was this guide helpful?
Slack + Todoist overviewPipedream profile →