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

How to Send Asana Milestone Updates to Slack with Power Automate

Automatically posts a Slack channel message whenever an Asana task is marked complete or a deadline is within 24 hours, so teams get status updates without anyone writing them manually.

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

Best for

Microsoft 365 teams who already use Power Automate and need milestone alerts pushed to Slack without leaving their existing toolchain.

Not ideal for

Teams that need sub-minute latency — Power Automate polls Asana every 1-5 minutes, so truly instant alerts require a webhook-capable tool like Make or n8n.

Sync type

scheduled

Use case type

notification

Real-World Example

💡

A 22-person product team at a SaaS company tracks sprint milestones in Asana and needs their #product-updates Slack channel to reflect task completions without a PM writing standup summaries. Before this flow, the PM spent 20-30 minutes each morning pulling completed tasks from Asana and pasting summaries into Slack. With the flow running, Slack gets a formatted message within 5 minutes of any milestone task being marked complete — no manual work involved.

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 Power Automate

Copy the pre-built Power Automate blueprint and paste it straight into Power Automate. 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 Member or Admin access to the projects you want to monitor — guest-level access will not expose all tasks to the connector
Slack account with permission to add apps to the workspace — Workspace Owner or Admin approval may be required in managed workspaces
Microsoft 365 account with Power Automate access — a Microsoft 365 Business Basic plan or higher is sufficient for this flow
Asana tasks that follow a consistent naming convention (e.g. '[MILESTONE]' prefix) or are organized in a dedicated milestone section for accurate filtering
The target Slack channel already created and, if private, the Power Automate bot manually invited to that channel before the flow runs

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Namename
Project Nameprojects[0].name
Due Datedue_on
Task Completion Statuscompleted
4 optional fields▸ show
Assignee Nameassignee.name
Task URL (Permalink)permalink_url
Notes / Descriptionnotes
Completed At Timestampcompleted_at

Step-by-Step Setup

1

make.powerautomate.com > Create > Automated cloud flow

Create a new Automated Cloud Flow

Go to make.powerautomate.com and sign in with your Microsoft 365 account. Click 'Create' in the left sidebar, then select 'Automated cloud flow' from the options. Name the flow something like 'Asana Milestone → Slack Alert'. You'll be prompted to choose a trigger — search for 'Asana' in the trigger search box. Power Automate will use polling to check Asana on a schedule.

  1. 1Click 'Create' in the left sidebar
  2. 2Select 'Automated cloud flow'
  3. 3Enter a flow name such as 'Asana Milestone to Slack'
  4. 4In the trigger search box, type 'Asana'
  5. 5Select 'When a task is completed' from the Asana trigger list
What you should see: You should see the Asana trigger card appear as the first block in your flow canvas with a 'Sign in' or 'Connection' prompt visible.
Common mistake — Power Automate does not support Asana webhooks natively. The 'When a task is completed' trigger polls Asana approximately every 1-5 minutes — plan accordingly if your team expects instant alerts.
2

Asana trigger card > Sign in > Asana OAuth popup

Connect your Asana account

Click 'Sign in' on the Asana trigger card. A browser popup will open asking you to authorize Power Automate to access Asana. Log in with the Asana account that has access to the projects you want to monitor. After authorizing, the popup closes and you'll return to the flow canvas with the connection active.

  1. 1Click 'Sign in' on the Asana trigger card
  2. 2Log in with your Asana credentials in the popup
  3. 3Click 'Allow' to grant Power Automate read access
  4. 4Confirm the popup closes and returns you to the flow canvas
What you should see: The Asana trigger card should now show your account email and a dropdown to select a Workspace.
Common mistake — Authorize with the Asana account that owns or is a member of the target projects. If you authorize with a guest account, you'll only see projects explicitly shared with that guest — milestone tasks in other projects won't trigger.
Power Automate settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Power Automate
popup window
Connected
green checkmark
3

Asana trigger card > Workspace dropdown > Project dropdown

Configure the Asana trigger parameters

With the connection established, the trigger card shows dropdowns for Workspace and Project. Select the Asana Workspace first, then pick the specific Project containing your milestones. If you want to monitor all projects in a workspace, leave Project blank — but be aware every task completion in the workspace will fire the flow. For milestone-only monitoring, it's better to use a dedicated Asana project or tag.

  1. 1Click the Workspace dropdown and select your organization workspace
  2. 2Click the Project dropdown and select the milestone-tracking project
  3. 3Leave the 'Section' field blank unless you want to scope to a specific board column
  4. 4Click 'Show advanced options' to confirm no additional filters are hidden
What you should see: The trigger card should display your chosen workspace name and project name without any red validation errors.
Power Automate
+
click +
search apps
Slack
SL
Slack
Configure the Asana trigger …
Slack
SL
module added
4

Flow canvas > + New step > Control > Condition

Add a condition to filter milestone tasks only

Not every completed task is a milestone. Click '+ New step', search for 'Condition', and add the 'Condition' control action. Set the left value to the dynamic content field 'Task Name' from the Asana trigger. Set the operator to 'contains', and enter a keyword your team uses to tag milestones — for example, '[MILESTONE]' or 'M:'. Only tasks whose names match this pattern will proceed to send a Slack message.

  1. 1Click '+ New step'
  2. 2Search for 'Condition' and select it under 'Control'
  3. 3Click the left value field and select 'Name' from Asana dynamic content
  4. 4Set the operator dropdown to 'contains'
  5. 5Type your milestone keyword in the right value field, e.g. '[MILESTONE]'
What you should see: The Condition card splits into a 'Yes' branch and a 'No' branch. All subsequent Slack steps go inside the 'Yes' branch.
Common mistake — If your Asana project doesn't use a naming convention for milestones, use Asana's 'Tags' field instead — but note that the Power Automate Asana connector does not surface tags as dynamic content natively. In that case, use a task section filter in Step 3 instead.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Asana
AS
notified
5

Yes branch > + Add an action > Data Operation > Parse JSON

Add a Parse JSON step to extract task details

Inside the 'Yes' branch, click '+ Add an action'. Search for 'Parse JSON' and select it from the Data Operations group. In the Content field, insert the full body output from the Asana trigger using dynamic content. Click 'Generate from sample' and paste a sample Asana task JSON payload to auto-generate the schema. This lets you pull clean fields like due date, assignee name, and project name into your Slack message without writing expressions from scratch.

  1. 1Click '+ Add an action' inside the 'Yes' branch
  2. 2Search for 'Parse JSON' and select 'Data Operation - Parse JSON'
  3. 3In the Content field, click the dynamic content picker and select the Asana trigger body output
  4. 4Click 'Generate from sample'
  5. 5Paste a sample Asana task JSON and click 'Done'
What you should see: The Parse JSON card shows a valid schema with fields like 'name', 'due_on', 'assignee', and 'projects' listed as parsed outputs available in dynamic content.
Common mistake — Asana's API returns 'due_on' as a date string in YYYY-MM-DD format, not a datetime. If you try to use it directly in a formatDateTime() expression expecting ISO 8601, it will fail. Append 'T00:00:00Z' to the string before formatting.
6

Yes branch > + Add an action > Data Operation > Compose

Add an expression to format the due date

Before building the Slack message, format the due date into something readable. Click '+ Add an action', search for 'Compose', and add a 'Data Operation - Compose' action. In the Inputs field, enter the expression shown in the pro tip section below. This converts '2024-03-15' into 'March 15, 2024'. Reference this Compose output in your Slack message body so stakeholders see a human-readable date, not a raw string.

  1. 1Click '+ Add an action' inside the 'Yes' branch after Parse JSON
  2. 2Search for 'Compose' and select 'Data Operation - Compose'
  3. 3Click the Inputs field and switch to the expression editor (the 'Expression' tab in dynamic content)
  4. 4Enter the formatDateTime expression referencing the due_on field from Parse JSON
  5. 5Click 'OK' to save the expression
What you should see: The Compose card shows your expression without errors. In test mode, the output should display a formatted date string like 'March 15, 2024'.
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.
7

Yes branch > + Add an action > Slack > Post message (V2)

Connect your Slack account

Click '+ Add an action' after the Compose step. Search for 'Slack' and select 'Post message (V2)' — do not use the older 'Post message' action, as it lacks block formatting support. Click 'Sign in' on the Slack action card. A browser popup will open asking you to authorize Power Automate to post to your Slack workspace. Select the correct workspace from the dropdown if you belong to multiple.

  1. 1Click '+ Add an action' after the Compose step
  2. 2Search for 'Slack' and select 'Post message (V2)'
  3. 3Click 'Sign in' on the Slack action card
  4. 4Authorize Power Automate in the Slack OAuth popup
  5. 5Select your Slack workspace when prompted
What you should see: The Slack action card shows your workspace name and reveals the Channel and Message fields for configuration.
Common mistake — The Slack bot created by Power Automate must be invited to private channels before it can post. If you target a private channel, type '/invite @Power Automate' in that channel first or the action will fail with a 'channel_not_found' error.
8

Slack action card > Channel field > Message Text field

Configure the Slack message content

In the 'Channel' field, type or select the channel name where milestone updates should go — for example, #project-updates. In the Message Text field, build the update using dynamic content from the Asana trigger and your Compose step. A good format: '✅ *[MILESTONE COMPLETE]* Task: {Task Name} | Project: {Project Name} | Due: {Compose output} | Assigned to: {Assignee Name}'. This gives readers the full context in a single message line.

  1. 1Click the Channel dropdown and select your target Slack channel
  2. 2Click into the Message Text field
  3. 3Type your message prefix, e.g. '✅ *[MILESTONE COMPLETE]*'
  4. 4Use dynamic content to insert Task Name, Project Name, formatted due date (Compose output), and Assignee Name
  5. 5Click 'Show advanced options' and set 'Bot name' to something like 'Asana Updates' for clarity in Slack
What you should see: The Slack action card shows a populated Message Text field with a mix of static text and dynamic content tokens. No red validation errors should appear.
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

make.powerautomate.com > Create > Scheduled cloud flow

Add a deadline-approaching branch with a Scheduled trigger (optional)

The current flow handles completed tasks. For deadline reminders, you need a separate Scheduled cloud flow. Go back to 'Create > Scheduled cloud flow' and set it to run daily at 8:00 AM. Add an Asana action 'List tasks' filtered to tasks due within the next 24 hours. Loop through results with an 'Apply to each' action and post a Slack reminder message for each approaching deadline using the same Slack 'Post message (V2)' action.

  1. 1Click 'Create' and choose 'Scheduled cloud flow'
  2. 2Set recurrence to every 1 day at 8:00 AM in your local timezone
  3. 3Add 'Asana - List tasks' action and filter by due date using today's date plus 1 day
  4. 4Add 'Apply to each' control over the task list output
  5. 5Inside the loop, add 'Slack - Post message (V2)' with a reminder-formatted message
What you should see: A second flow appears in 'My flows' set to run on schedule. When tested, it should return any Asana tasks due within 24 hours and post one Slack message per task.
Common mistake — Power Automate's Asana 'List tasks' action does not support filtering by relative due dates natively. You must use an expression to compute tomorrow's date and pass it as the due_before parameter. Use: formatDateTime(addDays(utcNow(), 1), 'yyyy-MM-dd').
10

Flow canvas > Test (top right) > Manually > Trigger now

Test the flow with a live Asana task

Save both flows. In the automated flow, click 'Test' in the top right corner and select 'Manually' to watch a live run. Go to Asana, find a task in your configured project with '[MILESTONE]' in the name, and mark it complete. Switch back to Power Automate — the test panel should show the trigger firing within 1-5 minutes. Check your Slack channel for the formatted message.

  1. 1Click 'Save' in the top right of the flow canvas
  2. 2Click 'Test' and select 'Manually'
  3. 3Open Asana in another tab and mark a milestone task complete
  4. 4Return to Power Automate and watch the test panel for trigger activity
  5. 5Check the target Slack channel for the message
What you should see: The test panel shows each step with a green checkmark. The Slack channel displays a formatted message with the correct task name, project, due date, and assignee within 5 minutes.
Common mistake — If the test shows the trigger fired but the Condition step went to the 'No' branch, your task name doesn't match the milestone keyword you set in Step 4. Check for typos or extra spaces in the Asana task name.
Power Automate
▶ Test flow
executed
Slack
Asana
Asana
🔔 notification
received
11

My flows > [Flow Name] > 28-day run history

Turn on both flows and verify run history

With testing confirmed, make sure both flows are toggled to 'On' — check the toggle at the top of each flow's detail page. Wait 24 hours and then open 'My flows', click each flow, and review the '28-day run history' panel. Confirm runs are completing without errors. Set up email notifications for flow failures by going to the flow's detail page and enabling 'Send me an email when this flow fails'.

  1. 1Navigate to 'My flows' in the left sidebar
  2. 2Click each flow and confirm the toggle at the top shows 'On'
  3. 3Check '28-day run history' for green success icons
  4. 4Click the ellipsis (…) menu on the flow card and select 'Edit' > check error notification settings
  5. 5Enable 'Send me an email when this flow fails' for both flows
What you should see: Both flows appear in 'My flows' with a green 'On' status badge. The run history panel shows successful runs with no red failure entries.

Paste these expressions into the Compose action (Step 6) and the Slack message field (Step 8) in Power Automate. The first block formats the Asana due date safely. The second block builds a conditional Slack message that handles unassigned tasks and missing due dates without breaking the flow.

JavaScript — Code Step// Expression 1: Safe due date formatting (paste into Compose action Inputs field)
▸ Show code
// Expression 1: Safe due date formatting (paste into Compose action Inputs field)
// Handles the date-only string Asana returns and formats it for humans
formatDateTime(

... expand to see full code

// Expression 1: Safe due date formatting (paste into Compose action Inputs field)
// Handles the date-only string Asana returns and formats it for humans
formatDateTime(
  concat(
    coalesce(body('Parse_JSON')?['due_on'], '1970-01-01'),
    'T00:00:00Z'
  ),
  'MMMM dd, yyyy'
)

// Expression 2: Full Slack message body (paste into Slack Post message V2 > Message Text)
// Handles null assignee and null due date gracefully
concat(
  '✅ *[MILESTONE COMPLETE]* ',
  'Task: ', body('Parse_JSON')?['name'],
  ' | Project: ', coalesce(body('Parse_JSON')?['projects']?[0]?['name'], 'Unknown Project'),
  ' | Due: ', outputs('Compose'),
  ' | Assigned to: ', coalesce(body('Parse_JSON')?['assignee']?['name'], 'Unassigned'),
  ' | <', body('Parse_JSON')?['permalink_url'], '|View in Asana>'
)

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 Power Automate for this if your team is already inside the Microsoft 365 ecosystem and managing automation through a central IT or ops function. The Asana and Slack connectors are pre-built, the OAuth flow takes under 3 minutes, and you can hand the flow off to a non-technical PM to maintain. It also fits well if you need the milestone log in SharePoint or Teams alongside Slack — Power Automate connects all three in a single flow with no extra cost. The one scenario where you'd skip it: if your team needs alerts in under 60 seconds. Power Automate polls Asana — you're looking at 1-5 minute delays on every trigger.

Cost

The cost math is straightforward. This flow uses 2-4 actions per run (Parse JSON, Condition, Compose, Slack message). At 100 milestone completions per month, that's roughly 400 action executions. Power Automate's Microsoft 365 plan includes 6,000 runs per month for free. You'll hit the free tier limit only if you're logging 1,500+ milestone completions monthly, which is unlikely for any single project. Make's free tier gives you 1,000 operations per month — at even moderate volume you'd need Make's $9/month Core plan. For most teams, Power Automate is free for this use case where Make is not.

Tradeoffs

Make handles Asana webhooks natively, which means alerts fire in under 10 seconds versus Power Automate's 1-5 minute polling delay — that's the single biggest functional difference. Zapier also has an Asana 'Task Completed' trigger, but it polls every 15 minutes on the free tier and every 2 minutes on paid, making it slower than Power Automate for the same cost. n8n gives you full control over the Asana API and lets you filter by custom fields, tags, or any field the REST API exposes — something the Power Automate connector doesn't support without writing raw HTTP requests. Pipedream can subscribe to Asana webhooks directly using the Asana Events API and process them with JavaScript in milliseconds. Power Automate is still the right call if your org has M365 licenses already paid for, your team can't manage self-hosted n8n, and 5-minute latency is acceptable.

Three things you'll hit after setup. First, the Asana connection in Power Automate silently stops working after the OAuth token expires — there's no error email by default, your flow just starts returning 401s in the run history. Check the Connections panel monthly and re-authorize if the status shows anything other than green. Second, Asana's 'List tasks' action in the scheduled deadline-reminder flow does not support server-side date filtering as cleanly as the REST API does — you may get back more tasks than expected and need to filter client-side with a Condition inside the loop. Third, Slack's 'Post message (V2)' connector in Power Automate does not support Block Kit formatting — you get plain text or basic markdown only. If your team expects rich interactive cards with buttons, you'll need to call the Slack API directly via an HTTP action with a raw JSON payload.

Ideas for what to build next

  • Add a daily digest instead of per-task messagesModify the scheduled flow to collect all milestones completed that day using 'Apply to each', build a single formatted summary string, and post one Slack message per day instead of one per task — reduces channel noise for high-volume projects.
  • Route updates to project-specific Slack channelsAdd a Switch control after the Condition step that maps each Asana project name to a different Slack channel — for example, 'Q2 Roadmap' goes to #roadmap-updates and 'Growth Initiative' goes to #growth-team, keeping updates scoped to the right audience.
  • Log milestone completions to a SharePoint list for reportingAdd a 'SharePoint - Create item' action in parallel with the Slack message step to write each milestone completion to a SharePoint list, giving leadership a searchable, timestamped record of all milestone activity across projects.

Related guides

Was this guide helpful?
Slack + Asana overviewPower Automate profile →