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

How to Post Wrike Standups to Slack with n8n

A scheduled n8n workflow that pulls active task and project status from Wrike every morning and posts a formatted summary to a designated Slack channel.

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 track work in Wrike and want automatic morning summaries in Slack without anyone manually writing a status update.

Not ideal for

Teams that need real-time task alerts — use a webhook-triggered workflow instead of a scheduled digest.

Sync type

scheduled

Use case type

reporting

Real-World Example

💡

A 12-person product team at a SaaS company runs sprint work in Wrike. Every morning at 8:45 AM, n8n pulls all tasks due in the next 48 hours plus any tasks marked overdue, formats them by assignee, and posts a bulleted summary to #product-standup in Slack. Before this, the project manager spent 15–20 minutes each morning manually compiling the same update from Wrike's dashboard.

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.

Wrike admin or API access: you need to create an API app in Wrike and generate a permanent access token under Account Settings > Apps & Integrations > API
Slack workspace permissions: your account must have 'chat:write' scope or be a workspace admin to install the n8n OAuth app and invite it to channels
n8n instance running: either self-hosted (Docker or npm) or n8n Cloud. The Schedule Trigger requires the workflow to be 'Active' on a running instance — it does not fire if n8n is offline
Wrike tasks have due dates set: the date-range filter in this workflow relies on task due dates. Tasks with no due date will not appear in the standup summary
Target Slack channel exists and the n8n bot has been invited to it: run '/invite @YourBotName' inside the channel before activating the workflow

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Titletitle
Assignee IDresponsibleIds
Due Datedates.due
Task Statusstatus
Slack Channel ID
3 optional fields▸ show
Parent Folder / Project NameparentIds
Task Permalinkpermalink
Task Descriptiondescription

Step-by-Step Setup

1

n8n Canvas > + New Workflow

Create a new n8n workflow

Open your n8n instance and click the orange 'New Workflow' button in the top right of the canvas. Name it something like 'Wrike Daily Standup → Slack' so it's easy to find later. You'll build this workflow left to right: trigger on the left, Wrike fetch in the middle, code transformation next, then Slack post on the right. Keep the canvas clean — this workflow has 5 nodes total.

  1. 1Click '+ New Workflow' in the top right
  2. 2Click the pencil icon next to 'My Workflow' and rename it to 'Wrike Daily Standup → Slack'
  3. 3Press Enter to save the name
What you should see: You should see a blank canvas with the workflow name updated in the top navigation bar.
2

Canvas > + Node > Schedule Trigger

Add a Schedule trigger

Click the '+' node placeholder on the canvas and search for 'Schedule Trigger'. This is the built-in n8n node — no credentials required. Set the interval to 'Days' and configure the time to fire at 8:45 AM in your team's local timezone. The timezone dropdown is in the trigger settings panel on the right — it defaults to UTC, which will cause the summary to post at the wrong time if you don't change it.

  1. 1Click the '+' placeholder node on the canvas
  2. 2Type 'Schedule' in the search box and select 'Schedule Trigger'
  3. 3Set 'Trigger Interval' to 'Days'
  4. 4Set 'Hour' to 8 and 'Minute' to 45
  5. 5Open the 'Timezone' dropdown and select your team's local timezone
What you should see: The Schedule Trigger node shows '8:45 AM' and your selected timezone in the node summary on the canvas.
Common mistake — n8n's Schedule Trigger runs on the server clock, not your browser clock. If your n8n instance is hosted in a different region, UTC offset errors are common. Double-check by running the trigger manually and noting the execution timestamp.
n8n
+
click +
search apps
Slack
SL
Slack
Add a Schedule trigger
Slack
SL
module added
3

Wrike > Account Settings > Apps & Integrations > API > Create App

Connect your Wrike account

Add an HTTP Request node after the Schedule Trigger — n8n does not have a native Wrike node, so you'll call the Wrike REST API directly. In the node settings, set the method to GET. Paste your Wrike API endpoint for tasks into the URL field. You'll authenticate using a permanent Wrike access token passed as a Bearer token in the Authorization header. Get your token from Wrike's Apps & Integrations page.

  1. 1Log in to Wrike and navigate to Account Settings > Apps & Integrations > API
  2. 2Click 'Create New App', name it 'n8n Standup', and copy the permanent access token
  3. 3Back in n8n, add an HTTP Request node after the Schedule Trigger
  4. 4Set Method to 'GET'
  5. 5Set URL to 'https://www.wrike.com/api/v4/tasks?status=Active&fields=["assignees","dates","status","description","parentIds"]'
  6. 6Under 'Authentication', select 'Header Auth', set Name to 'Authorization', Value to 'Bearer YOUR_TOKEN_HERE'
What you should see: When you click 'Test Step', the node returns a JSON response with a 'data' array containing your active Wrike tasks.
Common mistake — Wrike's permanent access token has no expiry but is scoped to the user who created it. If that person leaves the company, the token dies. Create the token under a service account or shared admin user, not a personal account.
n8n settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize n8n
popup window
Connected
green checkmark
4

HTTP Request Node > URL Field > Expression Editor

Filter tasks to the relevant window

The raw Wrike API returns all active tasks — potentially hundreds. Add a second HTTP Request node or use n8n's built-in filtering to scope results. The cleaner approach: modify the Wrike URL query to filter by due date. Wrike accepts 'dueDate' range parameters in the query string. Set 'dueDateStart' to today's date and 'dueDateEnd' to 48 hours from now, formatted as ISO 8601. You'll construct these dates dynamically using n8n expressions.

  1. 1Click the HTTP Request node you created in Step 3
  2. 2Click the URL field and switch to 'Expression' mode using the toggle on the right
  3. 3Replace the static URL with the expression shown in the pro tip code section to inject dynamic date ranges
  4. 4Click 'Test Step' to verify the filtered response returns only near-term tasks
What you should see: The node output shows only tasks with due dates in the next 48 hours. If your team has no tasks due soon, temporarily widen the date range to confirm the filter works before narrowing it back.
Common mistake — Wrike's date filter uses the task's due date, not its 'scheduled' date. Tasks with no due date set will never appear in this query. Brief your team to always set due dates on tasks if they want those tasks to appear in standups.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Wrike
WR
notified
5

Canvas > + Node after Schedule Trigger > HTTP Request

Fetch overdue tasks in a second API call

Add a second HTTP Request node branching from the Schedule Trigger (or chained after the first). This call targets the same Wrike tasks endpoint but filters for tasks where 'dueDate' is before today and status is still Active. These are your overdue items — critical for any standup summary. You'll merge this response with the near-term tasks in the next step.

  1. 1Add a new HTTP Request node — click the '+' on the canvas
  2. 2Set Method to 'GET' and use the same Bearer token auth
  3. 3Set URL to filter tasks where dueDateEnd equals yesterday's date in ISO 8601 format (use an expression identical to Step 4 but subtract 1 day for the end date and set start far in the past)
  4. 4Label this node 'Wrike — Overdue Tasks' by clicking the node title
What you should see: Test this node and confirm the output contains tasks whose due dates have passed. If the array is empty and you know overdue tasks exist, check that the date expression is subtracting days correctly — off-by-one errors are common here.
Common mistake — Wrike's API returns dates in UTC. If your team is in a timezone behind UTC, a task due 'today' locally may already be overdue in the API response. Account for this by adding a timezone offset to your date expressions.
6

Canvas > + Node > Merge, then + Node > Code

Merge and transform task data with a Code node

Add a Merge node to combine the two Wrike API responses, then chain a Code node after it. The Code node is where the real work happens — you'll extract task title, assignee, due date, and status from each item, group tasks by assignee, and build the Slack message block string. Use JavaScript inside the n8n Code node. The full transformation script is in the pro tip section below — paste it directly into the Code node's editor.

  1. 1Add a Merge node after both HTTP Request nodes — connect both nodes to its inputs
  2. 2Set Merge Mode to 'Append' so both task arrays are combined into one list
  3. 3Add a Code node after the Merge node
  4. 4Paste the transformation script from the pro tip section into the JavaScript editor
  5. 5Click 'Test Step' and inspect the output — you should see a single formatted string ready for Slack
What you should see: The Code node outputs one item with a 'slackMessage' field containing a formatted text string grouped by assignee, with overdue tasks marked with a 🔴 prefix and upcoming tasks marked with 🟡.
Common mistake — n8n's Code node runs in a sandboxed Node.js environment. You cannot use require() to import external libraries. Stick to native JavaScript — Date manipulation, Array methods, and string templating are all available without imports.

Paste this into the Code node that sits after your Merge node. It resolves assignee IDs to names using a pre-built lookup map (which you populate from the /contacts API response passed in as a second input), groups tasks by assignee, flags overdue vs. upcoming items, and builds the final Slack-formatted message string with mrkdwn bold headers and emoji indicators.

JavaScript — Code Node// n8n Code Node — Wrike Standup Message Builder
▸ Show code
// n8n Code Node — Wrike Standup Message Builder
// Inputs: items[0..N] = merged Wrike tasks, contactMap passed via $node['Wrike Contacts'].json
const today = new Date();

... expand to see full code

// n8n Code Node — Wrike Standup Message Builder
// Inputs: items[0..N] = merged Wrike tasks, contactMap passed via $node['Wrike Contacts'].json

const today = new Date();
today.setHours(0, 0, 0, 0);

// Build contact ID → display name lookup from the contacts API response
const contactItems = $node['Wrike — Contacts'].json;
const contactMap = {};
if (contactItems && contactItems.data) {
  for (const contact of contactItems.data) {
    contactMap[contact.id] = `${contact.firstName} ${contact.lastName}`.trim();
  }
}

// Collect all tasks from merged input
const allTasks = $input.all().map(item => item.json);

// Group tasks by primary assignee
const byAssignee = {};
for (const task of allTasks) {
  const assigneeIds = task.responsibleIds || [];
  const primaryId = assigneeIds[0] || 'unassigned';
  const displayName = contactMap[primaryId] || primaryId;

  if (!byAssignee[displayName]) {
    byAssignee[displayName] = [];
  }

  const dueRaw = task.dates && task.dates.due ? task.dates.due : null;
  const dueDate = dueRaw ? new Date(dueRaw) : null;
  dueDate && dueDate.setHours(0, 0, 0, 0);

  const isOverdue = dueDate && dueDate < today;
  const dueDateStr = dueDate
    ? dueDate.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })
    : 'no due date';

  const emoji = isOverdue ? '🔴' : '🟡';
  const label = isOverdue ? `overdue since ${dueDateStr}` : `due ${dueDateStr}`;
  const link = task.permalink ? `<${task.permalink}|view>` : '';

  byAssignee[displayName].push(`${emoji} ${task.title} — ${label} ${link}`.trim());
}

// Build Slack message
const dateHeader = today.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });
let message = `🗓 *Daily Standup — ${dateHeader}*\n`;

if (Object.keys(byAssignee).length === 0) {
  message += '\nNo active tasks due in the next 48 hours. ✅';
} else {
  for (const [name, tasks] of Object.entries(byAssignee)) {
    message += `\n*${name}*\n${tasks.join('\n')}\n`;
  }
}

return [{ json: { slackMessage: message } }];
7

Canvas > + Node > Slack > Credentials > Add OAuth2

Connect your Slack account

Add a Slack node after the Code node. Click 'Add Credential' in the node panel and select OAuth2. n8n will open a Slack authorization popup — sign in with the Slack workspace where you want to post standups. The Slack app that n8n creates needs the 'chat:write' and 'channels:read' OAuth scopes. If you're posting to a private channel, also add 'groups:write'.

  1. 1Add a Slack node and click 'Add Credential'
  2. 2Select 'OAuth2' and click 'Connect'
  3. 3In the Slack authorization popup, select your workspace and click 'Allow'
  4. 4Back in n8n, confirm a green checkmark appears next to the credential name
What you should see: The Slack node shows your workspace name next to a green connected indicator. The 'Channel' dropdown should now populate with your workspace's channels.
Common mistake — n8n's Slack OAuth app must be invited to the target channel before it can post. In Slack, go to the channel, type '/invite @n8n' (or whatever you named the app). Skipping this causes a 'not_in_channel' error that looks like an auth failure but isn't.
8

Slack Node > Resource: Message > Operation: Post

Configure the Slack message

In the Slack node, set Resource to 'Message' and Operation to 'Post'. Select your target channel from the dropdown — for example, #product-standup. In the 'Text' field, switch to Expression mode and reference the output from the Code node using '{{ $node["Code"].json["slackMessage"] }}'. Set 'As User' to true if you want the message to appear under a bot name rather than your personal account.

  1. 1Set Resource to 'Message'
  2. 2Set Operation to 'Post'
  3. 3Select your standup channel from the 'Channel' dropdown
  4. 4Click the 'Text' field and toggle to Expression mode
  5. 5Type {{ $node["Code"].json["slackMessage"] }} in the expression field
  6. 6Set 'Bot Name' to 'Standup Bot' and optionally set an emoji icon under 'Icon'
What you should see: When you test this node, a message appears in your target Slack channel with the formatted task summary. If the channel shows 'Standup Bot' as the sender, the bot name configuration is working correctly.
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.
9

HTTP Request Node > ... Menu > Add Error Output > Slack Node

Add error handling with a fallback notification

Wrap the workflow in error handling so you know when the standup fails to post. In n8n, click the three-dot menu on any node and select 'Add Error Output'. Chain a second Slack node to the error output of your HTTP Request nodes. This fallback node posts a simple alert to a #alerts channel: 'Standup failed — Wrike API did not respond. Check n8n execution log.' Without this, a failed run is silent.

  1. 1Click the three-dot menu on the first HTTP Request node
  2. 2Select 'Add Error Output' — a red error connector appears on the node
  3. 3Add a new Slack node and connect it to the red error output
  4. 4Set it to post to your #alerts or #dev-ops channel with a hardcoded error message string
  5. 5Repeat for the second HTTP Request node
What you should see: The canvas shows red error-output connectors from both Wrike HTTP nodes leading to the alert Slack node. Run a deliberate test by entering a bad API URL — the alert should fire within 30 seconds.
Common mistake — n8n's error output only fires on node-level failures (HTTP 4xx/5xx, network timeout). It does NOT fire if the Wrike API returns HTTP 200 with an empty data array — a silent failure. Add a separate IF node after the Merge node to check 'if task count equals 0, post a no-tasks message' to handle empty responses explicitly.
10

Canvas > Active Toggle (top right) > Execute Workflow (play icon)

Activate and verify the workflow

Click the toggle in the top right of the n8n canvas to activate the workflow. The toggle turns green and the workflow is now live. To verify without waiting until 8:45 AM, click the 'Execute Workflow' button (the play icon) to run it immediately. Check your Slack channel — the standup summary should appear within 15 seconds. Then check the n8n execution log to confirm all nodes returned green status.

  1. 1Click the gray toggle in the top right — it turns green labeled 'Active'
  2. 2Click the play icon to trigger an immediate manual execution
  3. 3Switch to your Slack channel and confirm the message appears
  4. 4Click 'Executions' in the left sidebar of n8n to review the run log
What you should see: The Executions panel shows a green 'Success' badge for the run. Your Slack channel shows the standup message with task names, assignees, and due dates formatted correctly.
Common mistake — Activating a workflow in n8n does not validate your credentials — it just enables the schedule. A misconfigured Bearer token will only surface as an error at the next scheduled run. Always do a manual execution immediately after activating to catch auth issues before the morning run fires.

Scaling Beyond 200+ tasks returned per API call+ Records

If your volume exceeds 200+ tasks returned per API call records, apply these adjustments.

1

Handle Wrike API pagination

Wrike's /tasks endpoint returns a maximum of 100 items per call by default. If your workspace has more than 100 active tasks, add a second HTTP Request node that checks the response for a 'nextPageToken' field and fetches the next page. Chain multiple pages together in the Merge node before passing to the Code node.

2

Scope requests to specific folders

Instead of pulling all active tasks workspace-wide, call '/folders/{folderId}/tasks' for each relevant project folder. This keeps each API response small and avoids hitting the 100-item page limit. Store folder IDs as n8n environment variables so they're easy to update without editing workflow nodes.

3

Add a Wait node between API calls

Wrike enforces a 100-requests-per-minute rate limit per user token. If you're fetching tasks, overdue tasks, contacts, and multiple folder pages, you can hit this limit in a single run. Add a Wait node set to 700ms between each HTTP Request node to stay comfortably under the rate limit.

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 message formatting, want to self-host to avoid per-task execution costs, or need to make multiple chained API calls (tasks + contacts + folders) that would eat Zapier task credits fast. n8n's Code node is genuinely useful here — Wrike doesn't return human-readable assignee names, it returns contact IDs, and resolving those requires a secondary API call and a lookup map that you can't build in Zapier's Formatter or Make's basic modules without awkward workarounds. The one scenario where you'd skip n8n: if your team is non-technical and needs someone other than you to edit the schedule or change channels — n8n's interface is not intuitive for non-builders, and Make would be a better fit there.

Cost

On cost: this workflow runs once per day, making 3 API calls per execution. That's 30 n8n workflow executions per month (3 nodes × ~10 runs if you count manual tests). n8n Cloud's Starter plan costs $20/month and includes 2,500 executions — you'll use roughly 1% of that. Self-hosted n8n is free. Compare that to Zapier: each Zap task counts separately, so 3 API steps × 22 weekday runs = 66 tasks/month. Zapier's free tier caps at 100 tasks/month, so you'd stay free — but add error-handling nodes and you'll push past 100 fast. Make is cheapest at scale: 10,000 operations/month free, and this workflow uses about 66 operations/month. For this specific workflow, cost is not a differentiator — pick the platform your team can maintain.

Tradeoffs

Make handles this use case well with its built-in HTTP module and Array Aggregator — no code required to build the grouped message, just module chaining. Zapier has a Wrike integration with pre-built triggers, which saves setup time, but you can't make conditional secondary API calls without Code by Zapier. Power Automate has no native Wrike connector and would require the same raw HTTP calls as n8n, with worse debugging tools. Pipedream is a strong alternative — its Node.js steps are identical in capability to n8n's Code node, and it has a cleaner UI for chaining async API calls. n8n wins here specifically because the combination of self-hosting (no execution cost ceiling) and a visual canvas that non-developers can at least read makes it the most practical long-term choice for an operations team.

Three things you'll run into after setup. First, Wrike's contact ID problem: the /tasks response gives you IDs like 'KUABCD12' for assignees. The /contacts lookup works, but if a user was deleted from Wrike, their ID returns nothing — your Code node will show a blank name for that person's tasks unless you add a fallback. Second, Slack mrkdwn vs. blocks: the text field in Slack's chat.postMessage supports basic mrkdwn (*bold*, _italic_, <url|label>), but if you want richer formatting (colored sidebars, buttons, section blocks), you need to switch the Slack node to use Block Kit JSON instead of a plain text string — that requires restructuring the Code node output entirely. Third, n8n's Schedule Trigger has no built-in retry on failure. If the Wrike API is down at 8:45 AM, the standup is skipped permanently for that day. There is no catch-up run. For daily standups, this is usually acceptable — but set up the error-output Slack alert so at minimum you know when it fails.

Ideas for what to build next

  • Add a weekly digest variantClone this workflow and change the Schedule Trigger to fire every Monday at 8:00 AM with a wider date window (7 days instead of 48 hours). Post it to a separate #weekly-status channel for leadership visibility without cluttering the daily standup channel.
  • Route summaries to per-team channelsAdd a Switch node after the Code node that checks the Wrike folder/project name and routes each team's tasks to their own Slack channel — #engineering-standup, #design-standup, #marketing-standup. This removes the need for one noisy all-hands channel.
  • Write standup replies back to WrikeBuild a companion workflow that listens for Slack messages in the standup channel (via webhook) and uses the Wrike API to post the team's responses as task comments. This creates a written record in Wrike without asking anyone to update two systems manually.

Related guides

Was this guide helpful?
Slack + Wrike overviewn8n profile →