

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
scheduledUse case type
notificationReal-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.
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 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.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Task Name | name | |
| Project Name | projects[0].name | |
| Due Date | due_on | |
| Task Completion Status | completed | |
4 optional fields▸ show
| Assignee Name | assignee.name |
| Task URL (Permalink) | permalink_url |
| Notes / Description | notes |
| Completed At Timestamp | completed_at |
Step-by-Step Setup
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.
- 1Click 'Create' in the left sidebar
- 2Select 'Automated cloud flow'
- 3Enter a flow name such as 'Asana Milestone to Slack'
- 4In the trigger search box, type 'Asana'
- 5Select 'When a task is completed' from the Asana trigger list
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.
- 1Click 'Sign in' on the Asana trigger card
- 2Log in with your Asana credentials in the popup
- 3Click 'Allow' to grant Power Automate read access
- 4Confirm the popup closes and returns you to the flow canvas
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.
- 1Click the Workspace dropdown and select your organization workspace
- 2Click the Project dropdown and select the milestone-tracking project
- 3Leave the 'Section' field blank unless you want to scope to a specific board column
- 4Click 'Show advanced options' to confirm no additional filters are hidden
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.
- 1Click '+ New step'
- 2Search for 'Condition' and select it under 'Control'
- 3Click the left value field and select 'Name' from Asana dynamic content
- 4Set the operator dropdown to 'contains'
- 5Type your milestone keyword in the right value field, e.g. '[MILESTONE]'
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.
- 1Click '+ Add an action' inside the 'Yes' branch
- 2Search for 'Parse JSON' and select 'Data Operation - Parse JSON'
- 3In the Content field, click the dynamic content picker and select the Asana trigger body output
- 4Click 'Generate from sample'
- 5Paste a sample Asana task JSON and click 'Done'
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.
- 1Click '+ Add an action' inside the 'Yes' branch after Parse JSON
- 2Search for 'Compose' and select 'Data Operation - Compose'
- 3Click the Inputs field and switch to the expression editor (the 'Expression' tab in dynamic content)
- 4Enter the formatDateTime expression referencing the due_on field from Parse JSON
- 5Click 'OK' to save the expression
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.
- 1Click '+ Add an action' after the Compose step
- 2Search for 'Slack' and select 'Post message (V2)'
- 3Click 'Sign in' on the Slack action card
- 4Authorize Power Automate in the Slack OAuth popup
- 5Select your Slack workspace when prompted
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.
- 1Click the Channel dropdown and select your target Slack channel
- 2Click into the Message Text field
- 3Type your message prefix, e.g. '✅ *[MILESTONE COMPLETE]*'
- 4Use dynamic content to insert Task Name, Project Name, formatted due date (Compose output), and Assignee Name
- 5Click 'Show advanced options' and set 'Bot name' to something like 'Asana Updates' for clarity in Slack
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.
- 1Click 'Create' and choose 'Scheduled cloud flow'
- 2Set recurrence to every 1 day at 8:00 AM in your local timezone
- 3Add 'Asana - List tasks' action and filter by due date using today's date plus 1 day
- 4Add 'Apply to each' control over the task list output
- 5Inside the loop, add 'Slack - Post message (V2)' with a reminder-formatted message
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.
- 1Click 'Save' in the top right of the flow canvas
- 2Click 'Test' and select 'Manually'
- 3Open Asana in another tab and mark a milestone task complete
- 4Return to Power Automate and watch the test panel for trigger activity
- 5Check the target Slack channel for the message
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'.
- 1Navigate to 'My flows' in the left sidebar
- 2Click each flow and confirm the toggle at the top shows 'On'
- 3Check '28-day run history' for green success icons
- 4Click the ellipsis (…) menu on the flow card and select 'Edit' > check error notification settings
- 5Enable 'Send me an email when this flow fails' for both flows
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
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.
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.
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 messages — Modify 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 channels — Add 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 reporting — Add 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
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