

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-timeUse case type
notificationReal-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.
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 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.
Optional
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Task ID | taskId | |
| Task Title | title | |
| Task Status | status | |
| Assignee IDs | responsibleIds | |
| Project / Parent Folder Name | parentIds | |
| Importance | importance | |
2 optional fields▸ show
| Completion Date | completedDate |
| Permalink / Task URL |
Step-by-Step Setup
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.
- 1Click 'New Workflow' in the top-right
- 2Click the pencil icon next to 'My Workflow' and rename it
- 3Click 'Add Trigger' in the center of the canvas
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.
- 1Type 'Wrike' in the trigger search box
- 2Select 'Wrike' from the app list
- 3Choose 'Task Status Changed' as the trigger event
- 4Click 'Connect Account' and complete the Wrike OAuth flow
- 5Click 'Save and continue'
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.
- 1Copy the webhook URL from the Pipedream trigger step
- 2Open Wrike in a new tab and go to Account Settings
- 3Navigate to Apps & Integrations > Webhooks
- 4Click 'Create Webhook' and paste the URL
- 5Set the scope to your target project folder and save
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.
- 1Complete a test task in Wrike
- 2Click 'Refresh' in the Pipedream trigger step
- 3Expand the event payload in the inspection panel
- 4Locate and note the path to task title, assignee, and project name
taskId, title, status, assigneeIds, and projectIds populated with real values from your test task.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.
- 1Click '+' below the trigger step
- 2Select 'Filter' from Pipedream built-ins
- 3Set condition:
steps.trigger.event.statusequalsCompleted - 4Add second condition:
steps.trigger.event.importanceequalshigh(or your milestone custom field) - 5Set filter behavior to 'End workflow execution' if conditions are not met
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'.
- 1Click '+' below the filter step
- 2Select 'Run Node.js code'
- 3Paste the resolver code from the Pro Tip section below
- 4Click 'Test' to confirm the step returns a name string
{ assigneeName: 'Sarah Chen' } — a readable name pulled from the Wrike users endpoint.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);
}
});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}.
- 1Click '+' to add another Node.js step
- 2Build the Block Kit JSON object using the template in the Pro Tip section
- 3Interpolate task title, assignee name, project name, and task URL
- 4Export the payload as
$.export('slackPayload', blocks) - 5Test the step and confirm the output is valid JSON
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}}.
- 1Click '+' and search for 'Slack'
- 2Select 'Send Message (Advanced)' to access the Blocks field
- 3Click 'Connect Account' and authorize your Slack workspace
- 4Set Channel to your target Slack channel name or ID
- 5Set Blocks to reference your formatted payload from the previous step
- 6Set Text to the plain fallback string
channel: {{channel}}
ts: {{ts}}
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.
- 1Add a Node.js step after the Slack send step
- 2Wrap logic in try/catch
- 3Check
steps.send_slack_message.$return_value.okequalstrue - 4Call
console.error()with the Slack error code if false
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.
- 1Click 'Deploy' in the top-right corner
- 2Confirm the workflow status badge reads 'Active'
- 3Complete a real milestone task in Wrike
- 4Verify the Slack message appears in the target channel
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 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.
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.
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 Slack — Build 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 Sheet — Extend 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 type — Add 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
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