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

How to Celebrate Wrike Milestones in Slack with Pipedream

When a Wrike task marked as a milestone is completed, Pipedream fires a webhook, formats a celebration message with project and assignee details, and posts it to a designated Slack channel instantly.

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

Best for

Engineering or product teams who use Wrike milestones to mark phase completions and want automatic Slack shoutouts without anyone remembering to post manually.

Not ideal for

Teams that mark every task as a milestone — you'll flood the channel; filter by project or milestone title prefix first.

Sync type

real-time

Use case type

notification

Real-World Example

💡

A 22-person product team at a B2B SaaS company tracks quarterly release phases in Wrike using milestone tasks. Before this workflow, the project manager copy-pasted completion updates into #product-updates by hand — often hours late. Now, the moment a milestone is marked complete in Wrike, a formatted Slack message fires within 10 seconds, tagging the assignee and linking back to the Wrike task.

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 Pipedream

Copy the pre-built Pipedream blueprint and paste it straight into Pipedream. 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 Full User account with permission to create webhooks (Account Admin or Owner role required)
Slack workspace admin access or permission to install OAuth apps with chat:write and chat:write.public scopes
Pipedream account (free tier works for under ~100 milestone events/month)
Wrike tasks designated as milestones — either via the 'importance: high' field or a custom field your team uses to flag milestones

Optional

A dedicated Slack channel for milestone announcements (e.g. #project-wins) already created before setup

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task IDtaskId
Task Titletitle
Task Statusstatus
Assignee IDsresponsibleIds
Project / Parent Folder NameparentIds
Importanceimportance
2 optional fields▸ show
Completion DatecompletedDate
Permalink / Task URL

Step-by-Step Setup

1

pipedream.com > Workflows > New Workflow

Create a new Pipedream workflow

Go to pipedream.com and sign in. Click 'New Workflow' in the top-right corner of the dashboard. You'll land on a blank canvas with a prompt to select a trigger. Name your workflow something like 'Wrike Milestone → Slack Celebration' using the pencil icon at the top so it's easy to find later.

  1. 1Click 'New Workflow' in the top-right
  2. 2Click the pencil icon next to 'My Workflow' and rename it
  3. 3Click 'Add Trigger' in the center of the canvas
What you should see: You should see an empty workflow canvas with a single 'Add Trigger' prompt in the center.
2

Trigger > Search Apps > Wrike > Task Status Changed

Set the trigger to Wrike — Task Completed

In the trigger search box, type 'Wrike' and select it from the app list. Choose the trigger event 'Task Status Changed' — this is the correct trigger because Wrike's API emits a webhook event when task status is updated, which covers milestone completion. You'll connect your Wrike account via Connected Accounts; click 'Connect Account' and authorize with OAuth.

  1. 1Type 'Wrike' in the trigger search box
  2. 2Select 'Wrike' from the app list
  3. 3Choose 'Task Status Changed' as the trigger event
  4. 4Click 'Connect Account' and complete the Wrike OAuth flow
  5. 5Click 'Save and continue'
What you should see: You should see a green 'Connected' badge next to your Wrike account name and a Pipedream-generated webhook URL displayed below.
Common mistake — Wrike's OAuth scopes must include 'tasks' and 'webhooks'. If you connect with a restricted Wrike account (e.g. a collaborator role), the webhook registration will fail silently — use a Full User account.
Pipedream
+
click +
search apps
Slack
SL
Slack
Set the trigger to Wrike — T…
Slack
SL
module added
3

Wrike > Account Settings > Apps & Integrations > Webhooks > Create Webhook

Register the webhook inside Wrike

Pipedream generates a unique webhook URL for your trigger. Copy that URL. In a separate tab, open Wrike and navigate to Apps & Integrations > Webhooks. Click 'Create Webhook', paste the Pipedream URL, and set the event filter to 'Task status changed'. Optionally scope it to a specific Folder or Project to avoid noise from unrelated tasks.

  1. 1Copy the webhook URL from the Pipedream trigger step
  2. 2Open Wrike in a new tab and go to Account Settings
  3. 3Navigate to Apps & Integrations > Webhooks
  4. 4Click 'Create Webhook' and paste the URL
  5. 5Set the scope to your target project folder and save
What you should see: Wrike shows your new webhook in the list with a green active indicator. Back in Pipedream, click 'Generate Test Event' or manually complete a test task in Wrike to push a sample payload.
Common mistake — Wrike webhooks are account-level by default. If you don't scope to a specific folder, every task status change across your entire Wrike account will hit this workflow — including non-milestone tasks.
4

Pipedream > Trigger Step > Event Inspection Panel

Test the trigger and inspect the payload

In Wrike, open a test task and change its status to 'Completed'. Return to Pipedream and click 'Refresh' on the trigger step. You should see a raw JSON payload appear. Expand it and find the fields you'll need: task ID, task title, project ID, assignee ID, and completion date. Note the exact key paths — you'll reference these in the next step.

  1. 1Complete a test task in Wrike
  2. 2Click 'Refresh' in the Pipedream trigger step
  3. 3Expand the event payload in the inspection panel
  4. 4Locate and note the path to task title, assignee, and project name
What you should see: You should see a JSON object with keys like taskId, title, status, assigneeIds, and projectIds populated with real values from your test task.
Common mistake — The `assigneeIds` field returns an array of Wrike user IDs — not names. You'll need a separate API call in Step 6 to resolve these to readable names before posting to Slack.
Pipedream
▶ Deploy & test
executed
Slack
Wrike
Wrike
🔔 notification
received
5

Workflow Canvas > + > Built-in > Filter

Add a filter step to check milestone status

Click '+' below the trigger to add a new step. Choose 'Filter' from the built-in Pipedream helpers. Configure it to continue only when steps.trigger.event.status === 'Completed' AND the task has a milestone flag. In Wrike's API payload, milestones are identified by importance: 'high' or by a custom field — check your test payload to confirm which field your team uses to designate milestones.

  1. 1Click '+' below the trigger step
  2. 2Select 'Filter' from Pipedream built-ins
  3. 3Set condition: steps.trigger.event.status equals Completed
  4. 4Add second condition: steps.trigger.event.importance equals high (or your milestone custom field)
  5. 5Set filter behavior to 'End workflow execution' if conditions are not met
What you should see: The filter step shows 'Passed' in green when you replay the test event with a completed milestone task, and 'Filtered' in gray for regular completed tasks.
Common mistake — Filters are the most common place setups break. Double-check the field name and value exactly match what your app sends — a single capital letter difference will block everything.
Slack
SL
trigger
filter
Status
matches criteria?
yes — passes through
no — skipped
Wrike
WR
notified
6

Workflow Canvas > + > Node.js Code Step

Resolve assignee name via Wrike API

Add a new step and select 'Node.js code'. This step calls the Wrike API to fetch the user's display name from their user ID. Use steps.trigger.event.responsibleIds[0] as the ID to look up. Store the result as assigneeName for use in the Slack message. This prevents the celebration message from showing a raw ID like KUAK7HHHH instead of 'Sarah Chen'.

  1. 1Click '+' below the filter step
  2. 2Select 'Run Node.js code'
  3. 3Paste the resolver code from the Pro Tip section below
  4. 4Click 'Test' to confirm the step returns a name string
What you should see: The step output shows { assigneeName: 'Sarah Chen' } — a readable name pulled from the Wrike users endpoint.
Common mistake — Wrike rate limits the API to 100 requests/minute per token. If multiple milestones complete simultaneously, requests may queue. This is rarely a problem in practice but worth knowing if you have a large release-day batch.

This single Node.js step handles three things at once: resolves the Wrike assignee ID to a display name, builds the full Slack Block Kit payload, and exports both for downstream steps. Paste this into a single Node.js code step between your filter and the Slack send step. Replace `process.env.WRIKE_API_TOKEN` with your Pipedream environment variable name.

JavaScript — Code Stepimport axios from 'axios';
▸ Show code
import axios from 'axios';
export default defineComponent({
  async run({ steps, $ }) {

... expand to see full code

import axios from 'axios';

export default defineComponent({
  async run({ steps, $ }) {
    const event = steps.trigger.event;
    const taskId = event.taskId;
    const taskTitle = event.title;
    const completedDate = event.completedDate
      ? new Date(event.completedDate).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })
      : 'Today';
    const wrikeTaskUrl = `https://www.wrike.com/open.htm?id=${taskId}`;

    // Resolve assignee ID to display name
    let assigneeName = 'The Team';
    const assigneeId = event.responsibleIds?.[0];
    if (assigneeId) {
      try {
        const userRes = await axios.get(
          `https://www.wrike.com/api/v4/users/${assigneeId}`,
          { headers: { Authorization: `Bearer ${process.env.WRIKE_API_TOKEN}` } }
        );
        const profile = userRes.data?.data?.[0];
        assigneeName = profile ? `${profile.firstName} ${profile.lastName}` : 'The Team';
      } catch (err) {
        console.error(`Failed to resolve assignee ${assigneeId}: ${err.message}`);
      }
    }

    // Resolve parent folder name
    let projectName = 'Unknown Project';
    const folderId = event.parentIds?.[0];
    if (folderId) {
      try {
        const folderRes = await axios.get(
          `https://www.wrike.com/api/v4/folders/${folderId}`,
          { headers: { Authorization: `Bearer ${process.env.WRIKE_API_TOKEN}` } }
        );
        projectName = folderRes.data?.data?.[0]?.title || 'Unknown Project';
      } catch (err) {
        console.error(`Failed to resolve folder ${folderId}: ${err.message}`);
      }
    }

    // Build Slack Block Kit payload
    const slackPayload = {
      text: `🎉 Milestone complete: ${taskTitle}`,
      blocks: [
        {
          type: 'header',
          text: { type: 'plain_text', text: '🎉 Milestone Achieved!', emoji: true }
        },
        {
          type: 'section',
          text: {
            type: 'mrkdwn',
            text: `*${taskTitle}* is done!\n👤 Completed by: ${assigneeName}\n📁 Project: ${projectName}\n📅 ${completedDate}`
          }
        },
        {
          type: 'actions',
          elements: [
            {
              type: 'button',
              text: { type: 'plain_text', text: 'View in Wrike', emoji: true },
              url: wrikeTaskUrl,
              style: 'primary'
            }
          ]
        }
      ]
    };

    $.export('assigneeName', assigneeName);
    $.export('projectName', projectName);
    $.export('slackPayload', slackPayload);
  }
});
7

Workflow Canvas > + > Node.js Code Step

Format the Slack celebration message

Add another Node.js code step to build the Slack Block Kit payload. Use Block Kit instead of plain text — it renders better on desktop and mobile, supports emoji headers, and lets you embed the direct Wrike task link as a button. Pull steps.trigger.event.title, steps.resolve_assignee.assigneeName, and construct the Wrike task URL as https://www.wrike.com/open.htm?id=${steps.trigger.event.taskId}.

  1. 1Click '+' to add another Node.js step
  2. 2Build the Block Kit JSON object using the template in the Pro Tip section
  3. 3Interpolate task title, assignee name, project name, and task URL
  4. 4Export the payload as $.export('slackPayload', blocks)
  5. 5Test the step and confirm the output is valid JSON
What you should see: The step output shows a complete Block Kit JSON object with a header block, section block with task details, and a button linking to the Wrike task.
Common mistake — Block Kit messages do not render in Slack's mobile notification preview — only the fallback `text` field shows there. Always set a plain-text `text` field alongside your blocks or mobile users will see a blank notification.
8

Workflow Canvas > + > Slack > Send Message

Connect Slack and post to the channel

Add a new step and search for 'Slack'. Select the action 'Send Message'. Connect your Slack workspace via Connected Accounts — this requires the chat:write and chat:write.public OAuth scopes. Set the Channel field to your target channel (e.g. #project-wins). In the Blocks field, reference {{steps.format_message.slackPayload}} and set the Text field to a plain fallback like 🎉 Milestone completed: {{steps.trigger.event.title}}.

  1. 1Click '+' and search for 'Slack'
  2. 2Select 'Send Message (Advanced)' to access the Blocks field
  3. 3Click 'Connect Account' and authorize your Slack workspace
  4. 4Set Channel to your target Slack channel name or ID
  5. 5Set Blocks to reference your formatted payload from the previous step
  6. 6Set Text to the plain fallback string
What you should see: After clicking 'Test', you should see a real message appear in your Slack channel within 5 seconds with the full Block Kit layout visible.
Common mistake — Pipedream's Slack integration requires the bot to be manually invited to private channels. If posting to a private channel, open Slack, go to the channel, and type `/invite @Pipedream` before testing.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
9

Workflow Canvas > + > Node.js Code Step

Add error handling for failed deliveries

Add a final Node.js step with a try/catch that checks the Slack API response for ok: false. If Slack returns an error (e.g. channel_not_found or not_in_channel), use $.flow.exit() to stop cleanly and log the error with console.error(). This prevents the workflow from silently failing and gives you visibility in Pipedream's event logs.

  1. 1Add a Node.js step after the Slack send step
  2. 2Wrap logic in try/catch
  3. 3Check steps.send_slack_message.$return_value.ok equals true
  4. 4Call console.error() with the Slack error code if false
What you should see: In Pipedream's event inspector, failed Slack deliveries now show a red step with the specific Slack error code logged, instead of appearing as a green success.
10

Pipedream Workflow Canvas > Deploy Button (top-right)

Deploy and set workflow to Active

Click 'Deploy' in the top-right corner of the Pipedream canvas. The workflow status changes from 'Development' to 'Active'. From this point, every qualifying Wrike milestone completion will trigger the full workflow in production. Run one final end-to-end test by completing a real milestone in Wrike and confirming the Slack message appears within 10 seconds.

  1. 1Click 'Deploy' in the top-right corner
  2. 2Confirm the workflow status badge reads 'Active'
  3. 3Complete a real milestone task in Wrike
  4. 4Verify the Slack message appears in the target channel
What you should see: The workflow card on your Pipedream dashboard shows 'Active' in green. Your Slack channel receives a properly formatted celebration message within 10 seconds of the Wrike milestone being completed.
Common mistake — Pipedream free-tier workflows pause after 30 days of inactivity. If your team hits a quiet patch with no milestones, the workflow may auto-pause. Set a calendar reminder to check status monthly, or upgrade to a paid plan.

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 Pipedream for this if your team has a developer who can spend 30 minutes on setup and wants real sub-10-second delivery with no polling lag. Pipedream's instant webhook processing means the Slack message fires the moment Wrike sends the event — no 1-5 minute polling delay like you'd get with Zapier's standard plans. The second reason to pick Pipedream here is the Node.js code step, which is the cleanest way to handle the required Wrike API call to resolve user IDs to names before posting. If your team has zero coding comfort, use Zapier instead — the setup is slower and it costs more, but you won't need to write a line of code.

Cost

Pipedream pricing for this workflow is straightforward. Each milestone completion triggers one workflow run consuming roughly 3-5 credits (trigger + filter + two API calls + Slack post). On Pipedream's free tier you get 10,000 credits/month, which covers about 2,000-3,000 milestone events before you pay anything. At $19/month (Basic plan) you get 100,000 credits — enough for any realistic project team. Zapier by comparison charges $29/month for multi-step zaps and caps you at 2,000 tasks/month on that tier. For the same volume, Pipedream is cheaper by roughly $10-15/month once you're past the free tier.

Tradeoffs

Make handles the Wrike-to-Slack connection with a native Wrike module and a built-in JSON parser, which means you can resolve field values visually without writing code. That's genuinely easier for non-developers. Zapier has a direct 'Wrike: Task Completed' trigger that works without webhook setup, saving you the manual Wrike webhook registration step — a real time saver if you're not comfortable with API configuration. n8n gives you a self-hosted option if your company has data residency requirements that prevent sending milestone data through third-party cloud services. Power Automate connects well if your team is already in Microsoft 365, but its Wrike connector is community-built and hasn't been updated in over a year, which is a real reliability risk. Pipedream wins here because the combination of instant webhooks and writable Node.js code handles the user ID resolution cleanly, and the credit-based pricing is the most cost-effective at realistic milestone volumes.

Three things you'll hit after setup. First, Wrike's completedDate field returns UTC timestamps — if your team is distributed across timezones, the date displayed in Slack may show yesterday's date for team members in UTC+8 or later. Fix this by converting to the project owner's local timezone in the formatting step. Second, if a Wrike task is marked complete and then immediately reopened by someone (common when a reviewer rejects the completion), the webhook fires again and posts a second celebration message. You'll want the deduplication logic mentioned in troubleshooting to catch this. Third, Wrike's API rate limit of 100 requests/minute per token is shared across all integrations using that token — if you also have Wrike connected to a reporting tool or time-tracker using the same OAuth token, heavy usage periods can cause intermittent 429 errors on the user lookup call.

Ideas for what to build next

  • Add a weekly milestone digest to SlackBuild a second scheduled Pipedream workflow that queries the Wrike API every Friday at 4pm, collects all milestones completed that week, and posts a digest summary to a leadership Slack channel.
  • Log milestone completions to a Google SheetExtend this workflow with a Google Sheets step that appends each milestone — task name, assignee, project, and date — to a running log. Gives you a historical record for retrospectives and reporting.
  • Post to multiple channels based on project typeAdd a conditional routing step in Node.js that checks the Wrike project name and posts to different Slack channels — engineering milestones to #eng-wins, design milestones to #design-wins — instead of a single catch-all channel.

Related guides

Was this guide helpful?
Slack + Wrike overviewPipedream profile →