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

How to Send Asana Task Notifications to Slack with Pipedream

Fires an instant Slack DM or channel message whenever an Asana task is assigned to a team member or its priority changes.

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 live in Slack and miss Asana email notifications or check Asana less than twice a day.

Not ideal for

Teams that need two-way sync — changes made in Slack should not update Asana tasks here.

Sync type

real-time

Use case type

notification

Real-World Example

💡

A 12-person product team at a B2B SaaS company uses this to ping engineers in #eng-tasks the moment a bug ticket is assigned or bumped to High priority in Asana. Before this workflow, engineers checked Asana once in the morning and once after lunch — urgent tasks sat unnoticed for 3-4 hours. Now the Slack message arrives within 10 seconds of the Asana event.

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.

Asana account with permission to manage webhooks on the target project (project admin or workspace admin role required)
Slack workspace where you have permission to add apps and post to the target channel (Slack workspace admin or channel manager)
Pipedream account — free tier supports up to 10,000 events/month which covers most small teams
Asana Personal Access Token or OAuth app credentials to authenticate the Pipedream trigger (generate at app.asana.com/0/my-apps)
Slack bot token with chat:write scope, or use Pipedream's built-in Slack OAuth connection which handles scopes automatically

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Namesteps.trigger.event.resource.name
Assignee Namesteps.trigger.event.resource.assignee.name
Task URLsteps.trigger.event.resource.permalink_url
Change Typesteps.trigger.event.change.field
New Valuesteps.trigger.event.change.new_value
5 optional fields▸ show
Assignee Emailsteps.trigger.event.resource.assignee.email
Priority (Custom Field)steps.trigger.event.resource.custom_fields[n].display_value
Project Namesteps.trigger.event.resource.memberships[0].project.name
Due Datesteps.trigger.event.resource.due_on
Event Timestampsteps.trigger.event.created_at

Step-by-Step Setup

1

pipedream.com > Workflows > New Workflow

Create a new Pipedream workflow

Go to pipedream.com and sign in. Click the blue 'New Workflow' button in the top-right of the dashboard. Give the workflow a name like 'Asana → Slack Task Notifications' so it's easy to find later. You'll land on the workflow canvas with an empty trigger slot at the top.

  1. 1Click 'New Workflow' in the top-right corner
  2. 2Enter the workflow name in the title field at the top of the canvas
  3. 3Click the 'Add a trigger' block to open the trigger selection panel
What you should see: You should see the workflow canvas with an empty trigger block labeled 'Add a trigger' and a grey '+' step block below it.
2

Workflow Canvas > Add a trigger > Asana > Task Updated

Connect Asana as the trigger source

In the trigger selection panel, type 'Asana' in the search box and select it from the list. Pipedream will show you a list of Asana trigger events. Select 'New Task Assigned to Me' or 'Task Updated' depending on whether you want to catch assignments, priority changes, or both. For this workflow, select 'Task Updated' — it fires on both assignment changes and priority changes, which is what you need.

  1. 1Type 'Asana' in the trigger search box
  2. 2Click 'Asana' in the results list
  3. 3Select 'Task Updated' from the event list
  4. 4Click 'Connect Account' and authenticate with your Asana credentials
  5. 5Select the Asana workspace and project you want to monitor from the dropdowns
What you should see: You should see a green 'Connected' badge next to your Asana account name and the project selector should populate with your Asana projects.
Common mistake — The 'Task Updated' trigger fires on ANY field change — due date edits, comment additions, everything. You'll filter to assignments and priority changes in a later step. If you skip the filter, your Slack channel will get a message every time anyone edits any field on any task in the project.
Pipedream
+
click +
search apps
Slack
SL
Slack
Connect Asana as the trigger…
Slack
SL
module added
3

Workflow Canvas > Trigger Step > Generate Test Event

Test the Asana trigger with a real event

Click 'Generate Test Event' in the trigger panel. Pipedream will pull the most recent task update from the connected project. If no recent events exist, go to Asana, assign a task to yourself, then return to Pipedream and click 'Generate Test Event' again. Review the raw JSON payload that appears — you'll use fields from this payload in later steps. Pay attention to 'assignee.gid', 'assignee.name', 'name', 'priority', and 'permalink_url'.

  1. 1Click 'Generate Test Event' in the trigger configuration panel
  2. 2If no events appear, create a test task assignment in Asana and click again
  3. 3Expand the returned JSON to see the full event payload
  4. 4Note the field paths for assignee name, task name, priority, and task URL
What you should see: You should see a JSON object in the 'Event' tab with task fields like 'name', 'assignee.name', 'custom_fields' (where priority lives), and 'permalink_url'.
Common mistake — Priority in Asana is stored as a custom field, not a top-level field. Its path in the payload will look like 'custom_fields[n].display_value' where n is the index of the priority field. This index varies by workspace — inspect your actual payload to find the right path before writing any code.
Pipedream
▶ Deploy & test
executed
Slack
Asana
Asana
🔔 notification
received
4

Workflow Canvas > + > Filter

Add a filter step to catch only assignments and priority changes

Click the '+' button below the trigger step to add a new step. Select 'Filter' from the built-in Pipedream actions. You need to stop the workflow from running when irrelevant fields change. Set the filter condition to check whether the event includes a changed assignee or a changed priority custom field. Use Pipedream's expression editor to reference the trigger output.

  1. 1Click the '+' step button below the Asana trigger
  2. 2Select 'Filter' from the built-in actions list
  3. 3Set Condition 1: steps.trigger.event.change.field equals 'assignee'
  4. 4Click 'OR' to add a second condition
  5. 5Set Condition 2: steps.trigger.event.change.field equals the name of your priority custom field (check your test payload)
What you should see: The Filter step should show two conditions connected by OR. When you click 'Test', Pipedream will either pass the event through or show a 'Workflow ended — filter did not pass' message depending on your test data.
Common mistake — Pipedream's Filter step uses strict equality by default. If Asana sends the change field as 'Assignee' (capital A) in some events and 'assignee' in others, your filter will silently miss events. Use a Node.js Code step instead of Filter if you want case-insensitive matching.
Slack
SL
trigger
filter
Priority
matches criteria?
yes — passes through
no — skipped
Asana
AS
notified
5

Workflow Canvas > + > Run Node.js code

Add a Node.js code step to build the Slack message

Click '+' below the Filter step and select 'Run Node.js code'. This step will read the Asana event data and construct a clean Slack Block Kit message. You'll reference the trigger payload using the 'steps' object. Write the logic to detect whether this is an assignment event or a priority change event, then format the message accordingly. The code in the pro_tip_code section below is ready to paste here.

  1. 1Click the '+' step button below the Filter step
  2. 2Select 'Run Node.js code' from the step list
  3. 3Paste the code from the pro_tip section into the code editor
  4. 4Update the priority custom field index to match what you found in Step 3
  5. 5Click 'Test' to run the code against your test event and verify the output
What you should see: The step's 'Return Value' panel should show a structured object with 'assigneeName', 'taskName', 'taskUrl', 'eventType' ('assigned' or 'priority_changed'), and a formatted Slack message string.
Common mistake — Do not hardcode the priority field index (e.g., custom_fields[2]). If someone adds or reorders custom fields in Asana, the index shifts and your workflow silently reads the wrong field. Use Array.find() to match by field name instead — the code in the pro_tip does this correctly.

Paste this into the Node.js code step between the Filter step and the Slack step. It detects whether the event is an assignment or priority change, resolves the priority custom field by name (not index), formats a Slack Block Kit message, and exports clean variables for the downstream Slack step to reference.

JavaScript — Code Step// Pipedream Node.js code step: Build Slack notification from Asana task event
▸ Show code
// Pipedream Node.js code step: Build Slack notification from Asana task event
// Place this step AFTER the Filter step and BEFORE the Slack Send Message step
export default defineComponent({

... expand to see full code

// Pipedream Node.js code step: Build Slack notification from Asana task event
// Place this step AFTER the Filter step and BEFORE the Slack Send Message step

export default defineComponent({
  async run({ steps, $ }) {
    const event = steps.trigger.event;
    const resource = event.resource || {};
    const change = event.change || {};

    // Determine event type
    const changedField = change.field || '';
    const isAssignment = changedField === 'assignee';
    // Priority is a custom field — match by name, not index
    const PRIORITY_FIELD_NAME = 'Priority'; // Update this to match your Asana custom field name

    const priorityField = (resource.custom_fields || []).find(
      (f) => f.name === PRIORITY_FIELD_NAME
    );
    const priorityGid = priorityField?.gid || '';
    const isPriorityChange = changedField === priorityGid;

    if (!isAssignment && !isPriorityChange) {
      $.flow.exit('Event is not an assignment or priority change — skipping');
    }

    // Extract core fields
    const taskName = resource.name || 'Unnamed Task';
    const taskUrl = resource.permalink_url || '';
    const assigneeName = resource.assignee?.name || 'Unassigned';
    const assigneeEmail = resource.assignee?.email || null;
    const projectName = resource.memberships?.[0]?.project?.name || 'Unknown Project';
    const dueOn = resource.due_on
      ? new Date(resource.due_on).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })
      : 'No due date';
    const priorityDisplay = priorityField?.display_value || 'None';

    // Build message text and Slack Block Kit payload
    const eventLabel = isAssignment
      ? `📋 *New task assigned to ${assigneeName}*`
      : `🔴 *Priority changed to ${priorityDisplay} — ${assigneeName}*`;

    const blocks = [
      {
        type: 'section',
        text: {
          type: 'mrkdwn',
          text: eventLabel,
        },
      },
      {
        type: 'section',
        fields: [
          { type: 'mrkdwn', text: `*Task:*\n${taskName}` },
          { type: 'mrkdwn', text: `*Project:*\n${projectName}` },
          { type: 'mrkdwn', text: `*Priority:*\n${priorityDisplay}` },
          { type: 'mrkdwn', text: `*Due:*\n${dueOn}` },
        ],
      },
      {
        type: 'actions',
        elements: [
          {
            type: 'button',
            text: { type: 'plain_text', text: 'Open in Asana' },
            url: taskUrl,
          },
        ],
      },
    ];

    return {
      eventType: isAssignment ? 'assigned' : 'priority_changed',
      assigneeName,
      assigneeEmail,
      taskName,
      taskUrl,
      projectName,
      priorityDisplay,
      dueOn,
      message: `${eventLabel}\n*Task:* ${taskName}\n*Project:* ${projectName}\n*Priority:* ${priorityDisplay}\n*Due:* ${dueOn}\n<${taskUrl}|Open in Asana>`,
      blocks: JSON.stringify(blocks),
    };
  },
});
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
6

Workflow Canvas > + > Slack > Send Message to a Public Channel

Connect Slack and configure the Send Message action

Click '+' below the code step and search for 'Slack'. Select the 'Send Message to a Public Channel' action (or 'Send a Direct Message' if you want to DM the assignee instead of posting to a channel). Connect your Slack workspace via the 'Connect Account' button — this uses OAuth and takes about 30 seconds. Select the destination channel from the dropdown, or set it dynamically using the assignee's Slack user ID if you're routing to DMs.

  1. 1Click '+' and search for 'Slack'
  2. 2Select 'Send Message to a Public Channel' or 'Send a Direct Message'
  3. 3Click 'Connect Account' and authorize Pipedream in the Slack OAuth flow
  4. 4Select the target channel (e.g., #task-notifications) from the Channel dropdown
  5. 5In the 'Message Text' field, reference steps.build_message.message from your code step
What you should see: You should see a green 'Connected' badge next to your Slack workspace name and the channel dropdown should list your Slack channels.
Common mistake — The Slack OAuth scope 'chat:write' lets Pipedream post as the bot. If you want the message to show a specific username or icon, you need to also enable 'chat:write.customize' in your Slack app settings — standard OAuth flow does not include this by default.
7

Workflow Canvas > Slack Step > Message Text

Map Asana fields to the Slack message

In the Slack step's Message Text field, reference the output from your Node.js code step. Use Pipedream's expression syntax to pull in the formatted message. If you want to use Slack Block Kit for richer formatting (buttons, sections, bold text), switch the Message field to 'Blocks' mode and paste your Block Kit JSON — the pro_tip code generates this for you. Test the step to confirm the message renders correctly in Slack.

  1. 1Click inside the 'Message Text' field in the Slack step
  2. 2Type '{{' to open the expression picker
  3. 3Select 'steps.build_message.$return_value.message' from the dropdown
  4. 4Optionally switch to 'Blocks' mode and paste the Block Kit JSON from your code step
  5. 5Click 'Test' to send a real message to your Slack channel
What you should see: A Slack message should appear in your test channel within 5 seconds showing the task name, assignee name, event type, and a link to the Asana task.
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.
Slack fields
text
user
channel
ts
thread_ts
available as variables:
1.props.text
1.props.user
1.props.channel
1.props.ts
1.props.thread_ts
8

Workflow Canvas > + (before Slack step) > Run Node.js code

Handle DM routing by resolving Slack user from Asana assignee

If you want to DM the assignee directly instead of posting to a channel, you need to match the Asana assignee email to a Slack user ID. Add a second Node.js code step before the Slack step. Call the Slack 'users.lookupByEmail' API using the assignee's email from the Asana payload. Store the returned Slack user ID and pass it to the Slack 'Send a Direct Message' action as the recipient. Skip this step entirely if you're posting to a channel.

  1. 1Click '+' between your message-building code step and the Slack step
  2. 2Select 'Run Node.js code'
  3. 3Write a fetch call to https://slack.com/api/users.lookupByEmail with the Asana assignee email
  4. 4Export the Slack user ID as the return value
  5. 5In the Slack 'Send a Direct Message' step, set the recipient to steps.lookup_slack_user.$return_value.userId
What you should see: The code step's return value should contain a Slack user ID like 'U04ABC123'. The Slack DM step should show this ID in the 'User' field.
Common mistake — If the Asana assignee's email doesn't match any Slack workspace member, the lookup returns an error and the workflow fails. Add a try/catch in the lookup code and fall back to posting in a default channel rather than letting the entire workflow error out.
9

Workflow Canvas > Settings (right panel) > Error Handling

Add error handling with Pipedream's on_error step

In the workflow settings panel on the right side, click 'Error Handling'. Set the workflow to send you an email or Slack message if any step throws an uncaught error. This protects you from silent failures where Asana fires the webhook but the Slack message never sends. Alternatively, wrap your code steps in try/catch blocks and use $.flow.exit() to stop cleanly with a log message when expected errors occur (like missing assignee data).

  1. 1Click the gear icon or 'Settings' tab in the right panel of the workflow canvas
  2. 2Scroll to 'Error Handling'
  3. 3Enable 'Send error notifications' and enter your email or a Slack webhook URL
  4. 4Set the retry policy to 1 retry with a 30-second delay
  5. 5Click 'Save Settings'
What you should see: The Settings panel should show 'Error notifications: On' with your email or webhook destination listed.
10

Workflow Canvas > Deploy (top-right button)

Deploy and verify the live webhook

Click the green 'Deploy' button in the top-right of the workflow canvas. Pipedream will activate the workflow and display the live webhook URL for the Asana trigger. Copy this URL — you do not need to paste it anywhere manually because Pipedream's Asana trigger manages the webhook subscription automatically. Go to Asana and assign a real task to a team member. The Slack message should appear within 10 seconds.

  1. 1Click the green 'Deploy' button in the top-right corner
  2. 2Wait for the deployment confirmation banner
  3. 3Go to Asana and assign a task in the monitored project
  4. 4Check the target Slack channel or DM for the notification
  5. 5Return to Pipedream and check the 'Events' tab to confirm the event was received and processed
What you should see: The 'Events' tab in Pipedream should show a green checkmark next to the test event with all steps passing. The Slack message should be visible in the channel within 10 seconds of the Asana task assignment.
Common mistake — Asana's webhook subscription can take up to 60 seconds to become active after deployment. If your first live test fires immediately after deploy and nothing appears in Slack, wait 60 seconds and try again before assuming something is broken.

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 even one developer who can read JavaScript. The webhook is instant — Asana fires, Pipedream receives, Slack posts, all in under 15 seconds. The Node.js code step lets you handle Asana's quirky custom field structure (priority is a GID, not a string) without fighting a no-code mapper. The other scenario where Pipedream is the right call: if you want to route notifications to different Slack channels based on project, or DM specific users — that routing logic needs real code, and Pipedream gives you a clean place to write it. If nobody on your team codes and you just want one channel with basic messages, Zapier's 10-minute setup beats Pipedream's 45-minute setup on this use case.

Cost

Pipedream's free tier gives you 10,000 events per month. This workflow fires once per qualifying Asana event (assignment or priority change). A 15-person team with active projects might generate 200-400 qualifying events per month — well inside the free tier. At 500+ events/month (large team, many projects), you stay free. At 10,000+ events/month, you're on the $19/month Basic plan. Make's free tier handles 1,000 operations/month but counts each step as an operation — your 4-step workflow uses 4,000 operations per 1,000 Asana events, so Make's free tier runs out at roughly 250 events/month. For this specific workflow at any real-team volume, Pipedream is cheaper.

Tradeoffs

Zapier has a ready-made 'Task Assigned' trigger for Asana that's genuinely easier to configure than Pipedream's — it abstracts the webhook handshake entirely. But Zapier polls every 1-15 minutes depending on your plan, which means a task assignment could sit unnoticed for 15 minutes before the Slack message fires. For a notification workflow, that latency defeats the purpose. Make has a similar polling problem on its lower plans. n8n's Asana webhook node works well and is self-hostable (useful for strict data residency requirements), but you're managing infrastructure. Power Automate has an Asana connector but it's shallow — it doesn't expose the change.field data needed to distinguish assignments from other updates, so you'd have to fetch the full task on every event and diff it yourself. Pipedream wins on latency plus flexibility for this exact use case.

Three things you'll hit after a week in production. First, Asana's webhook sends the change.field for custom fields as a GID (a 16-digit number like '1357924680135792'), not the field name. If you hardcode 'priority' in your filter, it will never match — you'll get zero priority-change notifications and spend an afternoon debugging. Read the raw event payload carefully before writing any filter logic. Second, Slack's chat:write scope lets you post to channels the bot has been invited to — but if someone creates a new project-specific channel later and forgets to invite the bot, notifications silently fail with no error surfacing in Pipedream. Build a fallback channel into the code. Third, Asana webhooks occasionally go silent after a deploy or a Pipedream maintenance window. There's no built-in reconnection — you need to re-register the webhook manually in the Asana trigger step. Set a calendar reminder to check the Events tab weekly for the first month.

Ideas for what to build next

  • Add a daily digest instead of per-event pingsReplace the instant webhook trigger with a scheduled Pipedream workflow that runs at 9am, queries Asana for tasks assigned in the last 24 hours, and posts a single digest message to #standup. Reduces Slack noise for high-volume teams.
  • Route notifications by project to different Slack channelsAdd a lookup table in your code step that maps Asana project GIDs to Slack channel IDs. Instead of one hardcoded channel, each project's task notifications land in the right team's channel automatically.
  • Add an overdue task reminder workflowBuild a second Pipedream workflow on a daily schedule that queries Asana for tasks past their due date and still assigned, then sends a DM to each assignee with their overdue list. Pairs directly with this assignment notification workflow.

Related guides

Was this guide helpful?
Slack + Asana overviewPipedream profile →