

How to Sync Asana Sprints to Slack with Make
Polls Asana for sprint section changes and posts formatted sprint start, completion, and blocker announcements to the right 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 running 1-2 week sprints in Asana who need #sprint-updates in Slack without manual copy-paste.
Not ideal for
Teams using Asana's built-in sprint feature with Goals — the API doesn't expose goal completion events cleanly enough for reliable polling.
Sync type
scheduledUse case type
notificationReal-World Example
A 12-person product team at a B2B SaaS company runs two-week sprints entirely in Asana, with sections named 'Sprint Backlog', 'In Progress', 'Blocked', and 'Done'. Before this automation, the engineering lead manually posted sprint summaries to #sprint-updates every Monday morning — a task that took 15 minutes and happened inconsistently. Now Make polls Asana every 15 minutes, detects task movements into 'Blocked' or 'Done', and fires structured Slack messages to the right channel within one polling cycle.
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 Make
Copy the pre-built Make blueprint and paste it straight into Make. 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 | ||
| Section Name | ||
| Task Permalink URL | ||
| Slack Channel | ||
6 optional fields▸ show
| Assignee Name | |
| Due Date | |
| Project Name | |
| Completed At | |
| Completed By Name | |
| Task Notes (first 200 chars) |
Step-by-Step Setup
make.com > Scenarios > Create a new scenario
Create a new Make scenario
Log into Make at make.com and click the blue 'Create a new scenario' button on the Scenarios dashboard. You'll land on the visual canvas with a single empty module circle in the center. This is where you'll chain every module for this workflow. Name the scenario immediately — click the pencil icon next to 'New scenario' at the top and type something like 'Asana Sprint → Slack Announcements' so it doesn't get lost in a list of untitled scenarios.
- 1Log into make.com
- 2Click the blue 'Create a new scenario' button
- 3Click the pencil icon next to 'New scenario' at the top
- 4Type a name: 'Asana Sprint → Slack Announcements'
- 5Click the empty circle module to begin adding your first module
Canvas > Empty Module > Search 'Asana' > Watch Tasks
Add the Asana 'Watch Tasks' trigger
Click the empty circle module to open the app search panel. Search for 'Asana' and select it, then choose the 'Watch Tasks' trigger from the list — this is Make's polling trigger that checks Asana on a schedule. You'll be prompted to connect your Asana account immediately. Click 'Add' next to the Connection field and authenticate with your Asana credentials. Once connected, you'll see dropdowns to configure the workspace, project, and section you want to monitor.
- 1Click the empty circle on the canvas
- 2Type 'Asana' in the search box
- 3Click 'Asana' in the results
- 4Select 'Watch Tasks' from the trigger list
- 5Click 'Add' next to the Connection field and authenticate with Asana OAuth
Asana Watch Tasks Module > Workspace > Project > Section
Configure Asana project and section filters
In the Watch Tasks module config, select your Workspace first — Make populates Projects dynamically once a workspace is chosen. Select the specific Asana project that holds your sprints. Under 'Section', select the first section you want to monitor (start with 'Blocked'). Set 'Limit' to 10, which processes up to 10 newly modified tasks per polling cycle. You'll add a Router later to handle multiple sections, so pick one section here for the initial trigger chain.
- 1Select your Workspace from the dropdown
- 2Select your sprint Project from the Project dropdown
- 3Select 'Blocked' (or your equivalent section name) from the Section dropdown
- 4Set the Limit field to 10
- 5Click OK to save the module
Canvas > Asana Module > Wrench Icon > Add a Router
Add a Router to branch by sprint event type
Click the small wrench icon on the right edge of the Asana module, then select 'Add a router'. A Router splits the scenario into parallel paths — one for each sprint event type: sprint started, task blocked, and sprint completed. You'll see three branch lines extending from the Router icon on the canvas. Click the filter icon (the funnel symbol) on each branch line to define which conditions route to which Slack message.
- 1Hover over the right edge of the Asana Watch Tasks module
- 2Click the wrench icon that appears
- 3Select 'Add a router' from the menu
- 4Confirm the Router appears on the canvas with branch lines extending from it
- 5Click the funnel icon on the first branch line to open the filter editor
Router > Branch Filter Icon > Condition Editor
Set Router filters for each sprint event
Configure three Router branches using Make's filter editor. Branch 1 (Sprint Started): filter where the task's Section name contains 'In Progress' AND the task's created_at date is within the last 24 hours — this catches newly kicked-off sprint tasks. Branch 2 (Blocked): filter where Section name equals 'Blocked'. Branch 3 (Done): filter where Section name equals 'Done'. In each filter, use the Asana module output field '1. Section > Name' as the left operand and 'Text operator: Equal to' for exact matches.
- 1Click the funnel on Branch 1, set condition: '1. Section: Name' Equal to 'In Progress'
- 2Click OK to save Branch 1 filter
- 3Click the funnel on Branch 2, set condition: '1. Section: Name' Equal to 'Blocked'
- 4Click OK to save Branch 2 filter
- 5Click the funnel on Branch 3, set condition: '1. Section: Name' Equal to 'Done'
Router Branch > + > Slack > Create a Message
Add a Slack 'Create a Message' module to each branch
Click the '+' button at the end of each Router branch to add a Slack module. Search for 'Slack', select it, and choose 'Create a Message'. Connect your Slack workspace via OAuth — you only need to do this once; Make reuses the connection across modules. Set the Channel field to the target Slack channel for that event type (e.g., #sprint-blockers for blocked tasks, #sprint-updates for started and completed tasks). You'll compose the message text in the next step.
- 1Click '+' at the end of the first Router branch
- 2Search for 'Slack' and select it
- 3Choose 'Create a Message'
- 4Click 'Add' next to Connection and authenticate your Slack workspace
- 5In the Channel field, type or search for your target channel name
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}channel: {{channel}}
ts: {{ts}}
Slack Create a Message Module > Text Field > Variable Picker
Build the Slack message text with mapped Asana fields
In each Slack 'Create a Message' module, click into the Text field and use Make's variable panel to map Asana fields. Click the variable picker (the pill icon) to insert fields. For the Blocked branch, build a message like: '🚨 *Blocker:* {{1.name}} assigned to {{1.assignee.name}} in {{1.projects[].name}}. Due: {{formatDate(1.due_on; "MMM D")}}'. For the Done branch: '✅ *Completed:* {{1.name}} — closed by {{1.completed_by.name}} at {{formatDate(1.completed_at; "MMM D, h:mm A")}}'. For the Sprint Started branch: '🚀 *Sprint task kicked off:* {{1.name}} | Assignee: {{1.assignee.name}} | Due: {{formatDate(1.due_on; "MMM D")}}'.
- 1Click into the Text field of the Slack module
- 2Click the variable pill icon to open the variable picker
- 3Select '1. Name' to insert the task name
- 4Select '1. Assignee: Name' for the assignee
- 5Manually type the formatDate() formula around the due_on field: formatDate(1.due_on; "MMM D")
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}Done Branch > + > Text Aggregator > Configure
Add a sprint summary aggregator module
For the Done branch specifically, add a Text Aggregator module between the Asana trigger and the Slack module. This collects all completed tasks from a single polling run into one Slack message instead of flooding the channel with individual posts. Click '+' before the Slack module on the Done branch, search for 'Text Aggregator', and select it. Set the Source Module to the Asana Watch Tasks module, and in the Text field, enter: '• {{1.name}} ({{1.assignee.name}})\n'. The Slack module downstream will receive one aggregated string.
- 1Click '+' on the Done branch before the Slack module
- 2Search for 'Text Aggregator' and select it
- 3Set 'Source Module' to '1. Asana - Watch Tasks'
- 4In the Text field, type: • {{1.name}} ({{1.assignee.name}})\n
- 5Set Separator to empty (the \n in the text handles line breaks)
Asana Watch Tasks Module > Clock Icon > Scheduling
Set the polling schedule
Click the clock icon on the Asana Watch Tasks trigger module (the leftmost module on the canvas). This opens the scheduling panel. Set the interval to 'Every 15 minutes' for near-real-time sprint updates. If your team only needs sprint announcements during working hours, enable the 'Advanced scheduling' toggle and set active hours to Monday–Friday, 8am–7pm in your timezone. This prevents Make from running (and burning operations) overnight.
- 1Click the clock icon on the Asana Watch Tasks module
- 2Select 'Every 15 minutes' from the interval dropdown
- 3Toggle on 'Advanced scheduling'
- 4Set days to Monday through Friday
- 5Set hours to 08:00–19:00 in your local timezone, then click Save
Canvas > Run Once (bottom left) > Module Bubbles
Run the scenario once and verify output
Click the 'Run once' button at the bottom left of the canvas. Make will execute a single polling cycle and show live data flowing through the modules as colored bubbles. Click any module bubble to inspect what data it received and output. Verify that the Asana module returns real task data, the Router sends tasks to the correct branches, and that actual Slack messages appear in your target channels. Check Slack directly to confirm formatting looks right.
- 1Click 'Run once' at the bottom left of the canvas
- 2Watch the animated bubbles move through the scenario
- 3Click the Asana module bubble to inspect raw task data
- 4Click the Router bubble to see which branch each task took
- 5Open Slack and confirm the message appeared in the correct channel
Canvas > Active Toggle (bottom center) > Scenario Details > History
Activate the scenario
Once the test run confirms messages are posting correctly, click the toggle switch at the bottom of the canvas to activate the scenario. The toggle turns blue and the scenario status changes to 'Active'. Make will now run this scenario on the 15-minute schedule you configured. Check the scenario's execution history after the first scheduled run (visible in the Scenario Details panel under 'History') to confirm it executed without errors.
- 1Click the gray toggle switch at the bottom of the canvas
- 2Confirm it turns blue and displays 'Active'
- 3Navigate to Scenario Details by clicking the scenario name
- 4Click 'History' to see scheduled execution logs
- 5After 15 minutes, refresh History to confirm the first scheduled run completed
This formula goes in the Text field of any Slack module. It builds the full message string with conditional logic — handling null assignees, null due dates, and truncating long task notes to 150 characters. Paste it directly into the Text field by switching to 'Formula mode' (click the 'T' toggle in the field header).
JavaScript — Custom Functionif(1.memberships[].section.name = "Blocked";▸ Show code
if(1.memberships[].section.name = "Blocked"; "🚨 *Blocker:* " + 1.name +
... expand to see full code
if(1.memberships[].section.name = "Blocked";
"🚨 *Blocker:* " +
1.name +
" — Assignee: " +
if(1.assignee.name; 1.assignee.name; "Unassigned") +
" | Due: " +
if(1.due_on; formatDate(1.due_on; "MMM D, YYYY"); "No due date") +
if(1.notes; "\n> " + substring(1.notes; 0; 150) + "..."; "") +
"\n<" + 1.permalink_url + "|View in Asana>";
if(1.memberships[].section.name = "Done";
"✅ *Completed:* " +
1.name +
" — closed by " +
if(1.completed_by.name; 1.completed_by.name; "Unknown") +
" at " +
formatDate(1.completed_at; "MMM D, h:mm A");
"🚀 *Sprint task kicked off:* " +
1.name +
" | Assignee: " +
if(1.assignee.name; 1.assignee.name; "Unassigned") +
" | Due: " +
if(1.due_on; formatDate(1.due_on; "MMM D"); "No due date") +
"\n<" + 1.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 Make for this if your team wants conditional routing without writing code. The Router module handles the 'is this a blocker or a completion?' logic visually — you can see exactly which path each task takes without debugging a Zap history log. Make also handles the Text Aggregator pattern natively, which is how you avoid 15 individual Slack pings when 15 tasks close on the last day of a sprint. The one scenario where you'd pick something else: if your team already uses Jira instead of Asana, the Jira sprint completion webhook is far cleaner than polling Asana sections, and n8n's Jira node handles it better.
The math on cost is straightforward. Each task record hits 3 modules minimum: Asana Watch Tasks, the Router, and a Slack module. That's 3 operations per task. If your team moves 50 tasks per week across sprint states (started, blocked, done), that's 150 operations/week, or roughly 650/month. Make's Free tier gives you 1,000 operations/month — you'll fit comfortably. At 150+ tasks/week you'll cross into paid territory. Make Core at $9/month gives you 10,000 operations, which handles teams running 3-4 concurrent sprints with room to spare. Zapier's equivalent would run $19.99/month for the same volume.
Zapier has one genuine advantage here: its Asana trigger fires on task completion specifically, not just 'task modified' — which is cleaner than polling for section changes. But Zapier can't branch a single trigger into three different Slack messages without three separate Zaps, which costs three times the task count in operations and gets messy to maintain. n8n handles this workflow well with IF nodes and is free if self-hosted, but the setup time is 3-4x longer — not worth it unless you're already running n8n infrastructure. Power Automate has an Asana connector, but it's a premium connector requiring a $15/user/month Power Apps license on top of your M365 plan. Make wins on price and build speed for this specific use case.
Three things you'll hit after setup. First, Asana's API rate limit is 150 requests per minute per OAuth token — with 15-minute polling and small task volumes you'll never hit this, but if you clone this scenario across 5 projects with the same OAuth connection, you will. Use separate OAuth connections per scenario to spread the load. Second, Slack's Block Kit formatting doesn't work in Make's standard 'Create a Message' text field — you'd need the 'Send a Message with Block Kit' module instead, and block definitions must be valid JSON strings which Make's formula editor doesn't validate before runtime. Third, if your Asana project uses custom fields for sprint points or priority, Watch Tasks returns them under a 'custom_fields' array with GIDs as keys — not human-readable names. You'll need an Asana 'Get a Custom Field' module to resolve those GIDs to labels before including them in Slack messages.
Ideas for what to build next
- →Add a weekly sprint capacity digest — Build a separate Make scenario that runs every Monday morning, fetches all open tasks in 'In Progress' grouped by assignee, and posts a formatted capacity summary to #sprint-planning. Use Make's Array Aggregator to group tasks by assignee.name before passing to Slack.
- →Reverse sync: create Asana tasks from Slack commands — Add a Slack slash command trigger ('/blocker [task name]') that creates a new Asana task in the 'Blocked' section automatically. This requires a Slack webhook trigger in Make and an Asana 'Create a Task' module, giving your team a two-way link between the channels and the project board.
- →Route blockers to a dedicated Asana blocker-tracking project — When a task enters the 'Blocked' section, use an Asana 'Add Task to Project' module to simultaneously add it to a shared 'Active Blockers' project that engineering leads review. This creates a cross-project blocker dashboard without requiring anyone to manually copy tasks.
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