

How to Send Wrike Task Updates to Slack with n8n
Automatically posts a formatted Slack message to the right project channel whenever a Wrike task changes status, is completed, or hits its 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 running 10–50 active Wrike projects who want real-time Slack alerts without anyone manually posting updates.
Not ideal for
Teams needing two-way sync — this sends Wrike events to Slack only, and won't create Wrike tasks from Slack messages.
Sync type
real-timeUse case type
notificationReal-World Example
A 22-person product agency manages client sprints in Wrike across 15 active projects. Before this workflow, a project manager copy-pasted status updates into Slack twice a day — and the team regularly worked on stale info. Now, every time a task moves to In Progress, Active Review, or Completed in Wrike, the assigned Slack project channel gets an automatic message within 30 seconds, including the task name, assignee, and due date.
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 | ||
| Event Type | eventType | |
| Task ID | taskId | |
| Task Title | title | |
| Task Status | status | |
| Project / Parent Folder Name | parentIds | |
| Slack Channel ID | ||
5 optional fields▸ show
| Assignee ID | responsibleIds |
| Assignee Name | |
| Due Date | dates.due |
| Task Permalink | permalink |
| Changed By (User ID) | authorId |
Step-by-Step Setup
n8n Dashboard > + New Workflow
Create a new n8n workflow
Open your n8n instance and click the '+ New Workflow' button in the top-right corner of the Workflows dashboard. Give it a clear name like 'Wrike → Slack Task Notifications'. This name shows up in execution logs, so being specific saves time when debugging. You'll land on a blank canvas with a single gray 'Add first step' node in the center.
- 1Click '+ New Workflow' in the top-right of the Workflows list
- 2Click the pencil icon next to 'My workflow' and rename it to 'Wrike → Slack Task Notifications'
- 3Press Enter to save the name
Canvas > + Node > Search 'Webhook' > Webhook
Add the Webhook trigger node
Click the '+' node on the canvas, search for 'Webhook', and select it. n8n will generate a unique webhook URL — this is what Wrike will call every time a task event fires. Set the HTTP Method to POST and Authentication to None for now (you'll lock this down in the production checklist). Copy the 'Test URL' shown in the node panel — you need it in the next step.
- 1Click the gray '+' node on the canvas
- 2Type 'Webhook' in the search bar
- 3Select the 'Webhook' trigger node
- 4Set HTTP Method to 'POST'
- 5Click 'Copy' next to the Test URL field
Wrike > Account Settings > Apps & Integrations > API > Webhooks > Create Webhook
Register the webhook in Wrike
Go to your Wrike account and navigate to Apps & Integrations, then select API. From there, open the Webhooks tab and click 'Create Webhook'. Paste the n8n Test URL into the Hook URL field. Set the event filter to include 'Task Status Changed', 'Task Completed', and 'Task Due Date Reached'. You can scope the webhook to a specific Wrike Space or leave it account-wide — scoping it to one Space keeps noise down.
- 1In Wrike, click your avatar in the top-right and select 'Apps & Integrations'
- 2Click 'Wrike API' then navigate to the 'Webhooks' tab
- 3Click '+ Create Webhook'
- 4Paste the n8n Test URL into the 'Hook URL' field
- 5Check the boxes for 'TaskStatusChanged', 'TaskCompleted', and 'TaskDueDateReached'
- 6Click 'Create' to save
n8n Canvas > Webhook Node > Listen for Test Event
Test the webhook by triggering a Wrike task change
Switch back to n8n and click 'Listen for Test Event' inside the Webhook node. Then go to Wrike and manually change any task status — for example, move a task from New to In Progress. Within a few seconds, n8n should receive the payload and display the raw JSON in the node output panel. Expand the data to confirm you can see fields like taskId, status, title, and assigneeId.
- 1Click the Webhook node to open its panel
- 2Click the 'Listen for Test Event' button
- 3Switch to Wrike and change a task's status
- 4Return to n8n and wait for the 'Event received' confirmation
Canvas > + Node > Search 'Switch' > Switch
Add a Switch node to route by event type
Wrike sends all three event types to the same webhook URL. You need to route them to different message templates. Click '+' after the Webhook node and add a 'Switch' node. Set it to match on the field {{ $json.body[0].eventType }} (or {{ $json.eventType }} depending on your Wrike API version — check the actual payload from Step 4). Create three output routes: one for TaskStatusChanged, one for TaskCompleted, one for TaskDueDateReached.
- 1Click '+' after the Webhook node
- 2Search for 'Switch' and select it
- 3Set Mode to 'Rules'
- 4Add Rule 1: Value = {{ $json.body[0].eventType }}, Operation = equals, Compare value = 'TaskStatusChanged'
- 5Add Rule 2: Compare value = 'TaskCompleted'
- 6Add Rule 3: Compare value = 'TaskDueDateReached'
Canvas > + Node > Search 'Code' > Code
Add a Code node to build the Slack message
On each Switch branch, add a 'Code' node. This is where you format the Wrike data into a clean Slack Block Kit message. You can use a single shared Code node by merging branches before it, or keep three separate Code nodes for different message templates per event type. The pro tip below has a complete working script. Paste it into the Code node's JavaScript editor, which you access by clicking 'Edit Code' inside the node panel.
- 1Click '+' on the TaskStatusChanged branch
- 2Search for 'Code' and select it
- 3Click 'Edit Code' to open the JavaScript editor
- 4Paste in the transformation script from the Pro Tip section below
- 5Click 'Execute node' to test with the sample data from Step 4
Paste this into the Code node added in Step 6. It handles all three Wrike event types with distinct Block Kit templates, maps project IDs to Slack channel IDs, formats the due date, and builds the full message object that feeds directly into the Slack node's channel, text, and blocks fields.
JavaScript — Code Node// n8n Code Node — Wrike → Slack Block Kit message builder▸ Show code
// n8n Code Node — Wrike → Slack Block Kit message builder // Expects HTTP Request node (Step 7) output merged before this node // $input.first().json = Wrike webhook payload body[0]
... expand to see full code
// n8n Code Node — Wrike → Slack Block Kit message builder
// Expects HTTP Request node (Step 7) output merged before this node
// $input.first().json = Wrike webhook payload body[0]
// $('HTTP Request').first().json = Wrike contact API response
const payload = $input.first().json.body[0];
const contactData = $('HTTP Request').first().json.data[0];
// Project ID → Slack Channel ID mapping — update with your own values
const channelMap = {
'FLGH1234': 'C04LANDING23', // #project-landing-page
'FLGH5678': 'C04ONBOARD56', // #project-onboarding
'FLGH9012': 'C04LEGAL789', // #project-legal
};
const eventType = payload.eventType;
const taskTitle = payload.title || 'Untitled Task';
const taskStatus = payload.status || 'Unknown';
const projectId = payload.parentIds?.[0] || '';
const taskPermalink = payload.permalink || 'https://www.wrike.com';
const assigneeName = contactData
? `${contactData.firstName} ${contactData.lastName}`
: 'Unassigned';
// Format due date from ISO to readable string
const rawDue = payload.dates?.due;
const dueDate = rawDue
? new Date(rawDue).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })
: 'No due date';
// Resolve Slack channel from project ID
const channel = channelMap[projectId] || 'C04GENERAL00'; // fallback to #general
// Build event-specific header and fallback text
let headerText, fallbackText, emoji;
if (eventType === 'TaskStatusChanged') {
emoji = '📋';
headerText = `Status Update: ${taskStatus}`;
fallbackText = `${emoji} Task status changed: ${taskTitle} → ${taskStatus}`;
} else if (eventType === 'TaskCompleted') {
emoji = '✅';
headerText = 'Task Completed';
fallbackText = `${emoji} Completed: ${taskTitle}`;
} else if (eventType === 'TaskDueDateReached') {
emoji = '⏰';
headerText = 'Due Today';
fallbackText = `${emoji} Due today: ${taskTitle}`;
} else {
emoji = 'ℹ️';
headerText = 'Wrike Update';
fallbackText = `${emoji} Update on: ${taskTitle}`;
}
// Build Slack Block Kit payload
const blocks = [
{
type: 'header',
text: { type: 'plain_text', text: `${emoji} ${headerText}`, emoji: true }
},
{
type: 'section',
fields: [
{ type: 'mrkdwn', text: `*Task:*\n${taskTitle}` },
{ type: 'mrkdwn', text: `*Status:*\n${taskStatus}` },
{ type: 'mrkdwn', text: `*Assigned to:*\n${assigneeName}` },
{ type: 'mrkdwn', text: `*Due:*\n${dueDate}` }
]
},
{ type: 'divider' },
{
type: 'actions',
elements: [
{
type: 'button',
text: { type: 'plain_text', text: 'Open in Wrike', emoji: true },
url: taskPermalink,
action_id: 'open_wrike_task'
}
]
}
];
return [{ json: { channel, text: fallbackText, blocks } }];channel: {{channel}}
ts: {{ts}}
Canvas > + Node > HTTP Request
Resolve the Wrike assignee ID to a name
Wrike webhooks send assigneeId (a string like 'IEABC123'), not the person's name. Before posting to Slack, add an HTTP Request node to call the Wrike API GET /contacts/{assigneeId} endpoint. Authenticate with your Wrike OAuth token (stored as a credential in n8n). The response includes firstName, lastName, and optionally a Slack user handle if you've configured Wrike profiles — you can use this to @mention the right person.
- 1Click '+' after the Webhook node but before the Code node
- 2Add an 'HTTP Request' node
- 3Set Method to GET
- 4Set URL to https://www.wrike.com/api/v4/contacts/{{ $json.body[0].responsibleIds[0] }}
- 5Set Authentication to 'Header Auth' using your Wrike API token credential
- 6Click 'Execute node' and confirm firstName and lastName appear in the output
Paste this into the Code node added in Step 6. It handles all three Wrike event types with distinct Block Kit templates, maps project IDs to Slack channel IDs, formats the due date, and builds the full message object that feeds directly into the Slack node's channel, text, and blocks fields.
JavaScript — Code Node// n8n Code Node — Wrike → Slack Block Kit message builder▸ Show code
// n8n Code Node — Wrike → Slack Block Kit message builder // Expects HTTP Request node (Step 7) output merged before this node // $input.first().json = Wrike webhook payload body[0]
... expand to see full code
// n8n Code Node — Wrike → Slack Block Kit message builder
// Expects HTTP Request node (Step 7) output merged before this node
// $input.first().json = Wrike webhook payload body[0]
// $('HTTP Request').first().json = Wrike contact API response
const payload = $input.first().json.body[0];
const contactData = $('HTTP Request').first().json.data[0];
// Project ID → Slack Channel ID mapping — update with your own values
const channelMap = {
'FLGH1234': 'C04LANDING23', // #project-landing-page
'FLGH5678': 'C04ONBOARD56', // #project-onboarding
'FLGH9012': 'C04LEGAL789', // #project-legal
};
const eventType = payload.eventType;
const taskTitle = payload.title || 'Untitled Task';
const taskStatus = payload.status || 'Unknown';
const projectId = payload.parentIds?.[0] || '';
const taskPermalink = payload.permalink || 'https://www.wrike.com';
const assigneeName = contactData
? `${contactData.firstName} ${contactData.lastName}`
: 'Unassigned';
// Format due date from ISO to readable string
const rawDue = payload.dates?.due;
const dueDate = rawDue
? new Date(rawDue).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })
: 'No due date';
// Resolve Slack channel from project ID
const channel = channelMap[projectId] || 'C04GENERAL00'; // fallback to #general
// Build event-specific header and fallback text
let headerText, fallbackText, emoji;
if (eventType === 'TaskStatusChanged') {
emoji = '📋';
headerText = `Status Update: ${taskStatus}`;
fallbackText = `${emoji} Task status changed: ${taskTitle} → ${taskStatus}`;
} else if (eventType === 'TaskCompleted') {
emoji = '✅';
headerText = 'Task Completed';
fallbackText = `${emoji} Completed: ${taskTitle}`;
} else if (eventType === 'TaskDueDateReached') {
emoji = '⏰';
headerText = 'Due Today';
fallbackText = `${emoji} Due today: ${taskTitle}`;
} else {
emoji = 'ℹ️';
headerText = 'Wrike Update';
fallbackText = `${emoji} Update on: ${taskTitle}`;
}
// Build Slack Block Kit payload
const blocks = [
{
type: 'header',
text: { type: 'plain_text', text: `${emoji} ${headerText}`, emoji: true }
},
{
type: 'section',
fields: [
{ type: 'mrkdwn', text: `*Task:*\n${taskTitle}` },
{ type: 'mrkdwn', text: `*Status:*\n${taskStatus}` },
{ type: 'mrkdwn', text: `*Assigned to:*\n${assigneeName}` },
{ type: 'mrkdwn', text: `*Due:*\n${dueDate}` }
]
},
{ type: 'divider' },
{
type: 'actions',
elements: [
{
type: 'button',
text: { type: 'plain_text', text: 'Open in Wrike', emoji: true },
url: taskPermalink,
action_id: 'open_wrike_task'
}
]
}
];
return [{ json: { channel, text: fallbackText, blocks } }];Canvas > + Node > Slack > Credentials > Create New > OAuth2
Connect Slack credentials in n8n
Click '+' after your Code node and add a 'Slack' node. In the node panel, click 'Credential for Slack API' and select 'Create New'. n8n will prompt you to connect via OAuth2 — click Connect, authorize the n8n app in Slack, and select the workspace. Make sure the Slack app has the chat:write and chat:write.public OAuth scopes. Without chat:write.public, the bot cannot post to channels it hasn't been explicitly invited to.
- 1Add a 'Slack' node after the Code node
- 2Set Resource to 'Message' and Operation to 'Post'
- 3Click 'Credential for Slack API' dropdown and select 'Create New'
- 4Click 'Connect my account' and authorize in the Slack OAuth window
- 5Confirm the workspace name appears under the credential name
Canvas > Slack Node > Message > Post
Configure the Slack message fields
Inside the Slack node, set Channel to {{ $json.channel }} — this comes from your Code node output, which maps Wrike project names to Slack channel IDs. Set Text to {{ $json.text }} as the fallback. For the Blocks field, enable it and paste {{ $json.blocks }} — this sends the full Block Kit message. Toggle 'As User' to false so the message posts as your bot with a consistent name and icon.
- 1In the Slack node, set 'Channel' to expression mode and type {{ $json.channel }}
- 2Set 'Text' to {{ $json.text }}
- 3Toggle on 'Blocks' and set the value to {{ JSON.stringify($json.blocks) }}
- 4Set 'As User' to false
- 5Set 'Username' to 'Wrike Bot' and optionally add an icon emoji like :wrike:
Canvas > Workflow Settings > Error Workflow
Add error handling with an Error Trigger node
Click the three-dot menu on your workflow canvas and select 'Settings'. Enable 'Error Workflow' and point it to a separate error-handler workflow (create a new one with an Error Trigger node and a Slack node that pings #ops-alerts). This way, if the Wrike API is down or a field is missing, your team gets notified instead of silently losing updates. Without this, failed executions are invisible unless you check the Executions log manually.
- 1Click the three-dot menu (⋯) at the top-right of the canvas
- 2Select 'Settings'
- 3Under 'Error Workflow', click the dropdown and select '+ Create New Workflow'
- 4In the new workflow, add an Error Trigger node and connect it to a Slack node targeting #ops-alerts
- 5Save and activate the error workflow, then return to your main workflow
n8n Canvas > Webhook Node > Production URL | Wrike > Webhooks > Edit
Activate the workflow and swap to the Production URL
Before activating, go back to Wrike and edit the webhook you created in Step 3. Replace the Test URL with the Production URL from your n8n Webhook node — find it by clicking the Webhook node and toggling from 'Test URL' to 'Production URL' at the top of the panel. Then return to n8n and toggle the workflow Active switch in the top-right to ON. The workflow is now live and will process real Wrike events.
- 1Click the Webhook node and copy the Production URL
- 2Go to Wrike > Apps & Integrations > API > Webhooks
- 3Click Edit on your webhook and replace the Test URL with the Production URL
- 4Save in Wrike
- 5Return to n8n and click the Active toggle to ON
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 you're already self-hosting it, if your team has someone comfortable with JavaScript, or if you need the Code node's flexibility to handle Wrike's quirky payload structure. The channelMap logic, Block Kit construction, and assignee ID resolution all benefit from real code — you'd spend more time fighting around limitations in a no-code tool than just writing the 40 lines this takes. The one scenario where you'd pick something else: if your team is non-technical and needs to maintain this workflow themselves without touching code, Make handles this use case with a cleaner visual interface and the Wrike module already parses event types for you.
Cost math is simple here. Each Wrike event = 1 n8n execution. At 50 task changes per day across your projects, that's roughly 1,500 executions per month. n8n Cloud's Starter plan ($20/month) includes 2,500 executions — you're well within that. Self-hosted n8n is free with no execution limits, just server costs (a $6/month VPS handles it easily). Compare that to Zapier: the same 1,500 tasks/month = 1,500 Zap runs, which burns through the free tier (100 tasks) in two days and costs $19.99/month minimum — and that's before you account for multi-step Zaps counting extra.
Make's Wrike module fires on task events natively without a custom webhook setup — that's a 10-minute advantage over n8n's manual webhook registration. Zapier has a 'Wrike: New Task Status' trigger that's cleaner for non-coders but limited to status changes only — you'd need three separate Zaps for all three event types. Power Automate has no native Wrike connector as of mid-2024 — you'd use the HTTP action with Wrike's REST API, which is exactly what n8n does but with less flexibility in the transformation layer. Pipedream offers a Wrike event source with pre-built OAuth handling, which saves the credential setup step. n8n wins on total control: the Code node handles all three event types in one place, the Block Kit output is fully customizable, and you're not paying per-task fees at scale.
Three things you'll discover after setup. First: Wrike's 'TaskDueDateReached' webhook fires at midnight UTC on the due date — not at the start of the working day in your timezone. Your team will get notifications at 8 PM Eastern if that's your offset. Fix it by adding a Wait node to hold the message until 9 AM local time, or just set stakeholder expectations. Second: Wrike sometimes sends a TaskStatusChanged event with the same status as before when a task is edited in other ways (description changes, attachment uploads). Add a check in your Code node that compares the incoming status against a stored previous value, or your channel will see 'Status: Active → Active' messages. Third: Slack's Block Kit button elements (the 'Open in Wrike' button) don't work in DMs sent by bots — only in channel messages. If you ever extend this to notify assignees directly via DM, drop the actions block and use a plain text link instead.
Ideas for what to build next
- →Add a daily digest for overdue tasks — Build a second n8n workflow with a Schedule trigger that runs at 9 AM, queries the Wrike API for tasks past their due date, and posts a single digest message to each project channel instead of one alert per task.
- →Route urgent tasks to a dedicated #escalations channel — Add an IF node after the Switch node that checks task priority — if Wrike marks a task as 'High' or 'Urgent', route it to #escalations in addition to the project channel so nothing gets buried.
- →Log all notifications to a Google Sheet for audit tracking — Branch the workflow after the Slack node and add a Google Sheets node that appends a row for every notification sent — capturing task ID, event type, channel, timestamp, and assignee for weekly reporting.
Related guides
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup
How to Share Notion Meeting Notes to Slack with Power Automate
~15 min setup
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup