

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-timeUse case type
routingReal-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.
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 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.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Task Title | title | |
| Slack Channel ID | ||
| Slack Message Timestamp (ts) | ||
| Wrike Folder ID | folderId | |
5 optional fields▸ show
| Assignee (Wrike User ID) | responsibles |
| Due Date | dates.due |
| Task Description | description |
| Priority | importance |
| Status | status |
Step-by-Step Setup
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.
- 1Go to api.slack.com/apps and click 'Create New App'
- 2Select 'From Scratch', enter app name 'Wrike Task Bot', choose your workspace
- 3In the left sidebar, click 'Event Subscriptions'
- 4Toggle 'Enable Events' to On — leave the Request URL blank for now
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
}
};
});
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.
- 1Open n8n and click 'New Workflow' in the top right
- 2Click the '+' node button and search for 'Webhook'
- 3Set HTTP Method to 'POST'
- 4Set Path to 'slack-wrike-task' (or any unique slug)
- 5Copy the full Webhook URL shown at the bottom of the node config panel
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.
- 1Paste the n8n production webhook URL into the 'Request URL' field
- 2Wait for the green 'Verified' checkmark to appear
- 3Scroll down to 'Subscribe to Bot Events'
- 4Click 'Add Bot User Event' and add 'reaction_added' (for emoji-based triggering)
- 5Click 'Save Changes' at the bottom of the page
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-.
- 1Click 'OAuth & Permissions' in the left sidebar
- 2Under 'Bot Token Scopes', click 'Add an OAuth Scope'
- 3Add: channels:history, reactions:read, users:read
- 4Click 'Install to Workspace' at the top and authorize
- 5Copy the 'Bot User OAuth Token' (starts with xoxb-)
- 6In your Slack channel, type /invite @WrikeTaskBot to add the bot
channel: {{channel}}
ts: {{ts}}
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.
- 1Click '+' after the Webhook node to add a new node
- 2Search for 'Slack' and select it
- 3Set Resource to 'Message' and Operation to 'Get Permalink' or use the conversations.history API call
- 4Set Channel ID to: {{ $json.body.event.item.channel }}
- 5Set Timestamp to: {{ $json.body.event.item.ts }}
- 6Select or create your Slack credential using the xoxb- token
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.
- 1Click '+' after the Slack fetch node and search for 'Code'
- 2Set Language to 'JavaScript'
- 3Paste your parsing logic into the code editor (see Pro Tip below)
- 4Click 'Test Step' to verify the extracted fields look correct
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
}
};
});
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.
- 1Add a Slack node, set Resource to 'User', Operation to 'Get'
- 2Set User ID to: {{ $('Code').item.json.assigneeSlackId }}
- 3Add an HTTP Request node after it
- 4Set URL to: https://www.wrike.com/api/v4/contacts?me=false
- 5Add Authorization header: Bearer YOUR_WRIKE_TOKEN
- 6In the next Code node or Set node, match the returned email to find the Wrike userId
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
}
};
});
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.
- 1Add an HTTP Request node
- 2Set Method to POST
- 3Set URL to: https://www.wrike.com/api/v4/folders/IEAAAAAA12345678/tasks (replace with your folder ID)
- 4Set Body Content Type to 'JSON'
- 5Add Body Parameters: title, assignees (array), dates (object with due date)
- 6Add Authorization header: Bearer YOUR_WRIKE_PERMANENT_TOKEN
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.
- 1Click the connection line between Webhook and Slack nodes, insert an IF node
- 2Set Condition: Value 1 = {{ $json.body.event.reaction }}, Operation = 'Equal', Value 2 = 'clipboard'
- 3Connect the 'True' branch to your Slack message fetch node
- 4Add a 'No Operation' node and connect the 'False' branch to it
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.
- 1Add a Slack node after the HTTP Request node
- 2Set Resource to 'Message', Operation to 'Post'
- 3Set Channel to: {{ $('Webhook').item.json.body.event.item.channel }}
- 4Set Text to: ✅ Task created in Wrike: {{ $('HTTP Request').item.json.data[0].permalink }}
- 5Set Thread Timestamp to: {{ $('Webhook').item.json.body.event.item.ts }}
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.
- 1Click 'Save' in the top right
- 2Toggle the workflow status from 'Inactive' to 'Active'
- 3Go to your monitored Slack channel
- 4React to a message with the 📋 (clipboard) emoji
- 5Open n8n > Executions to watch the run complete
- 6Open Wrike and confirm the task appears in your target folder
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 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.
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.
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 Slack — When 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 Channel — Add 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 Priority — Instead 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
How to Create Notion Tasks from Slack with Pipedream
~15 min setup
How to Create Notion Tasks from Slack with Power Automate
~15 min setup
How to Create Notion Tasks from Slack with n8n
~20 min setup
How to Create Notion Tasks from Slack Messages with Zapier
~8 min setup
How to Create Notion Tasks from Slack Messages with Make
~12 min setup
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup