Beginner~12 min setupCommunication & Project ManagementVerified April 2026
Slack logo
Asana logo

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

scheduled

Use case type

notification

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

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

Asana account with 'Member' or higher access to the sprint project — 'Guest' access cannot read section membership via API
Slack account with permission to install apps and post to the target channels — the Make app needs 'chat:write' scope
Asana project structured with named sections that represent sprint states (e.g., 'Sprint Backlog', 'In Progress', 'Blocked', 'Done')
Make account on any paid plan OR the Free plan (limited to 1,000 operations/month — see cost section before assuming free is enough)
Slack channels already created for sprint announcements — Make cannot create channels, only post to existing ones

Field Mapping

Map these fields between your apps.

FieldAPI 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

1

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.

  1. 1Log into make.com
  2. 2Click the blue 'Create a new scenario' button
  3. 3Click the pencil icon next to 'New scenario' at the top
  4. 4Type a name: 'Asana Sprint → Slack Announcements'
  5. 5Click the empty circle module to begin adding your first module
What you should see: You should see the Make canvas with one empty module and your scenario name displayed at the top of the page.
Common mistake — Make auto-saves scenario names but does NOT auto-save module configuration. If you close the tab mid-build before clicking 'Save', you lose all module settings.
2

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.

  1. 1Click the empty circle on the canvas
  2. 2Type 'Asana' in the search box
  3. 3Click 'Asana' in the results
  4. 4Select 'Watch Tasks' from the trigger list
  5. 5Click 'Add' next to the Connection field and authenticate with Asana OAuth
What you should see: You should see the Asana 'Watch Tasks' module open with a green 'Connected' indicator next to your account name and empty dropdowns for Workspace, Project, and Section.
Common mistake — The 'Watch Tasks' trigger polls for tasks modified since the last run. If you pick 'All Sections', Make will fire on every task edit in the project — including description typos. Filter to specific sections in the next step to avoid noise.
Make
+
click +
search apps
Slack
SL
Slack
Add the Asana 'Watch Tasks' …
Slack
SL
module added
3

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.

  1. 1Select your Workspace from the dropdown
  2. 2Select your sprint Project from the Project dropdown
  3. 3Select 'Blocked' (or your equivalent section name) from the Section dropdown
  4. 4Set the Limit field to 10
  5. 5Click OK to save the module
What you should see: The Watch Tasks module should display your project name and section name in the module card on the canvas.
Common mistake — Section names in Asana are case-sensitive when Make fetches them via API. If your section is named 'blocked' (lowercase) and you type 'Blocked', the filter won't match. Check the exact casing in Asana first.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Asana
AS
notified
4

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.

  1. 1Hover over the right edge of the Asana Watch Tasks module
  2. 2Click the wrench icon that appears
  3. 3Select 'Add a router' from the menu
  4. 4Confirm the Router appears on the canvas with branch lines extending from it
  5. 5Click the funnel icon on the first branch line to open the filter editor
What you should see: You should see the Router module on the canvas with at least two empty branch paths extending from it, each showing a gray funnel icon.
5

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.

  1. 1Click the funnel on Branch 1, set condition: '1. Section: Name' Equal to 'In Progress'
  2. 2Click OK to save Branch 1 filter
  3. 3Click the funnel on Branch 2, set condition: '1. Section: Name' Equal to 'Blocked'
  4. 4Click OK to save Branch 2 filter
  5. 5Click the funnel on Branch 3, set condition: '1. Section: Name' Equal to 'Done'
What you should see: Each Router branch should display a small orange filter badge showing the condition text, such as 'Section: Name = Blocked'.
Common mistake — Make evaluates Router branches top to bottom and stops at the first match by default. If a task could match multiple conditions (unlikely here but possible), reorder branches by dragging them so the most specific conditions sit at the top.
6

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.

  1. 1Click '+' at the end of the first Router branch
  2. 2Search for 'Slack' and select it
  3. 3Choose 'Create a Message'
  4. 4Click 'Add' next to Connection and authenticate your Slack workspace
  5. 5In the Channel field, type or search for your target channel name
What you should see: You should see a Slack 'Create a Message' module on each branch with a green connection indicator and your Slack workspace name displayed.
Common mistake — The Slack OAuth scope required is 'chat:write'. If your Slack admin has restricted OAuth app installation, you'll get a 'missing_scope' error when trying to post. Have your Slack admin approve the Make app before you start building.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
7

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")}}'.

  1. 1Click into the Text field of the Slack module
  2. 2Click the variable pill icon to open the variable picker
  3. 3Select '1. Name' to insert the task name
  4. 4Select '1. Assignee: Name' for the assignee
  5. 5Manually type the formatDate() formula around the due_on field: formatDate(1.due_on; "MMM D")
What you should see: The Text field should show a mix of static text and colored variable pills representing Asana fields. When you click 'Run once', the preview will show actual task names and dates.
Common mistake — If a task has no assignee, {{1.assignee.name}} outputs nothing and your message will have a blank gap. Wrap it with an if() formula: if(1.assignee.name; 1.assignee.name; "Unassigned") to handle null assignees cleanly.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
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
8

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.

  1. 1Click '+' on the Done branch before the Slack module
  2. 2Search for 'Text Aggregator' and select it
  3. 3Set 'Source Module' to '1. Asana - Watch Tasks'
  4. 4In the Text field, type: • {{1.name}} ({{1.assignee.name}})\n
  5. 5Set Separator to empty (the \n in the text handles line breaks)
What you should see: The Done branch should now show three modules in sequence: Asana Watch Tasks → Text Aggregator → Slack Create a Message. The Aggregator module card will display 'Source: Watch Tasks'.
Common mistake — The Text Aggregator stops the iteration and outputs once. If you accidentally connect it on the Blocked branch too, you'll only get one Slack message per polling run for all blockers — not one per blocker. Keep the aggregator on the Done branch only.
9

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.

  1. 1Click the clock icon on the Asana Watch Tasks module
  2. 2Select 'Every 15 minutes' from the interval dropdown
  3. 3Toggle on 'Advanced scheduling'
  4. 4Set days to Monday through Friday
  5. 5Set hours to 08:00–19:00 in your local timezone, then click Save
What you should see: The trigger module should display a small clock badge showing '15 min' and the scenario schedule will appear in the scenario details panel on the right.
Common mistake — The default polling interval is often 15 minutes. If you need faster delivery, check whether your plan supports shorter intervals before assuming it's a bug.
10

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.

  1. 1Click 'Run once' at the bottom left of the canvas
  2. 2Watch the animated bubbles move through the scenario
  3. 3Click the Asana module bubble to inspect raw task data
  4. 4Click the Router bubble to see which branch each task took
  5. 5Open Slack and confirm the message appeared in the correct channel
What you should see: Each module bubble should show a green number indicating how many records it processed. Your Slack channels should contain new messages with task names, assignee names, and formatted dates.
Common mistake — If the Asana module returns 0 records on 'Run once', it's because no tasks were modified since Make's internal cursor was set. Manually move a task into 'Blocked' or 'Done' in Asana right before clicking 'Run once' to generate a test record.
Make
▶ Run once
executed
Slack
Asana
Asana
🔔 notification
received
11

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.

  1. 1Click the gray toggle switch at the bottom of the canvas
  2. 2Confirm it turns blue and displays 'Active'
  3. 3Navigate to Scenario Details by clicking the scenario name
  4. 4Click 'History' to see scheduled execution logs
  5. 5After 15 minutes, refresh History to confirm the first scheduled run completed
What you should see: The scenario status indicator at the top of the Scenarios list should show a green 'Active' dot next to your scenario name.

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

VerdictWhy Make for this workflow

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.

Cost

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.

Tradeoffs

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 digestBuild 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 commandsAdd 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 projectWhen 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

Was this guide helpful?
Slack + Asana overviewMake profile →