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

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

scheduled

Use case type

reporting

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

/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 at least Member access to the target project — viewer access is not enough to read task details via the API
Slack account with permission to install apps in your workspace — you need the 'Manage apps' permission or admin approval to authorize the Power Automate connector
Microsoft 365 account with Power Automate access — the flow uses scheduled triggers and Data Operations actions available on all paid plans
Asana project already set up with tasks that have assignees and due dates — the standup report is empty if tasks lack these fields
A dedicated Slack channel for standup reports already created — the Power Automate connector cannot create channels, only post to existing ones

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Namename
Completed Statuscompleted
Completed Atcompleted_at
Due Datedue_on
Assignee Nameassignee.name
Slack Channel Name
Message Text
2 optional fields▸ show
Task Notesnotes
Task GIDgid

Step-by-Step Setup

1

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.

  1. 1Click 'Create' in the left sidebar
  2. 2Select 'Scheduled cloud flow'
  3. 3Enter flow name: 'Asana Daily Standup to Slack'
  4. 4Set Start time to 9:25 AM in your team's local timezone
  5. 5Set Repeat every to '1 Day', then click 'Create'
What you should see: You land inside the flow editor with a single 'Recurrence' trigger block showing your configured schedule.
Common mistake — Power Automate stores schedules in UTC internally. If you type '9:25 AM' without confirming your timezone in the dialog, the flow will fire at the wrong local time. Double-check the timezone dropdown before clicking Create.
2

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.

  1. 1Click '+ New step'
  2. 2Type 'Asana' in the connector search bar
  3. 3Select 'Asana' from the results
  4. 4Choose 'List tasks for a project' as the action
  5. 5Click 'Sign in' in the connection panel and complete OAuth with your Asana credentials
What you should see: The Asana action card shows your email address in green at the top, confirming the connection is live. The 'Project' dropdown is now populated.
Common mistake — If your Asana account uses SSO (Google or SAML), the OAuth popup may silently fail in some browsers. Use Chrome and disable popup blockers for make.powerautomate.com before attempting the connection.
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 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.

  1. 1Select your Asana project from the 'Project' dropdown
  2. 2Click inside the 'Completed since' field
  3. 3Click 'Expression' tab in the dynamic content panel
  4. 4Enter: addHours(utcNow(), -24)
  5. 5Click OK, then set Opt fields to: name,completed,due_on,assignee.name,notes
What you should see: The 'Completed since' field shows the blue expression pill 'addHours(utcNow(), -24)' instead of plain text. The Opt fields box contains the comma-separated field list.
4

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.

  1. 1Click '+ New step' below the first Asana action
  2. 2Search 'Asana' and add another 'List tasks for a project' action
  3. 3Select the same project from the dropdown
  4. 4Set 'Due on (before)' expression to: addDays(utcNow(), 2)
  5. 5Click the three-dot menu on this action card and select 'Rename' — name it 'Get Upcoming Tasks'
What you should see: You now have two Asana action cards. The first is labeled 'List tasks for a project' (completed tasks). The second is labeled 'Get Upcoming Tasks' (upcoming deadlines). Both show the same project selected.
Common mistake — Asana's API returns tasks with due_on as a date string in YYYY-MM-DD format, not a datetime. Filtering by 'Due on before' compares dates only — tasks due exactly on the boundary date may or may not appear depending on API evaluation order. Add one extra day to your deadline window if you need hard cutoff accuracy.
5

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.

  1. 1Click '+ New step'
  2. 2Search 'Select' and choose 'Data Operations - Select'
  3. 3Set 'From' to the tasks array from your first Asana action via dynamic content
  4. 4In Map, set Key to: line
  5. 5Set Value (Expression mode) to: concat('✅ ', item()?['name'], ' — ', item()?['assignee']?['name'])
What you should see: The Select action card shows 'From' pointing to the Asana tasks array and one map row with key 'line' and the concat expression as the value.
Common mistake — If an Asana task has no assignee, item()?['assignee']?['name'] returns null and the concat will produce '✅ Task Name — '. Add a coalesce expression — coalesce(item()?['assignee']?['name'], 'Unassigned') — to avoid blank names in the Slack message.
6

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.

  1. 1Click '+ New step'
  2. 2Add another 'Data Operations - Select' action
  3. 3Set 'From' to the tasks array from 'Get Upcoming Tasks'
  4. 4Set Key to: line
  5. 5Set Value (Expression) to: concat('📅 ', item()?['name'], ' — Due: ', item()?['due_on'], ' (', coalesce(item()?['assignee']?['name'], 'Unassigned'), ')')
  6. 6Rename this action 'Format Upcoming Tasks'
What you should see: You now have two Select action cards — one formatting completed tasks with ✅ icons, one formatting upcoming tasks with 📅 icons and due dates.
7

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

  1. 1Click '+ New step' and add 'Data Operations - Join'
  2. 2Set 'From' to the output of your first Select action
  3. 3Set 'Join with' (Expression) to: decodeUriComponent('%0A')
  4. 4Rename this action 'Join Completed Text'
  5. 5Add a second 'Data Operations - Join' action below it
  6. 6Set 'From' to 'Format Upcoming Tasks' Select output, same separator
  7. 7Rename it 'Join Upcoming Text'
What you should see: Both Join actions show blue expression pills in the 'Join with' field. When you run a test, each will produce a single string with one task per line.
Common mistake — Power Automate's Join action only accepts arrays. If either Asana query returns zero tasks, the body/tasks property will be an empty array and Join produces an empty string — not an error. Handle this in Step 8 with a default message string.
8

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.

  1. 1Click '+ New step' and add 'Data Operations - Compose'
  2. 2Click inside the Inputs field and switch to Expression mode
  3. 3Build the full message string combining static text with outputs from 'Join Completed Text' and 'Join Upcoming Text'
  4. 4Use coalesce() to handle empty sections with fallback text like 'No completed tasks in the last 24 hours'
  5. 5Rename this action 'Compose Standup Message'
What you should see: The Compose action shows a multi-line expression or a mix of static text and dynamic content pills. Running a test at this stage should preview the full formatted message in the action output.
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

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.

  1. 1Click '+ New step'
  2. 2Search 'Slack' and select the Slack connector
  3. 3Choose 'Post message (V2)'
  4. 4Click 'Sign in' and authorize Power Automate in your Slack workspace
  5. 5Enter your channel name in the 'Channel Name' field (no # prefix)
  6. 6Set 'Message Text' to the output of 'Compose Standup Message'
What you should see: The Slack action card shows your workspace name and channel in the configuration fields. The Message Text field shows the Compose output pill in blue.
Common mistake — The Power Automate Slack connector posts as the OAuth bot user, not as your personal Slack account. The message will appear from 'Power Automate' or whatever you named the app during authorization. You cannot change the sender name without using the Slack API directly via an HTTP action.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
10

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.

  1. 1Click 'Save' in the top toolbar
  2. 2Click 'Test' in the upper right corner
  3. 3Select 'Manually' and click 'Run flow'
  4. 4Watch the step-by-step execution in the run detail panel
  5. 5Check your Slack channel for the posted message
What you should see: All action cards show green checkmarks. Your Slack channel receives a formatted message with completed tasks and upcoming deadlines sections. The run detail panel shows the full message text in the Compose action output.
Power Automate
▶ Test flow
executed
Slack
Asana
Asana
🔔 notification
received
11

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.

  1. 1Click 'My flows' in the left sidebar
  2. 2Find 'Asana Daily Standup to Slack' in the list
  3. 3Confirm the toggle shows 'On'
  4. 4Verify the 'Next run' time matches your intended schedule
  5. 5Navigate to Settings > Notifications and confirm your alert email address
What you should see: The flow shows status 'On' with a correct next run timestamp in your local timezone. The 28-day run history panel is empty initially but will populate after the first automatic run.

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.

1

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.

2

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.

3

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

VerdictWhy n8n for this workflow

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.

Cost

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.

Tradeoffs

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 variantClone 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 notesAdd 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 DMsAfter 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

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