

How to Sync Asana Sprints to Slack with Power Automate
Polls Asana for sprint project changes and posts sprint start, completion, and blocker announcements to designated Slack channels automatically.
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 already on Microsoft 365 who want sprint status updates in Slack without manual standups or copy-paste updates.
Not ideal for
Teams that need sub-minute Slack alerts — Power Automate polls Asana every 1-5 minutes, so if real-time is critical, use Make with an Asana webhook instead.
Sync type
scheduledUse case type
notificationReal-World Example
A 22-person product team at a SaaS company runs two-week sprints in Asana and communicates in Slack. Before this automation, the project manager manually posted sprint kickoff messages, blocker callouts, and completion summaries to three different Slack channels — taking 20-30 minutes per sprint event. Now Power Automate detects section changes and task completions in Asana every 3 minutes and posts formatted summaries to #sprint-updates, #eng-blockers, and #team-capacity with zero manual effort.
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.
Optional
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Task Name | name | |
| Task Completion Status | completed | |
| Section Name | memberships[0].section.name | |
| Task GID | gid | |
| Slack Channel (Sprint Updates) | ||
| Slack Channel (Blockers) | ||
| Message Timestamp | ||
3 optional fields▸ show
| Assignee Name | assignee.name |
| Due Date | due_on |
| Blocked Custom Field | custom_fields[?(@.name=='Blocked')].display_value |
Step-by-Step Setup
make.powerautomate.com > My flows > + New flow > Scheduled cloud flow
Create a new Scheduled cloud flow
Go to make.powerautomate.com and sign in. In the left sidebar, click 'My flows', then click '+ New flow' at the top. Select 'Scheduled cloud flow' from the dropdown — this is the right choice because Asana's Power Automate connector does not support push-based triggers for section or task changes. Name the flow 'Asana Sprint Monitor' and set the recurrence to every 3 minutes.
- 1Click 'My flows' in the left sidebar
- 2Click '+ New flow' at the top right
- 3Select 'Scheduled cloud flow'
- 4Enter flow name: 'Asana Sprint Monitor'
- 5Set interval to '3' and frequency to 'Minute'
- 6Click 'Create'
Flow canvas > + New step > Search 'Asana' > Get tasks in a project
Connect your Asana account
Click '+ New step' on the canvas, then type 'Asana' in the search bar. Select the Asana connector and choose the action 'Get tasks in a project'. When prompted, click 'Sign in' and authenticate with the Asana account that has access to the sprint project. Power Automate stores this as a named Connection you can reuse across flows.
- 1Click '+ New step'
- 2Type 'Asana' in the connector search bar
- 3Select the 'Asana' connector
- 4Choose action 'Get tasks in a project'
- 5Click 'Sign in' in the connection prompt
- 6Authorize with your Asana credentials in the popup window
Flow canvas > Get tasks in a project > Project dropdown > opt_fields
Select the sprint project and configure task fields
In the 'Get tasks in a project' action, click the 'Project' dropdown and select your active sprint project. Set 'Completed since' to the dynamic expression `addMinutes(utcNow(), -3)` so each poll only fetches tasks modified in the last 3 minutes — matching your recurrence interval. Under 'opt_fields', enter `name,completed,due_on,assignee.name,custom_fields,memberships.section.name` to pull structured data you'll use in the Slack message.
- 1Click the 'Project' dropdown and select your sprint project by name
- 2Click 'Show advanced options'
- 3In 'Completed since', click the expression editor and enter: addMinutes(utcNow(), -3)
- 4In 'opt_fields', paste: name,completed,due_on,assignee.name,custom_fields,memberships.section.name
Flow canvas > + New step > Variables > Initialize variable
Initialize variables for sprint event tracking
Add three 'Initialize variable' actions before your loop. These will hold the sprint start message, blocker list, and completion count as the flow iterates through tasks. Using variables instead of directly posting per-task prevents Slack from getting spammed with individual messages for each task — you batch them into one post per run.
- 1Click '+ New step', search 'Initialize variable', select it
- 2Name: 'CompletedTasks', Type: Integer, Value: 0
- 3Add another Initialize variable: Name: 'BlockerList', Type: String, Value: '' (empty)
- 4Add another Initialize variable: Name: 'SprintStarted', Type: Boolean, Value: false
Flow canvas > + New step > Control > Apply to each > Add a condition
Loop through tasks and detect sprint events
Add an 'Apply to each' action and set the input to the 'value' array from the Asana response (use the dynamic content picker). Inside the loop, add a 'Condition' action. Build three branches: one checks if `memberships/section/name` contains 'In Progress' to detect sprint starts, one checks if `completed` equals true to increment the counter, and one checks if a custom_field named 'Blocked' equals 'Yes' to append to the BlockerList variable.
- 1Click '+ New step', search 'Apply to each', select it
- 2In 'Select an output from previous steps', pick 'value' from Asana's response in dynamic content
- 3Inside the loop, click 'Add an action', search 'Condition'
- 4Set Condition 1: items('Apply_to_each')?['memberships']?[0]?['section']?['name'] contains 'In Progress'
- 5In the 'Yes' branch, add 'Set variable': SprintStarted = true
- 6Add a second Condition for completed = true, increment CompletedTasks with 'Increment variable'
- 7Add a third Condition for the Blocked custom field, use 'Append to string variable' to add task name to BlockerList
Flow canvas > + New step > Search 'Slack' > Post message (V2)
Connect your Slack account
After the Apply to each block, click '+ New step' and search for 'Slack'. Select the Slack connector and choose 'Post message (V2)'. Click 'Sign in' to create a Slack Connection — this authenticates via OAuth and requires you to select the Slack workspace and grant the bot permission to post messages. This Connection is reused for all three Slack post actions you'll add.
- 1Click '+ New step' after the Apply to each block
- 2Search 'Slack' in the connector search bar
- 3Select the Slack connector
- 4Choose 'Post message (V2)'
- 5Click 'Sign in' and authorize in the Slack OAuth popup
- 6Select the correct Slack workspace if prompted
Flow canvas > Add a Condition > Yes branch > Slack > Post message (V2)
Build the Sprint Start Slack message
Add a Condition block after the loop: if SprintStarted equals true, add a 'Post message (V2)' action inside the Yes branch. Set the channel to '#sprint-updates'. In the Message Text field, compose the announcement using dynamic expressions to pull the sprint project name and current date. This message fires only when at least one task moved into 'In Progress' during this polling cycle.
- 1Click '+ New step', search 'Condition'
- 2Set: SprintStarted is equal to true
- 3In the 'Yes' branch, click 'Add an action', search 'Slack', select 'Post message (V2)'
- 4Set Channel Name to: sprint-updates
- 5In Message Text, enter: 🚀 Sprint started! Tasks are now In Progress as of @{utcNow('MMM dd, yyyy HH:mm')} UTC. Check Asana for full task list.
Flow canvas > Add a Condition > Yes branch > Slack > Post message (V2)
Build the Blocker announcement message
Add another Condition after the sprint start condition: if BlockerList is not equal to an empty string. In the Yes branch, add a Post message (V2) action targeting '#eng-blockers'. Format the message to include the BlockerList variable contents. This gives the team a single consolidated blockers callout per 3-minute cycle instead of per-task noise.
- 1Click '+ New step', search 'Condition'
- 2Set: BlockerList is not equal to (leave the value field empty)
- 3In the Yes branch, add 'Post message (V2)'
- 4Set Channel Name to: eng-blockers
- 5In Message Text, enter: 🚧 Blocked tasks flagged in this sprint cycle: @{variables('BlockerList')}
Flow canvas > Add a Condition > Yes branch > Slack > Post message (V2)
Build the Sprint Completion summary message
Add a final Condition: if CompletedTasks is greater than 0. In the Yes branch, post to '#sprint-updates' with a completion summary. Include the CompletedTasks count and the UTC timestamp so the team knows when the batch was processed. This acts as a lightweight sprint velocity signal without requiring a full Asana reporting export.
- 1Click '+ New step', search 'Condition'
- 2Set: CompletedTasks is greater than 0
- 3In the Yes branch, add 'Post message (V2)'
- 4Set Channel Name to: sprint-updates
- 5In Message Text, enter: ✅ @{variables('CompletedTasks')} task(s) completed in the last 3 minutes. Sprint progress updated at @{utcNow('MMM dd HH:mm')} UTC.
Flow canvas > Save > Test > Manually > Run flow
Test the flow with a live Asana task
Click 'Save' in the top right, then click 'Test' and select 'Manually'. Power Automate will run the flow once immediately. Go to your Asana sprint project in a separate tab and move a task into 'In Progress' or mark one complete before clicking 'Run flow'. After the test finishes, check the flow run history for green checkmarks on each action and verify the message appeared in your Slack channel.
- 1Click 'Save' at the top of the canvas
- 2Click 'Test' in the top right corner
- 3Select 'Manually' and click 'Next'
- 4In Asana, move a task to 'In Progress' in your sprint project
- 5Return to Power Automate and click 'Run flow'
- 6Click 'Done' and watch the run history panel for results
My flows > Asana Sprint Monitor > Run history
Enable the flow and verify run history
After a successful test, the flow is already set to run every 3 minutes on schedule. Confirm it is toggled 'On' by checking the flow detail page — the status badge should read 'On' in green. For the first 24 hours, check 'Run history' in the flow detail page every few hours to confirm runs are completing without errors and that Slack is receiving messages at the expected frequency.
- 1Click 'My flows' in the left sidebar
- 2Click 'Asana Sprint Monitor' to open the flow detail page
- 3Confirm the status shows 'On' with a green indicator
- 4Click 'Run history' to see the 28-day log of all executions
- 5Check that each run shows 'Succeeded' status
This Power Automate expression goes inside the 'Compose' action before your Append to string variable step. Paste it into the 'Inputs' field of a Compose action, then reference the Compose output in your Append variable action. It safely reads the Blocked custom field from the nested Asana array and formats a single task line with assignee name and due date for the Slack blocker message.
JavaScript — Code Step// Add a 'Compose' action inside the Apply to each loop, before the Append to string variable.▸ Show code
// Add a 'Compose' action inside the Apply to each loop, before the Append to string variable. // Set the Inputs field to this expression: if(
... expand to see full code
// Add a 'Compose' action inside the Apply to each loop, before the Append to string variable.
// Set the Inputs field to this expression:
if(
equals(
coalesce(
first(
filter(
items('Apply_to_each')?['custom_fields'],
item()?['name'],
'Blocked'
)
)?['display_value'],
'No'
),
'Yes'
),
concat(
'• ',
items('Apply_to_each')?['name'],
' (', items('Apply_to_each')?['assignee']?['name'], ')',
' — Due: ', items('Apply_to_each')?['due_on']
),
''
)
// Then in your 'Append to string variable' action for BlockerList:
// Value = outputs('Compose')
// This skips non-blocked tasks (returns empty string) and formats blocked ones cleanly.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 — SharePoint, Teams, Azure AD — and you want the sprint automation governed under your existing IT policies, SSO, and DLP rules. The Asana and Slack connectors are both available, authentication is managed centrally through the Connections pane, and run history is retained for 28 days with no extra tooling. The one scenario where you'd pick something else: if your team is not on Microsoft 365 and has no existing Power Automate licenses, the Premium connector requirement (Asana is not a standard connector) adds real cost for a workflow that Make handles on a free or $9/month plan.
The cost math here matters. Power Automate Premium (formerly Per User) costs $15/user/month. A 3-minute recurrence runs 480 times per day. Each run consumes roughly 8-15 actions (Recurrence + Asana fetch + Apply to each iterations + 3 conditions + up to 3 Slack posts). At 10 tasks per sprint project per cycle, that's approximately 4,800-7,200 action executions per day — right at or above the 6,000/day limit on a standard Per User license. You may need the Power Automate Process license at $150/month per flow for consistent high-volume runs. Make runs the same workflow for $9/month on the Basic plan with 10,000 operations included and Asana webhook support, which means zero polling overhead.
Make does this specific workflow better in one key way: it supports Asana webhooks natively, so sprint events arrive in under 5 seconds instead of up to 3 minutes. Zapier also supports Asana with a 'Task Completed' trigger but lacks the loop-and-batch logic for consolidated blocker messages — you'd get one Slack message per task, which gets noisy fast. n8n gives you full JavaScript control over message formatting and built-in deduplication logic with its built-in KV store, plus it's self-hostable at zero recurring SaaS cost. Pipedream handles the Asana webhook cleanly with async/await and lets you write the Slack message format in plain Node.js in about 15 lines. Power Automate is still the right call if your org requires audit logging, conditional access policies on automation credentials, or integration with Azure Monitor — those are things none of the competitors match out of the box.
Three things you'll hit after setup. First, Asana's API returns custom fields as an unordered array — if your sprint project has 12 custom fields, you cannot reference the Blocked field by index because the order can change. Always filter by name using the expression in the Pro Tip, not by array position. Second, the Slack connector's 'Post message (V2)' action silently succeeds when posting to a channel that has been archived or renamed — check the Slack channel list before your first production run and set up a monitor for 200-status-but-no-visible-message failures. Third, Power Automate caches Asana connection tokens aggressively. If you revoke Asana access and reconnect within the same day, the old token may still be used for several hours, causing confusing permission errors on actions that should work.
Ideas for what to build next
- →Add Team Capacity Updates from Asana Portfolios — Extend the flow to read assignee workload from Asana's Portfolio view and post a weekly capacity summary to Slack every Monday morning using a separate Scheduled flow set to run once per week.
- →Post Sprint Summary Digest at Sprint End — Add a second Scheduled flow that runs on the last day of each sprint, queries all completed tasks for the sprint period, and posts a formatted digest to #sprint-updates with total tasks completed, blockers resolved, and tasks rolled over.
- →Route Slack Blocker Replies Back to Asana — Use Power Automate's Slack 'New reaction on message' trigger to detect when someone reacts with a specific emoji (e.g., ✅) to a blocker message, then update the corresponding Asana task's Blocked custom field to 'No' automatically.
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