

How to Automate Daily Standups from Asana to Slack with Power Automate
Every morning at a scheduled time, Power Automate pulls completed Asana tasks and upcoming deadlines from the past 24 hours and posts a formatted standup report to a Slack channel.
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 already using Power Automate who want scheduled Asana task digests in Slack without adding another tool.
Not ideal for
Teams that need real-time task notifications as they happen — use Zapier or Make for event-driven triggers instead.
Sync type
scheduledUse case type
reportingReal-World Example
A 12-person product team at a B2B SaaS company runs standups at 9:30 AM. Before this flow, the team lead manually copied completed tasks from Asana into Slack every morning — a 10-minute job that got skipped 3 days out of 5. Now Power Automate fires at 9:25 AM, pulls every task completed in the last 24 hours plus anything due today or tomorrow, and posts a structured report to #product-standup before the meeting starts. The team lead stopped touching it after the first week.
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 | |
| Completed Status | completed | |
| Completed At | completed_at | |
| Due Date | due_on | |
| Assignee Name | assignee.name | |
| Slack Channel Name | ||
| Message Text | ||
2 optional fields▸ show
| Task Notes | notes |
| Task GID | gid |
Step-by-Step Setup
make.powerautomate.com > Create > Scheduled cloud flow
Create a new Scheduled cloud flow
Go to make.powerautomate.com and sign in with your Microsoft 365 account. Click 'Create' in the left sidebar, then select 'Scheduled cloud flow' from the options. Name the flow something descriptive like 'Asana Standup to Slack'. Set the start time to 9:25 AM in your team's timezone and set recurrence to every 1 day. Do not use 'Automated cloud flow' — this workflow runs on a timer, not on an Asana event.
- 1Click 'Create' in the left sidebar
- 2Select 'Scheduled cloud flow'
- 3Enter flow name: 'Asana Daily Standup to Slack'
- 4Set Start time to 9:25 AM in your team's local timezone
- 5Set Repeat every to '1 Day', then click 'Create'
Flow editor > + New step > Search 'Asana' > List tasks for a project
Connect your Asana account
Click '+ New step' below the Recurrence trigger. In the action search bar, type 'Asana' and select the Asana connector. Choose the action 'List tasks for a project'. A connection dialog will appear — click 'Sign in' and authenticate with the Asana account that has at least view access to the target 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 'Asana' from the results
- 4Choose 'List tasks for a project' as the action
- 5Click 'Sign in' in the connection panel and complete OAuth with your Asana credentials
Flow editor > Asana action > List tasks for a project > Completed since
Configure the Asana task query
In the 'List tasks for a project' action, select your target project from the Project dropdown. Set 'Completed since' to the dynamic expression for 24 hours ago — you'll enter this manually using Power Automate expressions. Click inside the 'Completed since' field, then click 'Expression' in the dynamic content panel and type the formula shown below. Also set 'Opt fields' to 'name,completed,due_on,assignee.name,notes' so you only fetch the fields you need for the standup report.
- 1Select your Asana project from the 'Project' dropdown
- 2Click inside the 'Completed since' field
- 3Click 'Expression' tab in the dynamic content panel
- 4Enter: addHours(utcNow(), -24)
- 5Click OK, then set Opt fields to: name,completed,due_on,assignee.name,notes
Flow editor > + New step > Asana > List tasks for a project
Add a second Asana step for upcoming deadlines
Click '+ New step' again. Add another 'List tasks for a project' action from the Asana connector — this one will capture tasks due in the next 48 hours regardless of completion status. Set the same project. Set 'Due on (before)' to the expression 'addDays(utcNow(), 2)' and leave 'Completed since' blank. Name this action 'Get Upcoming Tasks' using the three-dot menu > Rename so you can tell the two Asana steps apart in later expressions.
- 1Click '+ New step' below the first Asana action
- 2Search 'Asana' and add another 'List tasks for a project' action
- 3Select the same project from the dropdown
- 4Set 'Due on (before)' expression to: addDays(utcNow(), 2)
- 5Click the three-dot menu on this action card and select 'Rename' — name it 'Get Upcoming Tasks'
Flow editor > + New step > Data Operations > Select
Build the completed tasks message text with Select and Join
Click '+ New step' and search for 'Select' — choose the Data Operations 'Select' action. Set 'From' to the body/tasks array from your first Asana step (pick it from dynamic content). In the Map section, add one key-value pair: key 'line', value a manually typed expression that formats each task. Switch to Expression mode for the value and build the string shown in the pro tip section. This creates an array of formatted lines you'll join into a single block of text in the next step.
- 1Click '+ New step'
- 2Search 'Select' and choose 'Data Operations - Select'
- 3Set 'From' to the tasks array from your first Asana action via dynamic content
- 4In Map, set Key to: line
- 5Set Value (Expression mode) to: concat('✅ ', item()?['name'], ' — ', item()?['assignee']?['name'])
Flow editor > + New step > Data Operations > Select
Repeat the Select step for upcoming tasks
Add another Data Operations 'Select' action below the first one. Point 'From' to the tasks array from your 'Get Upcoming Tasks' Asana step. Use the same Map structure but change the expression to format upcoming tasks with their due dates: concat('📅 ', item()?['name'], ' — Due: ', item()?['due_on'], ' (', coalesce(item()?['assignee']?['name'], 'Unassigned'), ')'). Rename this action 'Format Upcoming Tasks' using the three-dot menu.
- 1Click '+ New step'
- 2Add another 'Data Operations - Select' action
- 3Set 'From' to the tasks array from 'Get Upcoming Tasks'
- 4Set Key to: line
- 5Set Value (Expression) to: concat('📅 ', item()?['name'], ' — Due: ', item()?['due_on'], ' (', coalesce(item()?['assignee']?['name'], 'Unassigned'), ')')
- 6Rename this action 'Format Upcoming Tasks'
Flow editor > + New step > Data Operations > Join
Join the arrays into readable text blocks
Add two 'Join' actions from Data Operations — one for each Select output. For the first Join, set 'From' to the output of your first Select action, and set 'Join with' to a newline character. You can't type a literal newline in the field, so use the expression decodeUriComponent('%0A') as the separator. Repeat for the second Join pointing to your 'Format Upcoming Tasks' Select output. Rename them 'Join Completed Text' and 'Join Upcoming Text'.
- 1Click '+ New step' and add 'Data Operations - Join'
- 2Set 'From' to the output of your first Select action
- 3Set 'Join with' (Expression) to: decodeUriComponent('%0A')
- 4Rename this action 'Join Completed Text'
- 5Add a second 'Data Operations - Join' action below it
- 6Set 'From' to 'Format Upcoming Tasks' Select output, same separator
- 7Rename it 'Join Upcoming Text'
Flow editor > + New step > Data Operations > Compose
Compose the final standup message
Add a 'Data Operations - Compose' action. In the Inputs field, build the full Slack message using a combination of static text and dynamic content from your two Join actions. Use the coalesce function to substitute a fallback string if either section is empty. The full message structure should include a header line with today's date, a completed tasks section, and an upcoming deadlines section. Reference the expression in the pro tip section for the exact formula.
- 1Click '+ New step' and add 'Data Operations - Compose'
- 2Click inside the Inputs field and switch to Expression mode
- 3Build the full message string combining static text with outputs from 'Join Completed Text' and 'Join Upcoming Text'
- 4Use coalesce() to handle empty sections with fallback text like 'No completed tasks in the last 24 hours'
- 5Rename this action 'Compose Standup Message'
Flow editor > + New step > Slack > Post message (V2)
Connect Slack and post the message
Click '+ New step' and search for 'Slack'. Select the Slack connector and choose the action 'Post message (V2)'. Click 'Sign in' to authenticate — you'll need to authorize the Power Automate Slack app in your workspace. In 'Channel Name', type the exact channel name without the # symbol (e.g. product-standup). Set 'Message Text' to the dynamic content output from your 'Compose Standup Message' action.
- 1Click '+ New step'
- 2Search 'Slack' and select the Slack connector
- 3Choose 'Post message (V2)'
- 4Click 'Sign in' and authorize Power Automate in your Slack workspace
- 5Enter your channel name in the 'Channel Name' field (no # prefix)
- 6Set 'Message Text' to the output of 'Compose Standup Message'
channel: {{channel}}
ts: {{ts}}
Flow editor > Save > Test > Manually > Run flow
Test the flow with a manual run
Click 'Save' in the top toolbar, then click 'Test' in the upper right. Select 'Manually' and click 'Run flow'. Watch the flow execute step by step — each action card turns green on success or red on failure. If Asana returns tasks, you'll see the arrays populate in the Select outputs. Check your Slack channel within 30 seconds to confirm the message arrived. If the message is empty, your Asana project may have no tasks completed in the last 24 hours — temporarily change the expression to addHours(utcNow(), -720) to pull 30 days of history for testing.
- 1Click 'Save' in the top toolbar
- 2Click 'Test' in the upper right corner
- 3Select 'Manually' and click 'Run flow'
- 4Watch the step-by-step execution in the run detail panel
- 5Check your Slack channel for the posted message
make.powerautomate.com > My flows > [Flow name]
Enable the flow for daily production use
After a successful test, your flow is already saved and will fire on its next scheduled recurrence. To confirm it is active, go to My flows in the left sidebar and find your flow — the toggle should be set to 'On'. Check the 'Next run' timestamp shown under the flow name to confirm the schedule is correct. Power Automate sends email alerts to the flow owner if a run fails — confirm your notification email is correct under Settings > Notifications.
- 1Click 'My flows' in the left sidebar
- 2Find 'Asana Daily Standup to Slack' in the list
- 3Confirm the toggle shows 'On'
- 4Verify the 'Next run' time matches your intended schedule
- 5Navigate to Settings > Notifications and confirm your alert email address
Paste this into a 'Data Operations - Compose' action's Inputs field (Expression mode) in your Power Automate flow. It builds the complete standup message with a dynamic date header, handles empty task sections with fallback text, and formats both sections in one expression rather than requiring separate Compose steps.
JavaScript — Code Stepconcat(▸ Show code
concat( '*📋 Daily Standup — ', formatDateTime(utcNow(), 'MMMM d, yyyy'),
... expand to see full code
concat(
'*📋 Daily Standup — ',
formatDateTime(utcNow(), 'MMMM d, yyyy'),
'*',
decodeUriComponent('%0A%0A'),
'*✅ Completed (last 24h):*',
decodeUriComponent('%0A'),
if(
equals(length(body('Join_Completed_Text')), 0),
'_No tasks completed in the last 24 hours_',
body('Join_Completed_Text')
),
decodeUriComponent('%0A%0A'),
'*📅 Upcoming Deadlines (next 48h):*',
decodeUriComponent('%0A'),
if(
equals(length(body('Join_Upcoming_Text')), 0),
'_No tasks due in the next 48 hours_',
body('Join_Upcoming_Text')
)
)Scaling Beyond Projects with 200+ tasks where the API response is paginated+ Records
If your volume exceeds Projects with 200+ tasks where the API response is paginated records, apply these adjustments.
Handle Asana API pagination
The Asana API returns a maximum of 100 tasks per request by default. If your project has more than 100 active tasks, the connector only retrieves the first page. Use the HTTP action with the Asana API directly and implement a Do Until loop that follows the next_page.offset token until it is null.
Filter at the API level, not in Power Automate
Pulling all tasks and filtering in a Power Automate Filter array action is wasteful at scale. Use the Asana API's completed_since and due_before query parameters in an HTTP action to restrict results at the source. This cuts data transfer and reduces the risk of hitting the 30-second Power Automate action timeout.
Avoid Apply to each loops for large task arrays
Apply to each in Power Automate runs sequentially by default — 200 tasks at 1 second per iteration means a 3-minute flow run that can timeout. Use the Data Operations Select action instead, which processes the entire array in a single action without looping. Only use Apply to each when you need to make a separate API call per task.
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 in the Microsoft 365 ecosystem. The Asana and Slack connectors are pre-built, authentication takes under 5 minutes, and IT departments that already manage Power Automate licenses won't need to approve a new tool. It's also the right call if your company requires data to stay within Microsoft's compliance boundary. The one scenario where you should pick something else: if you need tasks to post to Slack the moment they're completed rather than on a schedule. Power Automate's Asana connector has no webhook-based trigger for task completion — it's polling only, and the minimum polling interval is 1 minute, which adds latency to any near-real-time setup.
The cost math here is straightforward. This flow uses 6 Power Automate actions per run (Recurrence, 2x Asana list, 2x Select, 2x Join, Compose, Slack post — roughly 9 actions). At 1 run per day, that's 270 actions per month. Power Automate's per-user plan includes 40,000 cloud flow actions per month at $15/user/month — you'll use less than 1% of your quota. If you're on the Microsoft 365 Business plans, you already have Power Automate included, making this effectively free. By comparison, Zapier charges $19.99/month for multi-step Zaps, and Make's paid tier starts at $9/month for 10,000 operations. Power Automate wins on cost here if you're already paying for M365.
Make handles this use case more elegantly when it comes to message formatting — the text aggregator module and array functions are simpler to configure than Power Automate's chain of Select + Join + Compose actions. Zapier's 'Schedule by Zapier' trigger combined with Asana's 'Find Tasks' action gets you to the same outcome in fewer steps, but Zapier doesn't let you build multi-section formatted messages without a Code step. n8n gives you the most control — the Function node lets you build the entire message in 20 lines of JavaScript with full array manipulation — and self-hosting eliminates cost entirely. Pipedream's native Node.js steps and built-in Asana/Slack integrations make it the fastest to build for engineers. Power Automate is still the right call for non-technical teams inside Microsoft shops who need something maintainable by someone who doesn't write code.
Three things you'll hit after this goes live. First, the Asana connector silently drops tasks if the project has more than 100 tasks and you haven't handled pagination — your standup report will be incomplete and you won't get an error, just missing data. Second, Slack's Power Automate connector posts as a bot user with a generic name. Teams confuse this with bot spam and mute the channel. Pin a message in the channel explaining what the bot posts and when. Third, formatDateTime() in Power Automate uses .NET format strings, not JavaScript date formats. 'MMMM d, yyyy' works fine, but if you copy format strings from Make or n8n documentation, they won't work here — 'MM/DD/YYYY' produces literal 'MM/DD/YYYY' text in Power Automate expressions.
Ideas for what to build next
- →Add a weekly summary variant — Clone the flow and change the Recurrence to weekly on Mondays. Extend the Asana lookback window to 7 days and add a 'tasks due this week' section to give the team a Monday kickoff digest in addition to the daily standup.
- →Include blocker detection from task notes — Add a 'Filter array' Data Operations action before the Select step. Filter for tasks where the notes field contains the word 'blocked' or 'blocker' and add a dedicated third section to the Slack message that surfaces these tasks with a 🚨 icon.
- →Post per-assignee summaries to individual DMs — After the project-level Slack post, add a loop that groups tasks by assignee and sends each person a direct Slack message with only their own tasks. This requires adding the Slack 'Send a direct message' action inside a Power Automate Apply to each loop over a unique assignee list.
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