

How to Send Asana Milestone Updates to Slack with Make
Watches Asana for completed milestones or approaching deadlines and posts formatted status messages to the relevant Slack channel automatically.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Teams running multiple Asana projects who need stakeholders updated in Slack without anyone writing a status message manually.
Not ideal for
Teams with fewer than 5 active projects — at that scale, a single Asana rule posting to Slack's native integration is faster to set up.
Sync type
scheduledUse case type
notificationReal-World Example
A 20-person product team at a SaaS company tracks quarterly launches in Asana with milestone tasks per feature. Before automation, a project manager manually posted to #product-updates every Friday — and mid-week completions went unannounced for days. Now Make polls Asana every 15 minutes, detects newly completed milestones, and posts a structured message to the right channel with the project name, due date, and assignee — no manual step required.
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 | name | |
| Project Name | projects[].name | |
| Completed | completed | |
| Due Date | due_on | |
| Slack Channel ID | ||
5 optional fields▸ show
| Assignee Name | assignee.name |
| Task Resource Subtype | resource_subtype |
| Task URL | permalink_url |
| Notes / Description | notes |
| Completed At | completed_at |
Step-by-Step Setup
make.com > Scenarios > Create a new scenario
Create a new scenario in Make
Log in to Make at make.com and click the blue 'Create a new scenario' button in the top right of the Scenarios dashboard. You'll land on a blank canvas with a large circle in the center — this is where your first module goes. Click the circle to open the app search panel. Type 'Asana' and select it from the results.
- 1Click 'Create a new scenario' in the top right
- 2Click the large circle in the center of the canvas
- 3Type 'Asana' in the search field
- 4Select 'Asana' from the app list
Asana module list > Watch Tasks
Set the Asana trigger to watch tasks
From the Asana module list, select 'Watch Tasks'. This trigger polls Asana on a schedule you define and returns tasks that have changed since the last run. You'll be prompted to connect your Asana account — click 'Add' and authorize Make via OAuth. Once connected, you'll see fields to configure the workspace, project, and what to watch.
- 1Select 'Watch Tasks' from the Asana module list
- 2Click 'Add' next to the Connection field
- 3Authorize Make in the Asana OAuth popup
- 4Select your Asana workspace from the dropdown
- 5Select the specific project or leave blank to watch all projects
Asana module > Clock icon > Scheduling
Configure the polling schedule
Click the clock icon at the bottom left of the Asana module to open the scheduling panel. Set the interval to 15 minutes — this is the minimum on most Make plans and gives a reasonable balance between freshness and operation cost. For deadline-proximity alerts (e.g., tasks due in 24 hours), 15 minutes is precise enough. Click 'OK' to save the schedule.
- 1Click the clock icon at the bottom left of the Asana trigger module
- 2Set 'Run scenario' to 'At regular intervals'
- 3Set the interval to '15 minutes'
- 4Click 'OK'
Asana module output > Wrench icon > Add a router
Add a router to split milestone vs. deadline logic
Click the small wrench icon on the Asana module output and select 'Add a router'. A router splits one data flow into multiple branches, each with its own filter. You need two branches: one for completed milestones and one for tasks with an approaching due date. The router appears as a diamond shape on the canvas with two output paths.
- 1Hover over the output dot on the right side of the Asana module
- 2Click the wrench icon that appears
- 3Select 'Add a router' from the menu
- 4Confirm two output paths appear from the router module
Router > Route 1 > Filter icon
Set the filter for completed milestones
Click the filter icon (a small funnel) on the first route coming out of the router. Set the condition: 'Completed' equals 'True'. If your Asana workflow uses a custom field or tag to mark milestones separately from regular tasks, add a second condition: the task name or custom field contains the text 'milestone' (case-insensitive). Click 'OK' to save the filter.
- 1Click the funnel icon on the first route from the router
- 2Set Condition 1: 'Completed' > 'Equal to' > 'True'
- 3Click 'Add AND condition'
- 4Set Condition 2: 'Name' > 'Contains (case insensitive)' > 'milestone'
- 5Click 'OK'
Router > Route 2 > Filter icon
Set the filter for approaching deadlines
Click the filter icon on the second route. Set the condition to check if the task due date is within the next 24 hours. In Make's filter, use: 'Due On' is greater than or equal to 'now' AND 'Due On' is less than or equal to 'addDays(now; 1)'. This catches tasks due within one day. Adjust to 'addDays(now; 2)' if you want 48-hour warnings.
- 1Click the funnel icon on the second route from the router
- 2Set Condition 1: 'Due On' > 'Greater than or equal to' > 'now'
- 3Click 'Add AND condition'
- 4Set Condition 2: 'Due On' > 'Less than or equal to' > type 'addDays(now; 1)'
- 5Click 'OK'
Route 1 > + > Slack > Create a Message
Add a Slack module to Route 1 (milestone complete)
Click the empty module slot at the end of Route 1 and search for 'Slack'. Select 'Create a Message'. Connect your Slack account via OAuth if you haven't already. Set the channel to the specific Slack channel for project updates (e.g., #project-milestones). In the message text field, build the message using Asana field variables — click inside the text field to open the variable picker.
- 1Click the empty module at the end of Route 1
- 2Search for 'Slack' and select it
- 3Choose 'Create a Message'
- 4Click 'Add' to connect your Slack account via OAuth
- 5Set the Channel field to your target channel (e.g., #project-milestones)
- 6Click inside the Text field and use the variable picker to build your message
Slack module > Text field > Variable picker
Build the milestone completion message
In the Slack 'Create a Message' text field, compose the message using Asana variables. Click the variables panel to insert fields directly. Build a message like: ':white_check_mark: *Milestone Complete:* {{task.name}} | Project: {{task.projects[].name}} | Completed by: {{task.assignee.name}} | Due was: {{formatDate(task.due_on; "MMM D, YYYY")}}'. This gives Slack readers the key facts without needing to open Asana.
- 1Click inside the Text field in the Slack module
- 2Type ':white_check_mark: *Milestone Complete:*'
- 3Click the variable picker icon and insert 'Name' from the Asana task data
- 4Insert 'Projects > Name' for the project name
- 5Insert 'Assignee > Name' for the assignee
- 6Insert 'Due On' wrapped in formatDate() for the due date
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}Route 2 > + > Slack > Create a Message
Add a Slack module to Route 2 (deadline approaching)
Repeat the Slack module setup for Route 2. This time, post to a different channel if relevant (e.g., #project-deadlines) or the same channel with different text. Build a warning-style message: ':warning: *Deadline in 24 hours:* {{task.name}} | Project: {{task.projects[].name}} | Assignee: {{task.assignee.name}} | Due: {{formatDate(task.due_on; "MMM D, YYYY")}}'. The urgency framing helps readers act faster.
- 1Click the empty module at the end of Route 2
- 2Search for and select 'Slack', then 'Create a Message'
- 3Reuse the existing Slack connection
- 4Set the Channel to your deadline alert channel
- 5Build the deadline warning message using Asana variables
Canvas > Run once button (bottom left)
Run the scenario once manually to test
Click 'Run once' at the bottom left of the canvas. Make will execute the scenario immediately against real Asana data. Watch the bubbles above each module — green means data flowed through, blue with a number means that many records were processed, red means an error. Click any bubble to inspect the exact data that passed through that module. Confirm the Slack message appears in the target channel.
- 1Click 'Run once' at the bottom left of the scenario canvas
- 2Watch the execution bubbles appear above each module
- 3Click the bubble on the Asana module to verify task data was fetched
- 4Click the bubble on each Slack module to confirm message payload
- 5Check the target Slack channel for the test message
Canvas > Scenario toggle (bottom left) > On
Activate the scenario
Once the test passes, click the toggle at the bottom left of the canvas to switch the scenario from Off to On. The toggle turns blue. Make will now run the scenario automatically on your 15-minute schedule. Check the 'History' tab after the first scheduled run to confirm it executed cleanly and no errors appear in the log.
- 1Click the toggle switch at the bottom left of the canvas
- 2Confirm the toggle turns blue and shows 'On'
- 3Navigate to the 'History' tab in the scenario header
- 4After 15 minutes, refresh and confirm a successful run entry appears
Paste this formula into the Slack message Text field on both Route modules to build clean, conditional messages. The if() handles null assignees, substring() truncates long task names to 60 characters, and formatDate() normalizes the Asana date string. Replace the variable names with the actual Make variable tokens from the picker — the formula logic stays identical.
JavaScript — Custom Function{{if(length(1.name) > 60; substring(1.name; 0; 60) & "..."; 1.name)}}▸ Show code
{{if(length(1.name) > 60; substring(1.name; 0; 60) & "..."; 1.name)}}
Full milestone message field value:
:white_check_mark: *Milestone Complete*... expand to see full code
{{if(length(1.name) > 60; substring(1.name; 0; 60) & "..."; 1.name)}}
Full milestone message field value:
:white_check_mark: *Milestone Complete*
*Task:* {{if(length(1.name) > 60; substring(1.name; 0; 60) & "..."; 1.name)}}
*Project:* {{if(1.projects[].name; 1.projects[].name; "No project")}}
*Completed by:* {{if(1.assignee.name; 1.assignee.name; "Unassigned")}}
*Due was:* {{formatDate(1.due_on; "MMM D, YYYY"; "UTC")}}
*Link:* <{{1.permalink_url}}|View in Asana>
Full deadline message field value:
:warning: *Deadline Approaching (24h)*
*Task:* {{if(length(1.name) > 60; substring(1.name; 0; 60) & "..."; 1.name)}}
*Project:* {{if(1.projects[].name; 1.projects[].name; "No project")}}
*Assignee:* {{if(1.assignee.name; 1.assignee.name; "Unassigned")}}
*Due:* {{formatDate(1.due_on; "MMM D, YYYY"; "UTC")}}
*Link:* <{{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 needs conditional logic that splits milestone alerts from deadline warnings in the same scenario. Make's router handles both cases in one visual flow without duplicating the Asana connection or writing code. It's also the right call if you want to add a data store deduplication check for deadline alerts — that's a native Make feature, no workaround needed. The one scenario where you'd skip Make: if your team already lives in Zapier and only needs milestone completions with no deadline branch — Zapier's Asana 'Completed Task' trigger plus a Slack step takes 8 minutes and is simpler to hand off to a non-technical team member.
The math here is straightforward. Each scenario run uses roughly 5 operations on average. At 15-minute polling, that's 96 runs/day and ~480 operations/day, or about 14,400/month. Make's Core plan gives you 10,000 operations/month for $10.59. You'll hit that ceiling after roughly 21 days of active use, putting you in Pro territory at $18.82/month. Zapier's equivalent — a Zap checking Asana every 15 minutes — runs at 2 tasks per Zap execution, costing roughly the same in Zap quota but at $29.99/month for the Starter plan. Make is cheaper by about $11/month for this exact workflow.
Zapier's Asana integration has one genuine edge here: the 'New Completed Task in Project' trigger is purpose-built and instant-ish (checks every 1-5 minutes on paid plans) without any polling configuration. n8n handles the deadline-proximity logic better if you self-host, because you can write a JavaScript function node that calculates exact hour differences rather than relying on Make's date filter, which only operates on whole-day granularity. Power Automate connects to Asana only through a premium connector ($15/user/month add-on) and the trigger reliability is inconsistent — skip it here. Pipedream's Asana source triggers on webhooks in real time, which would eliminate the polling delay entirely and make deadline alerts more precise. Make is still the right default because most teams want visual debugging, built-in scheduling, and no code maintenance — and the 15-minute polling lag is acceptable for status updates.
Three things you'll run into after setup. First, Asana's API rate limit is 1,500 requests per minute, but Make's polling trigger counts as one request per run regardless of how many tasks it fetches — you won't hit the rate limit unless you're running dozens of active scenarios against the same Asana workspace simultaneously. Second, the 'projects[].name' field in Make returns an array if a task belongs to multiple projects — your message template will only show the first project name unless you explicitly join the array. Third, Asana's due_on field stores dates without a time component, which means 'due in 24 hours' filters are imprecise at the edges — a task due at end-of-day tomorrow might appear in your alert as early as 30 hours away depending on when the polling run fires. Build your message copy to say 'Due soon' rather than 'Due in exactly 24 hours' to avoid confusing your team.
Ideas for what to build next
- →Add a weekly digest summary — Create a second scenario on a weekly schedule that queries Asana for all milestones completed in the last 7 days and posts a single digest message to a leadership channel — instead of individual pings throughout the week.
- →Route alerts to project-specific Slack channels — Extend the router with additional routes — one per major Asana project — each posting to a dedicated Slack channel (e.g., #launch-q2, #launch-q3). Use the project GID from the Asana task to match routes, keeping cross-project noise out of each team's channel.
- →Add an error notification route — Attach an error handler module to the scenario that posts a plain message to a #make-errors Slack channel whenever the Asana trigger or Slack module fails — so issues surface immediately instead of sitting in the Make History tab unnoticed.
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