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

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

scheduled

Use case type

notification

Real-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.

/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 sprint project — Guest access does not allow API reads on task custom fields
Slack account with permission to install apps and post to the target channels (#sprint-updates, #eng-blockers)
Power Automate account with a license that includes Premium connectors — the Asana connector is Premium and requires at minimum a Power Automate Premium (formerly Per User) plan
Asana sprint project must use Sections (not just tags) to represent sprint stages like 'In Progress', 'Blocked', and 'Done' — the flow logic reads section names directly

Optional

A custom field named 'Blocked' (or equivalent) configured in Asana with a defined enum value of 'Yes' on the sprint project

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Namename
Task Completion Statuscompleted
Section Namememberships[0].section.name
Task GIDgid
Slack Channel (Sprint Updates)
Slack Channel (Blockers)
Message Timestamp
3 optional fields▸ show
Assignee Nameassignee.name
Due Datedue_on
Blocked Custom Fieldcustom_fields[?(@.name=='Blocked')].display_value

Step-by-Step Setup

1

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.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click '+ New flow' at the top right
  3. 3Select 'Scheduled cloud flow'
  4. 4Enter flow name: 'Asana Sprint Monitor'
  5. 5Set interval to '3' and frequency to 'Minute'
  6. 6Click 'Create'
What you should see: You should see the flow canvas open with a 'Recurrence' trigger block showing '3 Minute' frequency at the top of the canvas.
Common mistake — Do not choose 'Automated cloud flow' here. The Asana connector in Power Automate does not have native event-based triggers for task completions or section changes — only polling works reliably.
2

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.

  1. 1Click '+ New step'
  2. 2Type 'Asana' in the connector search bar
  3. 3Select the 'Asana' connector
  4. 4Choose action 'Get tasks in a project'
  5. 5Click 'Sign in' in the connection prompt
  6. 6Authorize with your Asana credentials in the popup window
What you should see: The action card should show your Asana account email under 'Connection' and expose the 'Project' dropdown field.
Common mistake — Authenticate with a service account or dedicated bot user in Asana, not a personal account. If that person leaves the company, the Connection breaks and the flow stops silently.
Power Automate settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Power Automate
popup window
Connected
green checkmark
3

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.

  1. 1Click the 'Project' dropdown and select your sprint project by name
  2. 2Click 'Show advanced options'
  3. 3In 'Completed since', click the expression editor and enter: addMinutes(utcNow(), -3)
  4. 4In 'opt_fields', paste: name,completed,due_on,assignee.name,custom_fields,memberships.section.name
What you should see: The action card should show your project name selected and the opt_fields text populated. You will not see live data yet — that appears only when the flow runs.
Common mistake — The 'Completed since' filter only catches completed tasks. Blockers flagged via custom fields or section moves will still require a separate condition check in Step 5 — this filter alone is not enough.
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
4

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.

  1. 1Click '+ New step', search 'Initialize variable', select it
  2. 2Name: 'CompletedTasks', Type: Integer, Value: 0
  3. 3Add another Initialize variable: Name: 'BlockerList', Type: String, Value: '' (empty)
  4. 4Add another Initialize variable: Name: 'SprintStarted', Type: Boolean, Value: false
What you should see: You should see three variable initialization blocks stacked on the canvas, each showing the variable name and type in the action header.
5

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.

  1. 1Click '+ New step', search 'Apply to each', select it
  2. 2In 'Select an output from previous steps', pick 'value' from Asana's response in dynamic content
  3. 3Inside the loop, click 'Add an action', search 'Condition'
  4. 4Set Condition 1: items('Apply_to_each')?['memberships']?[0]?['section']?['name'] contains 'In Progress'
  5. 5In the 'Yes' branch, add 'Set variable': SprintStarted = true
  6. 6Add a second Condition for completed = true, increment CompletedTasks with 'Increment variable'
  7. 7Add a third Condition for the Blocked custom field, use 'Append to string variable' to add task name to BlockerList
What you should see: The Apply to each block should contain three nested Condition blocks. Expanding any condition should show the expression in the left field and the comparison value on the right.
Common mistake — Asana custom fields return as an array of objects. To read the 'Blocked' field value safely, use the expression: `coalesce(first(where(items('Apply_to_each')?['custom_fields'], 'name', 'Blocked'))?['display_value'], 'No')`. If your custom field is named differently, this expression returns null and the condition never fires.
6

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.

  1. 1Click '+ New step' after the Apply to each block
  2. 2Search 'Slack' in the connector search bar
  3. 3Select the Slack connector
  4. 4Choose 'Post message (V2)'
  5. 5Click 'Sign in' and authorize in the Slack OAuth popup
  6. 6Select the correct Slack workspace if prompted
What you should see: The Post message action card should show your Slack workspace name under 'Connection' and expose the 'Channel Name' and 'Message Text' fields.
Common mistake — The Slack connector in Power Automate posts as the authenticated user, not a bot. If you want messages to appear from a bot name like 'Sprint Bot', use an incoming webhook URL in an HTTP action instead of the native Slack connector.
7

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.

  1. 1Click '+ New step', search 'Condition'
  2. 2Set: SprintStarted is equal to true
  3. 3In the 'Yes' branch, click 'Add an action', search 'Slack', select 'Post message (V2)'
  4. 4Set Channel Name to: sprint-updates
  5. 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.
What you should see: The Yes branch should contain a Slack Post message card showing the channel name 'sprint-updates' and the message text with the dynamic date expression.
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.
8

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.

  1. 1Click '+ New step', search 'Condition'
  2. 2Set: BlockerList is not equal to (leave the value field empty)
  3. 3In the Yes branch, add 'Post message (V2)'
  4. 4Set Channel Name to: eng-blockers
  5. 5In Message Text, enter: 🚧 Blocked tasks flagged in this sprint cycle: @{variables('BlockerList')}
What you should see: The condition card should show 'BlockerList is not equal to' with an empty right-hand value. The Slack action inside should show the channel and the variable reference in the message body.
Common mistake — If BlockerList contains newline characters between task names (from the Append to string variable step), the Slack message renders them correctly. But if you used commas instead of ` ` as a separator, the message becomes a single hard-to-read line. Go back to Step 5 and confirm the Append action uses ` @{items('Apply_to_each')?['name']}` as the value.
9

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.

  1. 1Click '+ New step', search 'Condition'
  2. 2Set: CompletedTasks is greater than 0
  3. 3In the Yes branch, add 'Post message (V2)'
  4. 4Set Channel Name to: sprint-updates
  5. 5In Message Text, enter: ✅ @{variables('CompletedTasks')} task(s) completed in the last 3 minutes. Sprint progress updated at @{utcNow('MMM dd HH:mm')} UTC.
What you should see: The Yes branch Slack card should show the CompletedTasks variable and utcNow expression both visible in the message text field.
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.
10

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.

  1. 1Click 'Save' at the top of the canvas
  2. 2Click 'Test' in the top right corner
  3. 3Select 'Manually' and click 'Next'
  4. 4In Asana, move a task to 'In Progress' in your sprint project
  5. 5Return to Power Automate and click 'Run flow'
  6. 6Click 'Done' and watch the run history panel for results
What you should see: Each action block in the run history should show a green checkmark. Expand the Slack 'Post message' action to confirm the output shows 'statusCode: 200'. Check #sprint-updates in Slack for the test message.
Common mistake — The test run uses the exact same recurrence window expression `addMinutes(utcNow(), -3)`. If you moved the Asana task more than 3 minutes before clicking 'Run flow', the Asana query returns zero tasks and the flow appears to succeed but posts nothing. Timing matters here.
Power Automate
▶ Test flow
executed
Slack
Asana
Asana
🔔 notification
received
11

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.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click 'Asana Sprint Monitor' to open the flow detail page
  3. 3Confirm the status shows 'On' with a green indicator
  4. 4Click 'Run history' to see the 28-day log of all executions
  5. 5Check that each run shows 'Succeeded' status
What you should see: The run history table should show rows appearing every 3 minutes with 'Succeeded' status. Click any row to see the per-action execution details and exact Slack payload sent.

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

VerdictWhy n8n for this workflow

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.

Cost

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.

Tradeoffs

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 PortfoliosExtend 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 EndAdd 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 AsanaUse 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

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