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

How to Create Wrike Tasks from Slack Messages with n8n

When a team member reacts to a Slack message with a specific emoji or uses a slash command, n8n instantly creates a Wrike task with the message text, assignee, and due date.

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

Best for

Engineering or ops teams who already live in Slack and need action items captured in Wrike without switching tabs

Not ideal for

Teams that want two-way sync — if Wrike task updates need to post back to Slack, this workflow alone won't cover it

Sync type

real-time

Use case type

routing

Real-World Example

💡

A 22-person product team at a SaaS company gets flooded with action items during their async Slack stand-ups. Before this workflow, someone had to manually read the channel and create Wrike tasks — which meant 30–40% of action items never got logged. Now, anyone reacting with a 📋 emoji on a Slack message fires n8n, which creates a Wrike task in under 10 seconds with the message text as the title, the message author as assignee, and a due date parsed from the message body.

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.

n8n instance running (self-hosted or n8n Cloud) with a publicly accessible URL so Slack can reach your webhook
Slack workspace admin access to create and install a custom Slack app with bot scopes: channels:history, reactions:read, users:read, chat:write
Wrike account with API access — generate a permanent token at wrike.com/frontend/apps/index.html under API > Create New App
Wrike folder/project ID for the destination project where tasks will be created (find it in the Wrike URL when the project is open)
The Slack bot must be invited to every channel you want to monitor using /invite @YourBotName

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Titletitle
Slack Channel ID
Slack Message Timestamp (ts)
Wrike Folder IDfolderId
5 optional fields▸ show
Assignee (Wrike User ID)responsibles
Due Datedates.due
Task Descriptiondescription
Priorityimportance
Statusstatus

Step-by-Step Setup

1

api.slack.com/apps > Your App > Event Subscriptions

Create a Slack App and Enable Event Subscriptions

Go to api.slack.com/apps and click 'Create New App', then choose 'From Scratch'. Name it something your team will recognize, like 'Wrike Task Bot', and select your workspace. You need this app to receive webhook events from Slack — n8n will not receive anything without it. Once created, go to 'Event Subscriptions' in the left sidebar and toggle it on.

  1. 1Go to api.slack.com/apps and click 'Create New App'
  2. 2Select 'From Scratch', enter app name 'Wrike Task Bot', choose your workspace
  3. 3In the left sidebar, click 'Event Subscriptions'
  4. 4Toggle 'Enable Events' to On — leave the Request URL blank for now
What you should see: You should see the Event Subscriptions page with the toggle showing green (enabled) and a Request URL field waiting for input.
Common mistake — Do not add the Request URL yet — you need the n8n webhook URL from Step 2 first. Adding a broken URL here will put the app in an error state.

Paste this into the Code node (Step 6) in n8n. It parses the raw Slack message text to extract a clean task title, detect an @mention for assignee, find a due date in multiple formats, and flag urgency — all in one pass. The output feeds directly into your field mapping for the Wrike API call.

JavaScript — Code Node// n8n Code Node — Slack message parser for Wrike task creation
▸ Show code
// n8n Code Node — Slack message parser for Wrike task creation
// Input: Slack message text from previous node
// Output: Structured task fields

... expand to see full code

// n8n Code Node — Slack message parser for Wrike task creation
// Input: Slack message text from previous node
// Output: Structured task fields

const items = $input.all();

return items.map(item => {
  const messageText = item.json.messages?.[0]?.text || '';
  const reactingUserId = item.json.body?.event?.user || '';
  const messageAuthorId = item.json.body?.event?.item_user || reactingUserId;

  // Strip Slack user mention tags like <@U04MXYZABC> for display
  const cleanText = messageText
    .replace(/<@[A-Z0-9]+>/g, '')
    .replace(/\s+/g, ' ')
    .trim();

  // Extract @mention for assignee — Slack encodes as <@USERID>
  const mentionMatch = messageText.match(/<@([A-Z0-9]+)>/);
  const assigneeSlackId = mentionMatch ? mentionMatch[1] : messageAuthorId;

  // Parse due date — supports ISO (2024-03-20), 'by Month Day', 'due Month Day'
  let dueDate = null;
  const isoMatch = cleanText.match(/\b(\d{4}-\d{2}-\d{2})\b/);
  const naturalMatch = cleanText.match(/(?:by|due)\s+([A-Z][a-z]+\s+\d{1,2})/i);

  if (isoMatch) {
    dueDate = isoMatch[1];
  } else if (naturalMatch) {
    const parsed = new Date(`${naturalMatch[1]} ${new Date().getFullYear()}`);
    if (!isNaN(parsed)) {
      dueDate = parsed.toISOString().split('T')[0];
    }
  }

  // Strip date phrases from the title
  const titleText = cleanText
    .replace(/(?:by|due)\s+[A-Z][a-z]+\s+\d{1,2}/gi, '')
    .replace(/\d{4}-\d{2}-\d{2}/, '')
    .replace(/\s+/g, ' ')
    .trim();

  // Detect urgency keywords
  const urgencyKeywords = ['urgent', 'asap', 'critical', '!!', 'blocker'];
  const isUrgent = urgencyKeywords.some(kw => cleanText.toLowerCase().includes(kw));

  // Build task description with Slack context
  const channelId = item.json.body?.event?.item?.channel || '';
  const ts = item.json.body?.event?.item?.ts || '';
  const slackPermalink = `https://slack.com/archives/${channelId}/p${ts.replace('.', '')}`;

  return {
    json: {
      taskTitle: titleText || 'Untitled task from Slack',
      assigneeSlackId,
      dueDate,
      importance: isUrgent ? 'High' : 'Normal',
      description: `Created from Slack message\nOriginal: ${slackPermalink}`,
      rawMessageText: messageText
    }
  };
});
2

n8n > Workflows > New Workflow > + > Webhook

Add a Webhook Trigger Node in n8n

Open your n8n instance and create a new workflow. Click the '+' button to add your first node and search for 'Webhook'. Select the Webhook node and set the HTTP method to POST. Copy the generated webhook URL — this is the URL Slack will send events to. Keep this tab open; you will paste this URL back into your Slack app settings.

  1. 1Open n8n and click 'New Workflow' in the top right
  2. 2Click the '+' node button and search for 'Webhook'
  3. 3Set HTTP Method to 'POST'
  4. 4Set Path to 'slack-wrike-task' (or any unique slug)
  5. 5Copy the full Webhook URL shown at the bottom of the node config panel
What you should see: You should see a full webhook URL ending in '/slack-wrike-task'. The node will show 'Waiting for first event' status when you activate the workflow.
Common mistake — n8n has two webhook URLs: a test URL (only active when you click 'Listen for Test Event') and a production URL (active when the workflow is saved and activated). Paste the production URL into Slack — the test URL stops working after you close the node.
n8n
+
click +
search apps
Slack
SL
Slack
Add a Webhook Trigger Node i…
Slack
SL
module added
3

api.slack.com/apps > Your App > Event Subscriptions > Subscribe to Bot Events

Paste the Webhook URL into Slack and Subscribe to Events

Go back to your Slack app's Event Subscriptions page and paste the n8n production webhook URL into the Request URL field. Slack will immediately send a challenge request to verify the endpoint — n8n handles this automatically. Once the URL shows a green 'Verified' checkmark, scroll down to 'Subscribe to Bot Events' and add the events you want to capture.

  1. 1Paste the n8n production webhook URL into the 'Request URL' field
  2. 2Wait for the green 'Verified' checkmark to appear
  3. 3Scroll down to 'Subscribe to Bot Events'
  4. 4Click 'Add Bot User Event' and add 'reaction_added' (for emoji-based triggering)
  5. 5Click 'Save Changes' at the bottom of the page
What you should see: The Request URL field should show a green 'Verified' badge. The bot events list should show 'reaction_added' in the table.
Common mistake — If you want slash commands instead of emoji reactions as the trigger, skip 'reaction_added' and set up a Slash Command endpoint in your Slack app instead — the event payload shape is different and will require different field mappings in later steps.
4

api.slack.com/apps > Your App > OAuth & Permissions > Bot Token Scopes

Add Bot to Your Channel and Configure OAuth Scopes

In your Slack app settings, go to 'OAuth & Permissions' in the left sidebar. Under 'Bot Token Scopes', add the scopes your bot needs: channels:history (to read message text), reactions:read (to detect emoji triggers), and users:read (to resolve user IDs to names). Then click 'Install to Workspace' and authorize the app. After install, copy the Bot User OAuth Token — it starts with xoxb-.

  1. 1Click 'OAuth & Permissions' in the left sidebar
  2. 2Under 'Bot Token Scopes', click 'Add an OAuth Scope'
  3. 3Add: channels:history, reactions:read, users:read
  4. 4Click 'Install to Workspace' at the top and authorize
  5. 5Copy the 'Bot User OAuth Token' (starts with xoxb-)
  6. 6In your Slack channel, type /invite @WrikeTaskBot to add the bot
What you should see: After install, you should see a Bot User OAuth Token on the OAuth & Permissions page. The bot should appear as a member in your Slack channel.
Common mistake — The bot must be explicitly invited to every channel it monitors. If you forget /invite, reaction events from that channel will fire but the bot won't have permission to fetch the original message text — your tasks will be created with empty titles.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
5

n8n > Workflow Canvas > + > Slack > Get Message

Add a Slack Node to Fetch the Original Message

The reaction_added event only tells you which message was reacted to — it does not include the message text itself. You need a second node to fetch that text. Add a Slack node after the Webhook node, set the Operation to 'Get Message', and use the channel and timestamp values from the webhook payload to look up the original message. Connect your Bot Token credential here.

  1. 1Click '+' after the Webhook node to add a new node
  2. 2Search for 'Slack' and select it
  3. 3Set Resource to 'Message' and Operation to 'Get Permalink' or use the conversations.history API call
  4. 4Set Channel ID to: {{ $json.body.event.item.channel }}
  5. 5Set Timestamp to: {{ $json.body.event.item.ts }}
  6. 6Select or create your Slack credential using the xoxb- token
What you should see: After running a test, you should see the full Slack message object in the output panel, including the 'text' field containing the original message content.
Common mistake — Slack's conversations.history returns an array of messages — your target message is at messages[0].text. If you reference the wrong index, you will capture the wrong message as your task title.
6

n8n > Workflow Canvas > + > Code

Parse Task Fields with a Code Node

Add an n8n Code node after the Slack message fetch. This is where you extract the task title, assignee, and due date from the raw message text. The Code node runs JavaScript directly — you can use regex to pull structured data like '@username' mentions or date strings in formats like 'by Friday' or '2024-03-15'. This step is what makes n8n worth using here: you can handle any text format your team actually writes.

  1. 1Click '+' after the Slack fetch node and search for 'Code'
  2. 2Set Language to 'JavaScript'
  3. 3Paste your parsing logic into the code editor (see Pro Tip below)
  4. 4Click 'Test Step' to verify the extracted fields look correct
What you should see: The Code node output should show a clean object with fields like taskTitle, assigneeSlackId, and dueDate — ready to map into Wrike.

Paste this into the Code node (Step 6) in n8n. It parses the raw Slack message text to extract a clean task title, detect an @mention for assignee, find a due date in multiple formats, and flag urgency — all in one pass. The output feeds directly into your field mapping for the Wrike API call.

JavaScript — Code Node// n8n Code Node — Slack message parser for Wrike task creation
▸ Show code
// n8n Code Node — Slack message parser for Wrike task creation
// Input: Slack message text from previous node
// Output: Structured task fields

... expand to see full code

// n8n Code Node — Slack message parser for Wrike task creation
// Input: Slack message text from previous node
// Output: Structured task fields

const items = $input.all();

return items.map(item => {
  const messageText = item.json.messages?.[0]?.text || '';
  const reactingUserId = item.json.body?.event?.user || '';
  const messageAuthorId = item.json.body?.event?.item_user || reactingUserId;

  // Strip Slack user mention tags like <@U04MXYZABC> for display
  const cleanText = messageText
    .replace(/<@[A-Z0-9]+>/g, '')
    .replace(/\s+/g, ' ')
    .trim();

  // Extract @mention for assignee — Slack encodes as <@USERID>
  const mentionMatch = messageText.match(/<@([A-Z0-9]+)>/);
  const assigneeSlackId = mentionMatch ? mentionMatch[1] : messageAuthorId;

  // Parse due date — supports ISO (2024-03-20), 'by Month Day', 'due Month Day'
  let dueDate = null;
  const isoMatch = cleanText.match(/\b(\d{4}-\d{2}-\d{2})\b/);
  const naturalMatch = cleanText.match(/(?:by|due)\s+([A-Z][a-z]+\s+\d{1,2})/i);

  if (isoMatch) {
    dueDate = isoMatch[1];
  } else if (naturalMatch) {
    const parsed = new Date(`${naturalMatch[1]} ${new Date().getFullYear()}`);
    if (!isNaN(parsed)) {
      dueDate = parsed.toISOString().split('T')[0];
    }
  }

  // Strip date phrases from the title
  const titleText = cleanText
    .replace(/(?:by|due)\s+[A-Z][a-z]+\s+\d{1,2}/gi, '')
    .replace(/\d{4}-\d{2}-\d{2}/, '')
    .replace(/\s+/g, ' ')
    .trim();

  // Detect urgency keywords
  const urgencyKeywords = ['urgent', 'asap', 'critical', '!!', 'blocker'];
  const isUrgent = urgencyKeywords.some(kw => cleanText.toLowerCase().includes(kw));

  // Build task description with Slack context
  const channelId = item.json.body?.event?.item?.channel || '';
  const ts = item.json.body?.event?.item?.ts || '';
  const slackPermalink = `https://slack.com/archives/${channelId}/p${ts.replace('.', '')}`;

  return {
    json: {
      taskTitle: titleText || 'Untitled task from Slack',
      assigneeSlackId,
      dueDate,
      importance: isUrgent ? 'High' : 'Normal',
      description: `Created from Slack message\nOriginal: ${slackPermalink}`,
      rawMessageText: messageText
    }
  };
});
Slack fields
text
user
channel
ts
thread_ts
available as variables:
1.props.text
1.props.user
1.props.channel
1.props.ts
1.props.thread_ts
7

n8n > Workflow Canvas > + > Slack > Get User > HTTP Request > Wrike Contacts

Resolve Slack User ID to a Wrike Assignee

Slack user IDs (like U04XYZABC) are not directly usable in Wrike. Add another Slack node to call users.info and retrieve the user's display name or email. Then, add an HTTP Request node to call the Wrike API's contacts endpoint, filter by email, and get the Wrike user ID. This lookup ensures tasks are assigned to a real Wrike account — not left unassigned.

  1. 1Add a Slack node, set Resource to 'User', Operation to 'Get'
  2. 2Set User ID to: {{ $('Code').item.json.assigneeSlackId }}
  3. 3Add an HTTP Request node after it
  4. 4Set URL to: https://www.wrike.com/api/v4/contacts?me=false
  5. 5Add Authorization header: Bearer YOUR_WRIKE_TOKEN
  6. 6In the next Code node or Set node, match the returned email to find the Wrike userId
What you should see: The HTTP Request node output should contain a Wrike contacts array. You should be able to find your test user's Wrike ID in the 'id' field of the matching contact.
Common mistake — Wrike's contacts endpoint returns all workspace members — this can be a large payload for big teams. Cache this lookup or filter with the 'fields' parameter to avoid hitting Wrike's 1,000 ms average response ceiling on large workspaces.

Paste this into the Code node (Step 6) in n8n. It parses the raw Slack message text to extract a clean task title, detect an @mention for assignee, find a due date in multiple formats, and flag urgency — all in one pass. The output feeds directly into your field mapping for the Wrike API call.

JavaScript — Code Node// n8n Code Node — Slack message parser for Wrike task creation
▸ Show code
// n8n Code Node — Slack message parser for Wrike task creation
// Input: Slack message text from previous node
// Output: Structured task fields

... expand to see full code

// n8n Code Node — Slack message parser for Wrike task creation
// Input: Slack message text from previous node
// Output: Structured task fields

const items = $input.all();

return items.map(item => {
  const messageText = item.json.messages?.[0]?.text || '';
  const reactingUserId = item.json.body?.event?.user || '';
  const messageAuthorId = item.json.body?.event?.item_user || reactingUserId;

  // Strip Slack user mention tags like <@U04MXYZABC> for display
  const cleanText = messageText
    .replace(/<@[A-Z0-9]+>/g, '')
    .replace(/\s+/g, ' ')
    .trim();

  // Extract @mention for assignee — Slack encodes as <@USERID>
  const mentionMatch = messageText.match(/<@([A-Z0-9]+)>/);
  const assigneeSlackId = mentionMatch ? mentionMatch[1] : messageAuthorId;

  // Parse due date — supports ISO (2024-03-20), 'by Month Day', 'due Month Day'
  let dueDate = null;
  const isoMatch = cleanText.match(/\b(\d{4}-\d{2}-\d{2})\b/);
  const naturalMatch = cleanText.match(/(?:by|due)\s+([A-Z][a-z]+\s+\d{1,2})/i);

  if (isoMatch) {
    dueDate = isoMatch[1];
  } else if (naturalMatch) {
    const parsed = new Date(`${naturalMatch[1]} ${new Date().getFullYear()}`);
    if (!isNaN(parsed)) {
      dueDate = parsed.toISOString().split('T')[0];
    }
  }

  // Strip date phrases from the title
  const titleText = cleanText
    .replace(/(?:by|due)\s+[A-Z][a-z]+\s+\d{1,2}/gi, '')
    .replace(/\d{4}-\d{2}-\d{2}/, '')
    .replace(/\s+/g, ' ')
    .trim();

  // Detect urgency keywords
  const urgencyKeywords = ['urgent', 'asap', 'critical', '!!', 'blocker'];
  const isUrgent = urgencyKeywords.some(kw => cleanText.toLowerCase().includes(kw));

  // Build task description with Slack context
  const channelId = item.json.body?.event?.item?.channel || '';
  const ts = item.json.body?.event?.item?.ts || '';
  const slackPermalink = `https://slack.com/archives/${channelId}/p${ts.replace('.', '')}`;

  return {
    json: {
      taskTitle: titleText || 'Untitled task from Slack',
      assigneeSlackId,
      dueDate,
      importance: isUrgent ? 'High' : 'Normal',
      description: `Created from Slack message\nOriginal: ${slackPermalink}`,
      rawMessageText: messageText
    }
  };
});
8

n8n > Workflow Canvas > + > HTTP Request

Create the Wrike Task via HTTP Request Node

Add an HTTP Request node and point it at the Wrike Tasks API: POST https://www.wrike.com/api/v4/folders/{folderId}/tasks. Set the body to JSON and map your parsed fields — title from the message text, assignees as an array of Wrike user IDs, and dates formatted as ISO 8601. You will need your Wrike folder ID, which you can find in Wrike by opening the project and looking at the URL.

  1. 1Add an HTTP Request node
  2. 2Set Method to POST
  3. 3Set URL to: https://www.wrike.com/api/v4/folders/IEAAAAAA12345678/tasks (replace with your folder ID)
  4. 4Set Body Content Type to 'JSON'
  5. 5Add Body Parameters: title, assignees (array), dates (object with due date)
  6. 6Add Authorization header: Bearer YOUR_WRIKE_PERMANENT_TOKEN
What you should see: A successful POST returns a 200 response with the new task object. You should see the task appear in Wrike within 5 seconds of the node running.
Common mistake — Wrike folder IDs look like 'IEAAAAAA12345678' — they are not numeric. Do not confuse them with task IDs, which are different. Copy the folder ID from the Wrike URL when you have that project open in your browser.
9

n8n > Workflow Canvas > + > IF

Add an IF Node to Filter Emoji Type

Not every emoji reaction should create a Wrike task. Add an IF node between the Webhook and the Slack message fetch to check that the reaction name matches your chosen emoji — for example, 'clipboard' for 📋. If the reaction name does not match, route that branch to a No Operation node so the workflow exits cleanly without creating junk tasks.

  1. 1Click the connection line between Webhook and Slack nodes, insert an IF node
  2. 2Set Condition: Value 1 = {{ $json.body.event.reaction }}, Operation = 'Equal', Value 2 = 'clipboard'
  3. 3Connect the 'True' branch to your Slack message fetch node
  4. 4Add a 'No Operation' node and connect the 'False' branch to it
What you should see: When you test with a clipboard emoji reaction, the True branch executes. When you test with a thumbs-up, the False branch executes and the workflow stops — no Wrike task created.
Common mistake — Slack sends emoji names without colons — 'clipboard', not ':clipboard:'. If you include colons in your IF condition value, every reaction will fall through to the False branch.
Slack
SL
trigger
filter
Type
matches criteria?
yes — passes through
no — skipped
Wrike
WR
notified
10

n8n > Workflow Canvas > + > Slack > Post Message

Post a Confirmation Message Back to Slack

Add a final Slack node at the end of the True branch to post a confirmation in the thread. Use chat.postMessage with thread_ts set to the original message's timestamp — this keeps the confirmation as a thread reply rather than a new channel message. Include the Wrike task URL in the message so the user can jump straight to it.

  1. 1Add a Slack node after the HTTP Request node
  2. 2Set Resource to 'Message', Operation to 'Post'
  3. 3Set Channel to: {{ $('Webhook').item.json.body.event.item.channel }}
  4. 4Set Text to: ✅ Task created in Wrike: {{ $('HTTP Request').item.json.data[0].permalink }}
  5. 5Set Thread Timestamp to: {{ $('Webhook').item.json.body.event.item.ts }}
What you should see: Within 10 seconds of adding the clipboard emoji, you should see a threaded reply from your bot in Slack with the Wrike task link.
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.
11

n8n > Workflow Canvas > Save > Toggle Active

Activate the Workflow and Test End-to-End

Click 'Save' then toggle the workflow to 'Active' using the switch in the top right of the n8n canvas. Go to your Slack channel and react to any message with the 📋 emoji. Watch the n8n execution log — you should see all nodes turn green within 8–10 seconds. Then check Wrike to confirm the task appeared in the correct project folder with the right title and assignee.

  1. 1Click 'Save' in the top right
  2. 2Toggle the workflow status from 'Inactive' to 'Active'
  3. 3Go to your monitored Slack channel
  4. 4React to a message with the 📋 (clipboard) emoji
  5. 5Open n8n > Executions to watch the run complete
  6. 6Open Wrike and confirm the task appears in your target folder
What you should see: The Executions panel in n8n shows a green 'Success' status. The Wrike task title matches the Slack message text, and the assignee matches the message author.
n8n
▶ Run once
executed
Slack
Wrike
Wrike
🔔 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 your team is technical enough to maintain a self-hosted instance and you need custom text parsing that no no-code platform handles cleanly. The Code node is the real reason to pick n8n here — pulling a due date and assignee out of freeform Slack message text requires regex and conditional logic that Zapier's Formatter and Make's text functions both struggle with at scale. A second good reason: n8n's self-hosted plan costs a flat fee regardless of execution count, which matters if your team is chatty and reactions fire 200–300 times per month. The one scenario where you should look elsewhere: if no one on your team can read JavaScript, use Make instead — its Slack and Wrike modules are more polished and the visual router handles the emoji filter without any code.

Cost

On cost: each workflow run uses roughly 7–8 n8n executions (webhook → IF → Slack fetch → user lookup → Wrike contacts → task create → Slack reply). At 200 task captures per month, that's ~1,600 executions/month. On n8n Cloud's Starter plan ($20/month, 2,500 executions), you are well within limits. At 400 tasks/month (~3,200 executions), you are over — upgrade to Pro at $50/month or self-host for free. Zapier would cost $49–$69/month for the same volume because each 7-step Zap counts as 7 tasks against your limit. Make's Core plan ($9/month, 10,000 operations) is cheaper than n8n Cloud for this specific workflow if you stay under 1,200 tasks/month.

Tradeoffs

Zapier has a pre-built Wrike integration with a 'Create Task' action that is faster to configure than n8n's HTTP Request node — zero API docs required. Make's scenario builder lets you visually branch on emoji type without a Code node, and its Slack module natively fetches message content in a single step. Power Automate has a Wrike connector in preview, but it requires a premium license and the Slack trigger is limited to specific channels set at design time — not flexible enough for multi-channel setups. Pipedream's Slack source handles event subscriptions without requiring you to build a Slack app from scratch, which saves 20 minutes of setup. n8n wins despite all of this because the Code node handles real-world message parsing that no visual tool matches — and if you self-host, there is no per-execution cost ever.

Three things you will hit after setup. First: Slack's reaction_added event fires when anyone adds any emoji — including your bot's own confirmation message if you use emoji in it. Make sure your IF node filters strictly on one emoji name. Second: Wrike's API rate limit is 100 requests per minute per token. If your team has a burst of reactions during a stand-up meeting, you will hit 429 errors. Add a Wait node with a 1-second delay before the Wrike create call to space them out. Third: Wrike's dates object requires both 'start' and 'due' fields to be present if you set either one — sending only 'due' without 'start' returns a 400 error that looks confusing. Set 'start' to today's date as a default whenever you detect a due date in the message.

Ideas for what to build next

  • Sync Wrike Task Status Back to SlackWhen a Wrike task is marked complete, post an update in the original Slack thread. Requires a second n8n workflow using Wrike webhooks as the trigger.
  • Route Tasks to Different Wrike Projects by ChannelAdd a Switch node that maps each Slack channel ID to a specific Wrike folder ID — so #design-team reactions go to the Design project and #engineering reactions go to the Engineering backlog.
  • Add a Slack Modal for Due Date and PriorityInstead of parsing dates from message text, respond to the emoji reaction by opening a Slack modal (views.open) where the user can fill in a due date and priority before the task is created — eliminates regex edge cases entirely.

Related guides

Was this guide helpful?
Slack + Wrike overviewn8n profile →