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

How to Turn Slack Messages into Todoist Tasks with n8n

When a Slack message is reacted to with a specific emoji or contains a trigger keyword, n8n creates a Todoist task with the message content, sender, and channel as structured task data.

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 surface action items in Slack discussions and need them captured in Todoist without manual copy-paste.

Not ideal for

Teams that need two-way sync — if tasks need to update back in Slack when completed, use a dedicated Slack-Todoist integration app instead.

Sync type

real-time

Use case type

routing

Real-World Example

💡

A 12-person product team uses a white checkmark emoji reaction on Slack messages to flag action items during sprint planning calls. Before this workflow, someone had to manually copy each action item into Todoist after the meeting — things were regularly missed or duplicated. Now, reacting with ✅ on any message creates a Todoist task within 10 seconds, assigned to the inbox with the original message text and a link back to the Slack thread.

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 n8n

Copy the pre-built n8n blueprint and paste it straight into n8n. 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.

Slack Workspace Admin access or permission to create and install Slack apps
A Todoist account with at least one project created, and your API token from todoist.com/prefs/integrations
An n8n instance that is publicly accessible on the internet (not localhost) so Slack can reach the webhook endpoint
Slack bot token scopes: reactions:read, channels:history, channels:read — all three must be added before installing the app

Optional

The bot user must be manually invited to any private Slack channels you want to monitor with /invite @n8n-task-bot

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Contentcontent
7 optional fields▸ show
Project IDproject_id
Due Stringdue_string
Prioritypriority
Descriptiondescription
Labelslabel_ids
Assignee IDassignee_id
Section IDsection_id

Step-by-Step Setup

1

api.slack.com/apps > Create New App > From Scratch

Create a Slack App and Enable Event Subscriptions

Go to api.slack.com/apps and click 'Create New App'. Choose 'From scratch', name it something like 'n8n Task Bot', and select your workspace. You need your own Slack app because n8n's built-in Slack OAuth credentials don't include the reaction_added event scope by default. This step gives you a bot token with the exact scopes this workflow needs.

  1. 1Go to api.slack.com/apps and click the green 'Create New App' button
  2. 2Select 'From scratch' in the modal
  3. 3Enter a name like 'n8n Task Bot' and select your Slack workspace
  4. 4Click 'Create App'
What you should see: You land on the app's Basic Information page inside the Slack API dashboard with your new app listed.
Common mistake — You must be a Slack Workspace Admin or have permission to install apps. If you see 'App installation requires admin approval', contact your workspace admin before continuing.

Paste this into the first Code node (after the Webhook trigger) in n8n. It filters by emoji, extracts the Slack permalink format, strips user mention syntax, and attempts to parse a due date from natural language keywords in the message text — all before the HTTP Request and Todoist nodes run.

JavaScript — Code Node// n8n Code Node — Filter emoji reaction and extract task data
▸ Show code
// n8n Code Node — Filter emoji reaction and extract task data
// Place this as the first Code node after the Webhook trigger
const TRIGGER_EMOJI = 'white_check_mark'; // Change to your chosen emoji name

... expand to see full code

// n8n Code Node — Filter emoji reaction and extract task data
// Place this as the first Code node after the Webhook trigger

const TRIGGER_EMOJI = 'white_check_mark'; // Change to your chosen emoji name
const SLACK_WORKSPACE = 'yourteam'; // Replace with your Slack workspace subdomain

const body = $input.first().json.body;
const event = body?.event;

// Stop processing if this isn't the right emoji
if (!event || event.type !== 'reaction_added' || event.reaction !== TRIGGER_EMOJI) {
  return []; // Return empty array — n8n stops execution silently
}

const channelId = event.item?.channel;
const messageTs = event.item?.ts;
const reactingUser = event.user;

if (!channelId || !messageTs) {
  throw new Error(`Missing channel or timestamp in Slack event: ${JSON.stringify(event)}`);
}

// Build the Slack permalink from channel ID and timestamp
// Format: archives/CHANNEL/pTIMESTAMP (remove the dot from ts)
const tsFormatted = messageTs.replace('.', '');
const slackLink = `https://${SLACK_WORKSPACE}.slack.com/archives/${channelId}/p${tsFormatted}`;

// Try to extract a due date keyword from the message (will be refined in step 7)
const dueDateKeywords = ['today', 'tomorrow', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'eod', 'next week'];

return [{
  json: {
    channel: channelId,
    ts: messageTs,
    reacting_user: reactingUser,
    slack_link: slackLink,
    emoji: event.reaction,
    due_keywords: dueDateKeywords // passed to formatting node for text matching
  }
}];
2

Slack App Dashboard > OAuth & Permissions > Bot Token Scopes

Add Required Bot Token Scopes

In your Slack app dashboard, navigate to OAuth & Permissions in the left sidebar. Scroll to the 'Scopes' section and add bot token scopes. You need reactions:read to detect emoji reactions, channels:history to read message content, and channels:read to identify channel names. Without reactions:read, the event subscription won't fire at all.

  1. 1Click 'OAuth & Permissions' in the left sidebar
  2. 2Scroll down to the 'Bot Token Scopes' section
  3. 3Click 'Add an OAuth Scope'
  4. 4Add reactions:read, channels:history, and channels:read one at a time
  5. 5Click 'Install to Workspace' at the top of the page and authorize
What you should see: You see a Bot User OAuth Token starting with 'xoxb-' appear on the OAuth & Permissions page. Copy this token — you'll need it in n8n.
Common mistake — If you reinstall the app after adding scopes, the token changes. Update it in n8n immediately or all webhook calls will return 401 errors.
3

n8n > New Workflow > + Node > Webhook

Create an n8n Webhook Node as the Trigger

Open your n8n instance and create a new workflow. Add a Webhook node as the first node — this is what Slack will POST events to. Set the HTTP Method to POST and note the webhook URL n8n generates. You'll paste this URL into Slack's Event Subscriptions page in the next step. Keep the path as the default random UUID or set a memorable path like /slack-task-trigger.

  1. 1Click the '+' button on the canvas to open the node picker
  2. 2Search for 'Webhook' and select the Webhook trigger node
  3. 3Set HTTP Method to POST
  4. 4Copy the 'Test URL' shown — you'll use this during setup, then switch to Production URL before go-live
What you should see: The Webhook node shows a URL like https://your-n8n-instance.com/webhook-test/abc123. The node is in 'Listening' state when you click 'Execute Node'.
Common mistake — Copy the webhook URL carefully — it expires if you regenerate it, and any scenarios using the old URL will silently stop working.
n8n
+
click +
search apps
Slack
SL
Slack
Create an n8n Webhook Node a…
Slack
SL
module added
4

Slack App Dashboard > Event Subscriptions > Enable Events

Register the Webhook URL in Slack Event Subscriptions

Back in the Slack API dashboard, click 'Event Subscriptions' in the left sidebar and toggle 'Enable Events' to On. Paste your n8n webhook URL into the Request URL field. Slack will immediately send a challenge request — n8n's Webhook node handles this automatically by echoing back the challenge parameter. Once verified, you'll see a green 'Verified' checkmark.

  1. 1Click 'Event Subscriptions' in the left sidebar
  2. 2Toggle 'Enable Events' to On
  3. 3Paste your n8n webhook URL into the 'Request URL' field
  4. 4Wait for Slack to show 'Verified' next to the URL
  5. 5Under 'Subscribe to bot events', click 'Add Bot User Event' and select reaction_added
  6. 6Click 'Save Changes' at the bottom of the page
What you should see: The Request URL field shows a green 'Verified' label and reaction_added appears in the subscribed bot events list.
Common mistake — Slack's URL verification times out in about 3 seconds. Your n8n webhook must be publicly accessible — it won't work on localhost. Use ngrok or deploy n8n to a server before this step.

Paste this into the first Code node (after the Webhook trigger) in n8n. It filters by emoji, extracts the Slack permalink format, strips user mention syntax, and attempts to parse a due date from natural language keywords in the message text — all before the HTTP Request and Todoist nodes run.

JavaScript — Code Node// n8n Code Node — Filter emoji reaction and extract task data
▸ Show code
// n8n Code Node — Filter emoji reaction and extract task data
// Place this as the first Code node after the Webhook trigger
const TRIGGER_EMOJI = 'white_check_mark'; // Change to your chosen emoji name

... expand to see full code

// n8n Code Node — Filter emoji reaction and extract task data
// Place this as the first Code node after the Webhook trigger

const TRIGGER_EMOJI = 'white_check_mark'; // Change to your chosen emoji name
const SLACK_WORKSPACE = 'yourteam'; // Replace with your Slack workspace subdomain

const body = $input.first().json.body;
const event = body?.event;

// Stop processing if this isn't the right emoji
if (!event || event.type !== 'reaction_added' || event.reaction !== TRIGGER_EMOJI) {
  return []; // Return empty array — n8n stops execution silently
}

const channelId = event.item?.channel;
const messageTs = event.item?.ts;
const reactingUser = event.user;

if (!channelId || !messageTs) {
  throw new Error(`Missing channel or timestamp in Slack event: ${JSON.stringify(event)}`);
}

// Build the Slack permalink from channel ID and timestamp
// Format: archives/CHANNEL/pTIMESTAMP (remove the dot from ts)
const tsFormatted = messageTs.replace('.', '');
const slackLink = `https://${SLACK_WORKSPACE}.slack.com/archives/${channelId}/p${tsFormatted}`;

// Try to extract a due date keyword from the message (will be refined in step 7)
const dueDateKeywords = ['today', 'tomorrow', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'eod', 'next week'];

return [{
  json: {
    channel: channelId,
    ts: messageTs,
    reacting_user: reactingUser,
    slack_link: slackLink,
    emoji: event.reaction,
    due_keywords: dueDateKeywords // passed to formatting node for text matching
  }
}];
5

n8n Canvas > + Node > Code

Add an n8n Code Node to Filter by Emoji and Extract Message Text

Connect a Code node after the Webhook node. This node does two things: it filters for only your chosen trigger emoji (e.g. ✅) and it extracts the message text from the Slack event payload. The reaction_added event includes the emoji name, the channel ID, the message timestamp, and the user who reacted — but not the message text itself. You'll fetch that in the next step using the timestamp.

  1. 1Click the '+' connector after the Webhook node
  2. 2Search for 'Code' and select the Code node
  3. 3Set the language to JavaScript
  4. 4Paste the filtering and extraction logic into the editor (see pro tip code below)
  5. 5Click 'Execute Node' and verify the output shows your filtered event data
What you should see: The Code node outputs an item containing the emoji name, channel ID, message timestamp (ts), and reacting user ID from the Slack payload.
Common mistake — Slack sends reaction_added events for ALL reactions in channels the bot is in — including reactions on file shares, bot messages, and app_mentions. If you skip the emoji filter here, your Todoist inbox will fill up fast.

Paste this into the first Code node (after the Webhook trigger) in n8n. It filters by emoji, extracts the Slack permalink format, strips user mention syntax, and attempts to parse a due date from natural language keywords in the message text — all before the HTTP Request and Todoist nodes run.

JavaScript — Code Node// n8n Code Node — Filter emoji reaction and extract task data
▸ Show code
// n8n Code Node — Filter emoji reaction and extract task data
// Place this as the first Code node after the Webhook trigger
const TRIGGER_EMOJI = 'white_check_mark'; // Change to your chosen emoji name

... expand to see full code

// n8n Code Node — Filter emoji reaction and extract task data
// Place this as the first Code node after the Webhook trigger

const TRIGGER_EMOJI = 'white_check_mark'; // Change to your chosen emoji name
const SLACK_WORKSPACE = 'yourteam'; // Replace with your Slack workspace subdomain

const body = $input.first().json.body;
const event = body?.event;

// Stop processing if this isn't the right emoji
if (!event || event.type !== 'reaction_added' || event.reaction !== TRIGGER_EMOJI) {
  return []; // Return empty array — n8n stops execution silently
}

const channelId = event.item?.channel;
const messageTs = event.item?.ts;
const reactingUser = event.user;

if (!channelId || !messageTs) {
  throw new Error(`Missing channel or timestamp in Slack event: ${JSON.stringify(event)}`);
}

// Build the Slack permalink from channel ID and timestamp
// Format: archives/CHANNEL/pTIMESTAMP (remove the dot from ts)
const tsFormatted = messageTs.replace('.', '');
const slackLink = `https://${SLACK_WORKSPACE}.slack.com/archives/${channelId}/p${tsFormatted}`;

// Try to extract a due date keyword from the message (will be refined in step 7)
const dueDateKeywords = ['today', 'tomorrow', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'eod', 'next week'];

return [{
  json: {
    channel: channelId,
    ts: messageTs,
    reacting_user: reactingUser,
    slack_link: slackLink,
    emoji: event.reaction,
    due_keywords: dueDateKeywords // passed to formatting node for text matching
  }
}];
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Todoist
TO
notified
6

n8n Canvas > + Node > HTTP Request

Fetch the Original Slack Message Text

Add an HTTP Request node to call Slack's conversations.history API and retrieve the actual message text using the channel ID and message timestamp from the previous step. The reaction_added event payload only gives you the timestamp — not the text. You need a GET request to https://slack.com/api/conversations.history with the channel, latest, limit, and inclusive parameters set. Pass your Bot Token as a Bearer token in the Authorization header.

  1. 1Add an HTTP Request node after the Code node
  2. 2Set Method to GET
  3. 3Set URL to https://slack.com/api/conversations.history
  4. 4Under 'Query Parameters', add: channel = {{ $json.channel }}, latest = {{ $json.ts }}, limit = 1, inclusive = true
  5. 5Under 'Authentication', select 'Header Auth' and set Authorization to Bearer xoxb-your-bot-token
What you should see: The HTTP Request node returns a JSON object with messages[0].text containing the original Slack message content.
Common mistake — If the message is in a private channel, your bot must be explicitly invited to that channel. The API returns ok: false with error: channel_not_found otherwise, even if the channel exists.
7

n8n Canvas > + Node > Code

Add a Second Code Node to Format the Task Data

Connect another Code node to clean up the message text and build the Todoist task payload. This is where you strip Slack's user mention syntax (e.g. <@U012AB3CD>) and channel mention syntax into readable text. You also construct the task content string and set a due date if the message contains a date keyword. This node outputs a clean object ready for the Todoist node.

  1. 1Add a second Code node after the HTTP Request node
  2. 2Paste the text cleaning and payload formatting logic
  3. 3Add a field for task_content combining the message text with a Slack link
  4. 4Add a field for due_string if the text contains keywords like 'tomorrow' or 'Friday'
  5. 5Click 'Execute Node' and confirm task_content looks clean and readable
What you should see: The Code node outputs an object with task_content, due_string (or null), and priority fields ready to pass to Todoist.
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.

Paste this into the first Code node (after the Webhook trigger) in n8n. It filters by emoji, extracts the Slack permalink format, strips user mention syntax, and attempts to parse a due date from natural language keywords in the message text — all before the HTTP Request and Todoist nodes run.

JavaScript — Code Node// n8n Code Node — Filter emoji reaction and extract task data
▸ Show code
// n8n Code Node — Filter emoji reaction and extract task data
// Place this as the first Code node after the Webhook trigger
const TRIGGER_EMOJI = 'white_check_mark'; // Change to your chosen emoji name

... expand to see full code

// n8n Code Node — Filter emoji reaction and extract task data
// Place this as the first Code node after the Webhook trigger

const TRIGGER_EMOJI = 'white_check_mark'; // Change to your chosen emoji name
const SLACK_WORKSPACE = 'yourteam'; // Replace with your Slack workspace subdomain

const body = $input.first().json.body;
const event = body?.event;

// Stop processing if this isn't the right emoji
if (!event || event.type !== 'reaction_added' || event.reaction !== TRIGGER_EMOJI) {
  return []; // Return empty array — n8n stops execution silently
}

const channelId = event.item?.channel;
const messageTs = event.item?.ts;
const reactingUser = event.user;

if (!channelId || !messageTs) {
  throw new Error(`Missing channel or timestamp in Slack event: ${JSON.stringify(event)}`);
}

// Build the Slack permalink from channel ID and timestamp
// Format: archives/CHANNEL/pTIMESTAMP (remove the dot from ts)
const tsFormatted = messageTs.replace('.', '');
const slackLink = `https://${SLACK_WORKSPACE}.slack.com/archives/${channelId}/p${tsFormatted}`;

// Try to extract a due date keyword from the message (will be refined in step 7)
const dueDateKeywords = ['today', 'tomorrow', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'eod', 'next week'];

return [{
  json: {
    channel: channelId,
    ts: messageTs,
    reacting_user: reactingUser,
    slack_link: slackLink,
    emoji: event.reaction,
    due_keywords: dueDateKeywords // passed to formatting node for text matching
  }
}];
8

n8n Canvas > Todoist Node > Credentials > Create New

Connect Todoist Credentials in n8n

Add a Todoist node and configure authentication. In n8n, click 'Credential' in the Todoist node and select 'Create New'. You'll need a Todoist API token — find it at todoist.com/prefs/integrations under 'API token'. Paste the token into n8n and click Save. This token gives n8n full access to create tasks in your account, so use a dedicated Todoist account or a bot user account if this is a shared team setup.

  1. 1Add a Todoist node after the second Code node
  2. 2Click the 'Credential' dropdown and select 'Create New Credential'
  3. 3Go to todoist.com/prefs/integrations and copy your API token
  4. 4Paste the token into the 'API Key' field in n8n
  5. 5Click 'Save' and confirm the credential name appears in the dropdown
What you should see: The Todoist credential shows as saved in n8n and the node no longer shows a red credential error indicator.
Common mistake — Todoist API tokens don't expire, but they're account-wide. If someone changes their Todoist password, the token is revoked and all workflows using it will fail silently until you update the credential.
9

n8n Canvas > Todoist Node > Operation: Create Task

Configure the Todoist Task Creation Node

In the Todoist node, set the Operation to 'Create Task'. Map task_content from the previous Code node to the Content field. Set the Project to your target project (use the dropdown to pick it — n8n fetches your project list automatically). Optionally map due_string to the Due String field so Todoist parses natural language dates. Set Priority to 2 (high) for emoji-triggered tasks since they're already pre-filtered as important.

  1. 1Set 'Operation' to 'Create Task'
  2. 2Map 'Content' to {{ $json.task_content }} from the Code node
  3. 3Select a Project from the dropdown or use {{ $json.project_id }} for dynamic routing
  4. 4Set 'Due String' to {{ $json.due_string }} (leave blank if null)
  5. 5Set 'Priority' to 2
What you should see: When you click 'Execute Node', a real task appears in your Todoist inbox or selected project within 2-3 seconds.
Common mistake — n8n's Todoist node uses the v2 REST API. If you have very long Slack messages (over 500 characters), Todoist truncates the task content at 500 chars without an error. Trim the text in your Code node before passing it here.
10

n8n Canvas > Todoist Node > Error Output > HTTP Request

Add an Error Handling Node for Failed Task Creation

Add a second output branch from the Todoist node to handle failures. Connect an HTTP Request node that posts a Slack message back to the original channel when task creation fails. Without this, failed creations are invisible — the emoji stays on the message but no task was made. Use Slack's chat.postMessage API to send a brief error notice to the channel where the reaction happened.

  1. 1Click the Todoist node to select it
  2. 2Drag from the red error output connector (bottom of node) to a new HTTP Request node
  3. 3Set the URL to https://slack.com/api/chat.postMessage
  4. 4Set the body to include channel: {{ $node['Webhook'].json.body.event.item.channel }} and text: '⚠️ Task creation failed for this message. Please add it to Todoist manually.'
  5. 5Set Authorization header to Bearer with your bot token
What you should see: When you intentionally break the Todoist credential and trigger the workflow, you see a Slack message appear in the source channel within 15 seconds.
11

n8n Canvas > Webhook Node > Production URL | Slack App Dashboard > Event Subscriptions

Switch from Test Webhook to Production and Activate

Open the Webhook node and copy the Production URL (not the Test URL). Go back to the Slack API dashboard, navigate to Event Subscriptions, and replace the existing URL with the Production URL. Then click 'Activate' in the top-right of your n8n workflow. Test by reacting with your trigger emoji in a real Slack channel and confirming the task appears in Todoist within 10 seconds.

  1. 1In the Webhook node, copy the Production URL
  2. 2Go to the Slack API dashboard > Event Subscriptions
  3. 3Replace the Test URL with the Production URL and save
  4. 4Click the 'Activate' toggle in the top-right of your n8n workflow
  5. 5React to a Slack message with your trigger emoji and check Todoist
What you should see: The workflow shows as Active in n8n, and within 10 seconds of reacting in Slack, a task appears in Todoist with the correct message content.
Common mistake — n8n's test webhook URL stops accepting requests once you close the execution panel. If you forgot to switch to the Production URL in Slack, reactions will silently fail — no errors, no tasks.
n8n
▶ Run once
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 n8n for this if you need full control over the message parsing logic or you're running the workflow on your own infrastructure. The emoji-to-task pattern requires stripping Slack's raw mention syntax, conditionally routing to different Todoist projects, and potentially calling three separate APIs in sequence — that's exactly the kind of multi-step logic n8n handles well with Code nodes. The one scenario where you'd skip n8n: if your team is non-technical and needs someone else to maintain this. In that case, use Zapier's Slack + Todoist integration — setup is 8 minutes, no code, and Zapier's Slack trigger includes cleaned message text out of the box.

Cost

n8n Cloud pricing starts at $20/month for 2,500 executions. This workflow uses 1 execution per reaction event — at 50 flagged messages per day across your team, that's 1,500 executions/month, well within the base plan. The HTTP Request node to fetch message text counts as part of the same execution in n8n, not a separate one. Compare that to Zapier, where the same workflow costs $49/month on the Team plan (required for multi-step Zaps), and Make, where the equivalent scenario uses roughly 3 operations per run — at 1,500 runs/month that's 4,500 operations, covered by Make's free tier (10,000 ops/month). n8n Cloud is cheaper than Zapier for this volume, and self-hosted n8n costs nothing beyond your server.

Tradeoffs

Zapier's Slack trigger labeled 'New Reaction Added' is simpler to configure — no custom app setup, no manual scope management. But it doesn't give you the raw message timestamp to fetch context, and you can't write custom parsing logic without Zapier's Code by Zapier, which requires the $49/month plan. Make has a cleaner visual flow for the three-API-call sequence and better error handling UI, but its Slack module doesn't expose reaction events cleanly — you end up needing a custom webhook anyway, which removes Make's visual advantage. Power Automate has a Slack connector but it's limited to posting messages, not reading reactions — you'd need to build the same custom webhook approach as n8n, without n8n's Code node flexibility. Pipedream's Slack source handles reaction_added natively with zero config, and the step-based editor is faster to wire up than n8n for simple cases. For this specific workflow, n8n is the right call if you're already self-hosting it — otherwise Pipedream gets you to the same result faster.

Three things you'll run into after setup. First: Slack's retry mechanism. If your n8n workflow takes more than 3 seconds to respond, Slack resends the event. Add a Respond to Webhook node at the top of your workflow that immediately returns 200 OK before doing any processing — this is non-obvious in n8n because the default Webhook node holds the response until the workflow completes. Second: the conversations.history API requires the bot to be in the channel, and it fails silently for private channels you forgot to invite the bot to — the API returns channel_not_found, not a permission error, which is confusing. Third: Todoist's natural language due date parsing (due_string) works well for English but behaves unpredictably for abbreviations like 'EOD' or 'COB' — these return no due date rather than an error. Parse those manually in your Code node and convert them to explicit dates before passing to Todoist.

Ideas for what to build next

  • Add Todoist Project Routing by ChannelUse a Switch node to map specific Slack channels to different Todoist projects — #engineering reactions go to the Engineering project, #marketing reactions go to the Marketing project. This takes about 20 minutes to configure and eliminates manual task sorting.
  • Post Confirmation Back to Slack ThreadAfter successful Todoist task creation, add an HTTP Request node that posts a threaded reply in Slack with the task link and due date. Team members get immediate confirmation without opening Todoist, and the Slack thread becomes a record of what was captured.
  • Daily Digest of Slack-Sourced TasksAdd a second workflow on a cron schedule that queries Todoist's API for tasks with your 'from-slack' label created in the last 24 hours and posts a digest to a #daily-tasks Slack channel each morning. This gives teams visibility into everything flagged without checking Todoist constantly.

Related guides

Was this guide helpful?
Slack + Todoist overviewn8n profile →