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

How to Create Wrike Tasks from Slack Messages with Pipedream

When a Slack message is starred or reacted to with a specific emoji, Pipedream instantly creates a Wrike task with the message text, sender, and a parsed 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 that live in Slack and lose action items in long threads before they ever reach a project board.

Not ideal for

Teams that need two-way sync — if Wrike task updates should post back to Slack, use Make's bidirectional scenario approach instead.

Sync type

real-time

Use case type

routing

Real-World Example

💡

A 22-person product team at a B2B SaaS company uses this to convert messages flagged with a :task: emoji in #product-feedback into Wrike tasks assigned to the product owner. Before this, action items buried in Slack threads were re-discovered days later — or not at all. Now every flagged message becomes a tracked Wrike task within 5 seconds of the emoji reaction.

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.

Slack account with admin access or permission to install apps — required to authorize the reactions:read and channels:history OAuth scopes
Wrike account with permission to create tasks in at least one project folder — a member role is sufficient, admin is not required
Pipedream account — free tier works for up to 10,000 invocations/month
Your Wrike target folder ID — find it in the browser URL when viewing the project in Wrike (alphanumeric string in the path)
A team agreement on the trigger emoji and message format (e.g. @assign:name due:YYYY-MM-DD task description) — without this, the parsing step has nothing reliable to extract

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Titletitle
Task Statusstatus
Folder (Project) ID
5 optional fields▸ show
Assignee User IDassignees
Due Datedates.due
Task Descriptiondescription
Slack Message Permalinkdescription
Task Typetype

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 the workflow canvas with an empty trigger slot at the top. Give the workflow a name like 'Slack Emoji → Wrike Task' using the pencil icon at the top — this makes it easier to find later when you have multiple workflows running.

  1. 1Sign in at pipedream.com
  2. 2Click 'New Workflow' in the top-right
  3. 3Click the pencil icon next to the default workflow name
  4. 4Type 'Slack Emoji → Wrike Task' and press Enter
What you should see: You should see an empty workflow canvas with an 'Add Trigger' prompt at the top and your new workflow name displayed.
2

Workflow Canvas > Add Trigger > Slack > New Reaction Added to a Message

Add the Slack trigger: New Reaction Added

Click 'Add Trigger' and search for 'Slack'. Select the Slack app, then choose the trigger 'New Reaction Added to a Message'. This trigger fires instantly via Slack's Events API webhook — not polling — so task creation happens within 2-3 seconds of the emoji being added. Connect your Slack account via the 'Connect Account' button, which will open an OAuth window.

  1. 1Click 'Add Trigger'
  2. 2Type 'Slack' in the search box and select the Slack app
  3. 3Choose 'New Reaction Added to a Message' from the trigger list
  4. 4Click 'Connect Account' and complete the Slack OAuth flow
  5. 5Set the 'Reaction' field to 'white_check_mark' (or whichever emoji your team has agreed on)
What you should see: You should see a green 'Connected' badge next to your Slack account and a 'Test Trigger' button become active.
Common mistake — The Slack OAuth scope required is 'reactions:read'. If your Slack workspace is on a restrictive Enterprise Grid plan, a Slack admin may need to pre-approve the Pipedream app before OAuth completes.
Pipedream
+
click +
search apps
Slack
SL
Slack
Add the Slack trigger: New R…
Slack
SL
module added
3

Workflow Canvas > Trigger Step > Test Trigger

Test the Slack trigger

Click 'Test Trigger'. Pipedream will instruct you to go to Slack and add your chosen reaction to any message. Do it now — open Slack in another tab, react to a message with the emoji you configured, then come back. Pipedream will capture the event payload within a few seconds and display it in the trigger output panel on the right side of the canvas.

  1. 1Click 'Test Trigger'
  2. 2Switch to Slack and add the configured emoji reaction to any message
  3. 3Return to Pipedream and wait for the event to appear in the right panel
  4. 4Expand the payload to confirm fields like 'reaction', 'item.channel', and 'item.ts' are present
What you should see: You should see a JSON payload with fields including 'reaction', 'user', 'item.channel', 'item.ts', and 'event_ts' in the trigger output panel.
Common mistake — If the payload shows only 'item.ts' but no message text, that's expected — the trigger gives you the message timestamp, not the content. You'll fetch the full message text in the next step.
Pipedream
▶ Deploy & test
executed
Slack
Wrike
Wrike
🔔 notification
received
4

Workflow Canvas > + Add Step > Run Node.js code

Fetch the full Slack message text

Add a Node.js code step after the trigger. The trigger payload only contains metadata — you need to call Slack's conversations.history API to retrieve the actual message text using the channel ID and timestamp from the trigger. Use Pipedream's built-in Slack app authentication so you don't have to manage tokens manually. This step outputs the message text, author name, and channel name for use in the Wrike task.

  1. 1Click the '+' button below the trigger step
  2. 2Select 'Run Node.js code'
  3. 3Paste the code from the Pro Tip section below into the code editor
  4. 4Reference the trigger outputs using 'steps.trigger.event.item.channel' and 'steps.trigger.event.item.ts'
What you should see: After clicking 'Test', the step output should show a 'messageText' field with the full Slack message content and a 'userName' field with the sender's display name.
Common mistake — Slack's conversations.history API requires the 'channels:history' scope. If you get a 'missing_scope' error here, your Slack app connection is missing this permission — go to Connected Accounts > Slack > Reconnect and ensure this scope is included.
5

Workflow Canvas > + Add Step > Run Node.js code

Parse the message for task details

Add a second Node.js code step to extract structured data from the message text. Your team should agree on a format — for example: '@assign:jane.doe due:2024-03-15 Fix login button on mobile'. This step uses a regex to pull out the assignee, due date, and task title from the raw message text. If no assignee or due date is found, defaults are applied so the task still gets created.

  1. 1Click '+' below the fetch step
  2. 2Select 'Run Node.js code'
  3. 3Write or paste your parsing logic targeting 'steps.fetch_message.$return_value.messageText'
  4. 4Export the parsed fields: title, assigneeEmail, dueDate
What you should see: The step output panel should show 'title', 'assigneeEmail', and 'dueDate' as separate fields with values extracted from the message.
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.
6

Workflow Canvas > + Add Step > Run Node.js code

Look up the Wrike user ID by email

Wrike tasks require an assignee user ID, not an email address. Add another Node.js code step that calls Wrike's /contacts API endpoint to resolve the email from the previous step into a Wrike user ID. This is a required lookup — Wrike's task creation endpoint will reject a raw email string. Cache the result in the step output so the next step can reference it directly.

  1. 1Click '+' to add a new code step
  2. 2Call GET https://www.wrike.com/api/v4/contacts?me=false using your Wrike API token
  3. 3Filter the response array for a contact where 'profiles[0].email' matches the parsed assignee email
  4. 4Return the matched contact's 'id' field as 'wrikeUserId'
What you should see: The step output should show 'wrikeUserId' as a string like 'KUAB3CSDJ4I11' — this is the internal Wrike ID you'll pass to the task creation step.
Common mistake — If no matching contact is found, the step will return null for wrikeUserId. Handle this with a fallback — either skip assignment or assign to a default project owner. Letting it pass as null will cause Wrike's API to return a 400 error in the next step.
7

Workflow Canvas > + Add Step > Wrike > Connect Account

Connect your Wrike account

Add a Wrike app step by clicking '+' and searching for 'Wrike'. Before configuring the action, connect your Wrike account. Click 'Connect Account' in the Wrike step and complete the OAuth flow — Wrike will ask you to authorize access to your workspace. You only do this once; Pipedream stores the credential in Connected Accounts for reuse.

  1. 1Click '+' and search for 'Wrike'
  2. 2Select 'Wrike' from the app list
  3. 3Click 'Connect Account'
  4. 4Complete the Wrike OAuth authorization in the popup window
What you should see: You should see a green 'Connected' badge next to Wrike and your workspace name displayed in the account selector.
Common mistake — Wrike OAuth tokens expire after 18 days of inactivity. If the workflow sits unused for more than two weeks, reconnect the account before expecting it to work again — Pipedream does not auto-refresh Wrike tokens without activity.
Pipedream settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Pipedream
popup window
Connected
green checkmark
8

Workflow Canvas > + Add Step > Run Node.js code

Create the Wrike task

Use a Node.js code step (rather than the pre-built Wrike action) to call POST /tasks on Wrike's v4 API. This gives you full control over the payload including custom fields, folder targeting, and assignee IDs. Set the task title from the parsed message, the due date from the parsed date field, and the assignee from the user ID lookup. Set the status to 'Active' so it appears immediately on the board.

  1. 1Click '+' and select 'Run Node.js code'
  2. 2Use the Wrike connected account's OAuth token via the $ helper or hardcode via environment variable
  3. 3POST to https://www.wrike.com/api/v4/folders/{folderId}/tasks with your task payload
  4. 4Include 'title', 'assignees', 'dates.due', and 'status' in the request body
What you should see: The step output should show a Wrike task object with an 'id' field (e.g. 'IEABCDEFGAB3CDHI') and 'status: Active', confirming the task was created.
Common mistake — Wrike's task creation endpoint requires a folder (project) ID in the URL path — not in the body. If you pass the folder ID in the body, the API returns a 400 with no useful error message. Get your folder ID from Wrike's URL when viewing the target project: it's the alphanumeric string after /open/.
9

Workflow Canvas > + Add Step > Run Node.js code

Post a confirmation back to Slack

Add a final Node.js code step that posts a reply in the same Slack thread using chat.postMessage. Include the Wrike task URL so the team member can click straight through. This closes the loop — the person who flagged the message gets confirmation the task was captured, and the thread stays as a record. Use 'thread_ts' set to the original message timestamp so the reply stays threaded.

  1. 1Click '+' and add a final code step
  2. 2Call Slack's chat.postMessage with 'channel' and 'thread_ts' from the trigger payload
  3. 3Set the message text to include the Wrike task title and task permalink
  4. 4Use your Slack connected account's bot token from the $ auth helper
What you should see: Within 3 seconds of the test run, you should see a threaded reply in Slack that says something like '✅ Task created in Wrike: Fix login button on mobile — [link]'.
10

Workflow Canvas > Deploy > Runs tab

Deploy and test end-to-end

Click 'Deploy' in the top-right corner of the Pipedream canvas. The workflow is now live and listening. Go to Slack, find any message, and add your trigger emoji. Watch the Pipedream execution log in real time under the 'Runs' tab — you'll see each step turn green as it completes. Confirm the task appears in Wrike and the threaded Slack reply arrives.

  1. 1Click 'Deploy' in the top-right corner
  2. 2Switch to Slack and react to a real message with the trigger emoji
  3. 3Return to Pipedream and click the 'Runs' tab
  4. 4Click on the latest run to inspect each step's input and output
  5. 5Open Wrike and confirm the task exists in the target folder
What you should see: The Runs tab should show a completed run with all steps green. The Wrike task should appear in your project folder with the correct title, assignee, and due date.
Common mistake — Pipedream's free tier limits you to 10,000 invocations/month and steps time out at 30 seconds. If your Wrike user ID lookup is slow (>5s), add a timeout handler or the step will fail silently on the free tier.

This code handles four things in one step: fetches the full Slack message text via conversations.history, parses the assignee email and due date using regex, resolves the Wrike user ID via the contacts API, and creates the Wrike task — with error handling at each stage. Paste this into a single Node.js code step after the Slack trigger, replacing the four separate code steps if you want a more compact workflow.

JavaScript — Code Stepimport axios from 'axios';
▸ Show code
import axios from 'axios';
export default defineComponent({
  props: {

... expand to see full code

import axios from 'axios';

export default defineComponent({
  props: {
    slack: {
      type: 'app',
      app: 'slack',
    },
    wrike: {
      type: 'app',
      app: 'wrike',
    },
  },
  async run({ steps, $ }) {
    const WRIKE_FOLDER_ID = process.env.WRIKE_FOLDER_ID; // Set in Pipedream env vars
    const channel = steps.trigger.event.item.channel;
    const messageTs = steps.trigger.event.item.ts;

    // Step 1: Fetch the full Slack message text
    const historyRes = await axios({
      method: 'GET',
      url: 'https://slack.com/api/conversations.history',
      headers: { Authorization: `Bearer ${this.slack.$auth.oauth_access_token}` },
      params: { channel, latest: messageTs, limit: 1, inclusive: true },
      timeout: 10000,
    });

    if (!historyRes.data.ok) {
      throw new Error(`Slack API error: ${historyRes.data.error}`);
    }

    const message = historyRes.data.messages[0];
    if (!message) throw new Error('Message not found in Slack history');
    const rawText = message.text;

    // Step 2: Parse assignee email and due date from message
    const assigneeMatch = rawText.match(/@assign:([\w.+-]+@[\w.-]+\.[a-z]{2,})/i);
    const dueDateMatch = rawText.match(/due:(\d{4}-\d{2}-\d{2})/);
    const assigneeEmail = assigneeMatch ? assigneeMatch[1] : null;
    const dueDate = dueDateMatch ? dueDateMatch[1] : null;
    const taskTitle = rawText
      .replace(/@assign:[\w.+-]+@[\w.-]+\.[a-z]{2,}/gi, '')
      .replace(/due:\d{4}-\d{2}-\d{2}/g, '')
      .trim();

    // Step 3: Resolve Wrike user ID from email (skip if no assignee)
    let wrikeUserId = null;
    if (assigneeEmail) {
      const contactsRes = await axios({
        method: 'GET',
        url: 'https://www.wrike.com/api/v4/contacts',
        headers: { Authorization: `Bearer ${this.wrike.$auth.oauth_access_token}` },
        timeout: 15000,
      });
      const contacts = contactsRes.data.data || [];
      const match = contacts.find(
        (c) => c.profiles && c.profiles.some((p) => p.email === assigneeEmail)
      );
      if (match) {
        wrikeUserId = match.id;
      } else {
        console.log(`No Wrike user found for email: ${assigneeEmail} — creating unassigned`);
      }
    }

    // Step 4: Build Wrike task payload
    const taskPayload = {
      title: taskTitle || 'Untitled task from Slack',
      status: 'Active',
      description: `From Slack channel ${channel} | Original message: ${rawText}`,
      ...(wrikeUserId && { assignees: [wrikeUserId] }),
      ...(dueDate && { dates: { type: 'Planned', due: dueDate } }),
    };

    // Step 5: Create the Wrike task
    const taskRes = await axios({
      method: 'POST',
      url: `https://www.wrike.com/api/v4/folders/${WRIKE_FOLDER_ID}/tasks`,
      headers: {
        Authorization: `Bearer ${this.wrike.$auth.oauth_access_token}`,
        'Content-Type': 'application/json',
      },
      data: taskPayload,
      timeout: 15000,
    });

    const createdTask = taskRes.data.data[0];
    console.log(`Wrike task created: ${createdTask.id} — ${createdTask.title}`);

    // Step 6: Post confirmation back to Slack thread
    await axios({
      method: 'POST',
      url: 'https://slack.com/api/chat.postMessage',
      headers: { Authorization: `Bearer ${this.slack.$auth.oauth_access_token}` },
      data: {
        channel,
        thread_ts: messageTs,
        text: `✅ Wrike task created: *${createdTask.title}* — <${createdTask.permalink}|Open in Wrike>`,
      },
    });

    return {
      taskId: createdTask.id,
      taskTitle: createdTask.title,
      assigneeEmail,
      dueDate,
      wrikeUserId,
    };
  },
});

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 includes at least one person comfortable reading JavaScript. The reason: both the Slack message fetch and the Wrike user ID lookup require API calls that no-code tools handle awkwardly. Zapier would need two separate Zap steps with a Code by Zapier block in the middle; Make would need an HTTP module chain with JSON parsing. In Pipedream, you write one async function that does all of it, with full control over error handling and timeouts. The one scenario where you'd skip Pipedream: if your team has zero coding comfort and needs this set up and maintained by non-technical people. In that case, Make's Slack and Wrike HTTP modules plus a text parser module get you 80% of the way there with a visual interface.

Cost

Pipedream pricing for this workflow is straightforward. Each run consumes roughly 3-5 compute credits depending on how long the Wrike contacts lookup takes. At 200 emoji-flagged messages per month, you're burning 600-1,000 credits monthly. Pipedream's free tier includes 10,000 credits/month, so this workflow costs nothing until you hit serious volume — above ~3,000 triggers/month you'll want the $19/month Basic plan. Zapier prices per task, not compute time: the same 200 triggers/month with a 4-step Zap costs 800 tasks, which hits the $19.99/month Starter tier and then some. Pipedream is cheaper by roughly $20/month at that volume.

Tradeoffs

Make handles the emoji-to-task pattern slightly better for non-coders — its 'Watch Events' Slack module and built-in text parser module cover the trigger and parsing without code. n8n's Slack node supports reactions natively and its Function node gives you the same Node.js flexibility as Pipedream, but you're self-hosting or paying for n8n Cloud ($20/month), and the Wrike integration requires an HTTP Request node since there's no native Wrike node in n8n. Power Automate has a Wrike connector in preview, but its Slack integration is limited and reactions-based triggers aren't supported natively — you'd need a webhook workaround. Pipedream wins here because it has instant webhook processing (sub-3-second latency), native Slack and Wrike app integrations, and lets you write the parsing logic in the same place as the API calls — no context switching between modules.

Three things you'll hit after setup. First: Slack's conversations.history endpoint paginates, and if you call it without 'limit=1' and 'inclusive=true', you'll get the wrong message or an empty result. Second: Wrike's contacts API returns all workspace members in one call, but large Enterprise workspaces with 500+ users can make this call slow enough to approach Pipedream's 30-second step timeout — cache results with $.store after the first lookup. Third: if your team uses Slack's message formatting (bold, links, code blocks), the raw message text will contain mrkdwn syntax characters like *bold* and <https://url|link text>. Strip these before setting the Wrike task title, or your tasks will show up with angle brackets and asterisks in the name.

Ideas for what to build next

  • Two-way sync: post Wrike status updates back to SlackAdd a second Pipedream workflow that listens for Wrike task status changes via webhook and posts a message to the original Slack thread when the task is marked complete.
  • Route tasks to different Wrike projects by channelAdd a lookup table in your code step that maps Slack channel IDs to different Wrike folder IDs — so #engineering tasks go to the Engineering project and #marketing tasks go to Campaigns.
  • Daily digest: unassigned Wrike tasks created from SlackBuild a second scheduled Pipedream workflow that queries Wrike for tasks created by this automation with no assignee and posts a daily summary to #ops or a team manager channel.

Related guides

Was this guide helpful?
Slack + Wrike overviewPipedream profile →