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

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

scheduled

Use case type

notification

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

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

Make account with an active plan (the free tier allows 1,000 operations/month — budget for this workflow consuming ~6-10 ops per trigger run)
Asana account with access to the projects you want to monitor — the connecting user must have 'Member' or higher access on those projects
Slack account with permission to post to the target channels — the connecting user must be a member of those channels, not just the workspace
Asana OAuth connection authorized in Make with scopes for reading tasks, projects, and assignees
Slack OAuth connection authorized in Make with the 'chat:write' scope enabled

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Namename
Project Nameprojects[].name
Completedcompleted
Due Datedue_on
Slack Channel ID
5 optional fields▸ show
Assignee Nameassignee.name
Task Resource Subtyperesource_subtype
Task URLpermalink_url
Notes / Descriptionnotes
Completed Atcompleted_at

Step-by-Step Setup

1

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.

  1. 1Click 'Create a new scenario' in the top right
  2. 2Click the large circle in the center of the canvas
  3. 3Type 'Asana' in the search field
  4. 4Select 'Asana' from the app list
What you should see: A list of Asana trigger and action modules appears in a panel on the right side of the screen.
Common mistake — Make defaults to the last workspace you used. Check the workspace name in the top left before creating the scenario — building in the wrong workspace means your team won't see it.
2

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.

  1. 1Select 'Watch Tasks' from the Asana module list
  2. 2Click 'Add' next to the Connection field
  3. 3Authorize Make in the Asana OAuth popup
  4. 4Select your Asana workspace from the dropdown
  5. 5Select the specific project or leave blank to watch all projects
What you should see: The Asana 'Watch Tasks' module shows a green checkmark on the connection field and your workspace name is visible in the configuration panel.
Common mistake — If you leave the project field blank, Make pulls tasks from every project in the workspace. This can spike your operation count fast on large workspaces — scope it to specific projects.
Make
+
click +
search apps
Slack
SL
Slack
Set the Asana trigger to wat…
Slack
SL
module added
3

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.

  1. 1Click the clock icon at the bottom left of the Asana trigger module
  2. 2Set 'Run scenario' to 'At regular intervals'
  3. 3Set the interval to '15 minutes'
  4. 4Click 'OK'
What you should see: The clock icon on the module changes to show a timer symbol, and the scenario header shows '15 min' next to the scheduling indicator.
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.
4

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.

  1. 1Hover over the output dot on the right side of the Asana module
  2. 2Click the wrench icon that appears
  3. 3Select 'Add a router' from the menu
  4. 4Confirm two output paths appear from the router module
What you should see: A diamond-shaped router node appears on the canvas connected to the Asana module, with two empty output branches ready for filters.
Common mistake — Routers in Make process routes in order from top to bottom. If a task matches both route conditions (e.g., it's completed AND due today), it will only follow the first matching route unless you enable 'Fall Through' on the router — which most users don't need here.
5

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.

  1. 1Click the funnel icon on the first route from the router
  2. 2Set Condition 1: 'Completed' > 'Equal to' > 'True'
  3. 3Click 'Add AND condition'
  4. 4Set Condition 2: 'Name' > 'Contains (case insensitive)' > 'milestone'
  5. 5Click 'OK'
What you should see: The first route now shows a filter label with your condition text below the line connecting the router to the next module.
Common mistake — Asana's 'Completed' field comes back as a boolean. Make's filter treats it correctly, but if you're mapping from a custom status field instead, it returns as a string — wrap it in a text match condition, not a boolean check.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Asana
AS
notified
6

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.

  1. 1Click the funnel icon on the second route from the router
  2. 2Set Condition 1: 'Due On' > 'Greater than or equal to' > 'now'
  3. 3Click 'Add AND condition'
  4. 4Set Condition 2: 'Due On' > 'Less than or equal to' > type 'addDays(now; 1)'
  5. 5Click 'OK'
What you should see: The second route shows two date conditions in its filter label, and the canvas shows both routes from the router now have filter icons displayed.
Common mistake — Asana stores due dates as date-only values (no time component). Make's 'addDays(now; 1)' returns a full timestamp with today's time. Tasks due tomorrow at any point in the day will match — which is correct. Tasks with no due date return null and will never match this filter, so no extra null-check is needed.
7

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.

  1. 1Click the empty module at the end of Route 1
  2. 2Search for 'Slack' and select it
  3. 3Choose 'Create a Message'
  4. 4Click 'Add' to connect your Slack account via OAuth
  5. 5Set the Channel field to your target channel (e.g., #project-milestones)
  6. 6Click inside the Text field and use the variable picker to build your message
What you should see: The Slack module shows your connected workspace name and the channel field displays the channel you selected.
Common mistake — Slack channel IDs and names both work in Make, but if someone renames the Slack channel later, a channel name reference will break silently — the message just stops sending. Use the channel ID (starts with 'C') instead of the display name for production scenarios.
8

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.

  1. 1Click inside the Text field in the Slack module
  2. 2Type ':white_check_mark: *Milestone Complete:*'
  3. 3Click the variable picker icon and insert 'Name' from the Asana task data
  4. 4Insert 'Projects > Name' for the project name
  5. 5Insert 'Assignee > Name' for the assignee
  6. 6Insert 'Due On' wrapped in formatDate() for the due date
What you should see: The Text field shows a mix of static emoji/text and orange Asana variable tokens, forming a readable message template.
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.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
9

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.

  1. 1Click the empty module at the end of Route 2
  2. 2Search for and select 'Slack', then 'Create a Message'
  3. 3Reuse the existing Slack connection
  4. 4Set the Channel to your deadline alert channel
  5. 5Build the deadline warning message using Asana variables
What you should see: Both routes from the router now end in a Slack module, each with its own channel and message text configured.
Common mistake — If you post both milestone and deadline alerts to the same channel, add a text label to each message (e.g., [MILESTONE] vs [DEADLINE]) so readers can scan quickly. Without it, similar messages in the same channel create confusion.
10

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.

  1. 1Click 'Run once' at the bottom left of the scenario canvas
  2. 2Watch the execution bubbles appear above each module
  3. 3Click the bubble on the Asana module to verify task data was fetched
  4. 4Click the bubble on each Slack module to confirm message payload
  5. 5Check the target Slack channel for the test message
What you should see: Green bubbles appear on the Asana trigger and both Slack modules. You see a real message posted in the correct Slack channel with task name, project name, and formatted due date.
Common mistake — On the first 'Run once', Make will ask you to choose a start point in time for the Asana trigger. Pick a short window (e.g., 'From now on') rather than 'All time' — otherwise it may pull hundreds of historical tasks and send Slack spam.
Make
▶ Run once
executed
Slack
Asana
Asana
🔔 notification
received
11

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.

  1. 1Click the toggle switch at the bottom left of the canvas
  2. 2Confirm the toggle turns blue and shows 'On'
  3. 3Navigate to the 'History' tab in the scenario header
  4. 4After 15 minutes, refresh and confirm a successful run entry appears
What you should see: The scenario status shows 'On' with a blue indicator. The History tab shows a green 'Success' entry after the first scheduled run completes.

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

VerdictWhy Make for this workflow

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.

Cost

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.

Tradeoffs

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 summaryCreate 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 channelsExtend 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 routeAttach 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

Was this guide helpful?
Slack + Asana overviewMake profile →