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

How to Send Asana Milestone Updates to Slack with Zapier

When an Asana task is completed or a deadline approaches, Zapier automatically posts a formatted status message to the relevant Slack channel.

Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.

Best for

Teams of 5-50 people who track project milestones in Asana and need the rest of the team informed in Slack without anyone writing a status update manually.

Not ideal for

Teams with 10+ projects firing updates simultaneously — at that volume, Zapier's polling delay and task costs add up; use Make or n8n instead.

Sync type

scheduled

Use case type

notification

Real-World Example

💡

A 22-person product team at a SaaS company uses this to post to #product-updates in Slack whenever an Asana milestone task is marked complete in their quarterly roadmap project. Before the automation, the project manager manually copied milestone status into Slack each Friday — often 24-48 hours after the actual completion. Now the message posts within 15 minutes of the task being marked done.

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

Before You Start

Make sure you have everything ready.

Asana account with Member access to the project you want to monitor — Guest access will not return task data to Zapier
Slack account with permission to add apps to your workspace — you need the 'Manage Apps' permission or an admin must approve the Zapier bot
At least one completed task already in the Asana project so the trigger test returns real sample data
Write access to the target Slack channel — the Zapier bot must be invited to any private channels before the Zap goes live

Optional

A consistent naming convention for milestone tasks in Asana (e.g. all milestone tasks include the word 'Milestone') so the Filter step can reliably identify them

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Name
Project Name
Completed At
Permalink URL
4 optional fields▸ show
Assignee Name
Due Date
Notes / Description
Section

Step-by-Step Setup

1

zapier.com > Dashboard > Create Zap

Create a new Zap

Log in to zapier.com and click the orange 'Create Zap' button in the left sidebar. The Zap editor opens in a two-panel view: the left panel shows your steps, the right panel shows the configuration for the selected step. You'll build the Zap top-to-bottom — trigger first, then action. Give the Zap a clear name at the top, like 'Asana Milestone → Slack #project-updates', before you configure anything else.

  1. 1Click 'Create Zap' in the left sidebar
  2. 2Click the name field at the top and type a descriptive Zap name
  3. 3Click '1. Trigger' in the left panel to begin trigger configuration
What you should see: You should see the trigger step open in the right panel with a search box labeled 'Search for apps'.
2

Zap Editor > Trigger > Search Apps > Asana

Select Asana as the trigger app

In the trigger search box, type 'Asana' and select it from the dropdown. Zapier will ask you to choose a trigger event — this is the most important decision in the Zap. For milestone completions, select 'Completed Task in Project'. For deadline proximity alerts, you'll need a separate Zap using a Schedule by Zapier trigger combined with an Asana search step — pick one approach now and finish the other later. Stick with 'Completed Task in Project' for this walkthrough.

  1. 1Type 'Asana' in the trigger app search box
  2. 2Click 'Asana' in the results
  3. 3Click the 'Event' dropdown
  4. 4Select 'Completed Task in Project'
  5. 5Click 'Continue'
What you should see: You should see 'Completed Task in Project' confirmed as the trigger event and a 'Connect Asana' prompt appear below.
Common mistake — Zapier polls Asana every 1-15 minutes depending on your plan. On the free tier, polling happens every 15 minutes. A task marked complete at 9:01 AM may not trigger until 9:15 AM. If near-instant delivery matters, this is a real limitation.
Zapier
+
click +
search apps
Slack
SL
Slack
Select Asana as the trigger …
Slack
SL
module added
3

Zap Editor > Trigger > Connect Asana > OAuth popup

Connect your Asana account

Click 'Sign in to Asana' and a popup will open asking you to authorize Zapier. Log in with the Asana account that has access to the projects you want to monitor. Zapier requests read access to your Asana workspace. Once authorized, the popup closes and you return to the Zap editor with your Asana account listed. If your organization uses Asana SSO, you'll authenticate through your identity provider in this popup.

  1. 1Click 'Sign in to Asana'
  2. 2Enter your Asana credentials or use SSO in the popup
  3. 3Click 'Allow' to grant Zapier access
  4. 4Confirm your account name appears in the account selector
  5. 5Click 'Continue'
What you should see: You should see your Asana account email listed under 'Connected Account' with a green checkmark.
Common mistake — If you connect a personal Asana account but your milestones live in a team workspace, Zapier may not see those projects. Connect the account that is an active member of the correct workspace.
Zapier settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Zapier
popup window
Connected
green checkmark
4

Zap Editor > Trigger > Configure > Project dropdown

Select the Asana project to monitor

Zapier now asks you to configure the trigger. Open the 'Project' dropdown — it pulls a list of all projects visible to your connected Asana account. Select the specific project containing your milestone tasks. If you want to monitor multiple projects, you'll need one Zap per project. There is no multi-project trigger in Zapier's Asana integration. You can optionally filter by Section if your milestones are organized into a dedicated section like 'Milestones' or 'Phase Gates'.

  1. 1Click the 'Project' dropdown
  2. 2Type the project name to filter the list
  3. 3Select your target project
  4. 4Optionally select a Section to narrow the trigger to milestone tasks only
  5. 5Click 'Continue'
What you should see: You should see the selected project name confirmed in the Project field. The Section field is optional and can remain blank.
Common mistake — Zapier loads projects alphabetically but cuts off long lists. If your project doesn't appear, type the first few characters to filter. Projects in archived portfolios will not appear.
5

Zap Editor > Trigger > Test Trigger

Test the trigger and load sample data

Click 'Test trigger' — Zapier polls Asana for recently completed tasks in the selected project and returns up to 3 sample records. You need at least one completed task in the project for the test to return data. If the project is brand new, complete a test task in Asana first, then return and run the test. Review the sample data to confirm the fields you'll need are present: task name, completion date, assignee, due date, project name, and the direct link to the task.

  1. 1Click 'Test trigger'
  2. 2Wait 5-10 seconds for Zapier to poll Asana
  3. 3Click the returned record to expand all fields
  4. 4Confirm 'Name', 'Completed At', 'Assignee Name', and 'Permalink URL' are present
What you should see: You should see a green 'Test successful' banner and at least one Asana task record with its fields listed below.
Common mistake — If Asana returns tasks that are not milestones, you'll need to add a Filter step next. Zapier cannot selectively trigger on tasks tagged as milestones — it fires on all completed tasks in the project.
Zapier
▶ Turn on & test
executed
Slack
Asana
Asana
🔔 notification
received
6

Zap Editor > + > Filter by Zapier

Add a Filter step to isolate milestone tasks

Click the '+' icon between the trigger and the next action to insert a Filter by Zapier step. This ensures only milestone tasks send a Slack message. Set the filter condition to: 'Name' contains 'Milestone' — or whatever naming convention your team uses for milestone tasks. If your team uses a custom field in Asana called 'Task Type', you can filter on that value instead. The Zap will stop and send nothing to Slack if the condition is not met.

  1. 1Click the '+' between trigger and action
  2. 2Select 'Filter by Zapier'
  3. 3Set field to 'Name' (from Asana trigger data)
  4. 4Set condition to '(Text) Contains'
  5. 5Type your milestone identifier, e.g. 'Milestone' or 'Phase'
  6. 6Click 'Continue'
What you should see: You should see a summary line reading 'Only continue if Name contains Milestone' and a test result showing whether your sample task passes the filter.
Common mistake — If no tasks pass the filter during testing, the test will show 'Your Zap would not have continued' — this is expected behavior, not an error. The Zap itself is configured correctly.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Asana
AS
notified
7

Zap Editor > + > Slack > Send Channel Message

Add Slack as the action app

Click the '+' after the filter step and search for 'Slack'. Select 'Send Channel Message' as the action event. This posts a message to a public or private Slack channel. Do not select 'Send Direct Message' — this use case is about team-wide visibility, not individual pings. You'll configure the exact channel and message content in the next two steps.

  1. 1Click the '+' to add an action
  2. 2Type 'Slack' in the search box
  3. 3Click 'Slack'
  4. 4Select 'Send Channel Message' as the event
  5. 5Click 'Continue'
What you should see: You should see 'Send Channel Message' confirmed as the action event and a 'Connect Slack' prompt below.
8

Zap Editor > Action > Connect Slack > OAuth popup

Connect your Slack workspace

Click 'Sign in to Slack' and authorize Zapier to post messages on behalf of a Slack bot. The OAuth screen lists the permissions Zapier requests: posting to channels and optionally reading channel lists. Choose the correct workspace from the dropdown if you belong to multiple. After authorization, Zapier creates a bot called 'Zapier' in your Slack workspace — messages will appear to come from this bot unless you customize the bot name in the action configuration.

  1. 1Click 'Sign in to Slack'
  2. 2Select the correct workspace from the dropdown
  3. 3Click 'Allow' to grant permissions
  4. 4Confirm your workspace name appears under 'Connected Account'
What you should see: You should see your Slack workspace name listed under 'Connected Account' with a green checkmark.
Common mistake — Zapier's Slack bot must be invited to private channels before it can post. Go to the private channel in Slack, type /invite @Zapier, and press Enter. Otherwise the Zap will error silently on private channels.
9

Zap Editor > Action > Configure > Channel + Message Text

Configure the Slack message

Now map your Asana fields into the Slack message. Set the Channel field to your target channel — type '#' to search by name. In the Message Text field, build a clear status update using Asana data. Click into the Message Text box and use the purple data pill picker to insert dynamic fields. A well-structured message should include the milestone name, the project it belongs to, who completed it, when it was completed, and a direct link. See the field mapping section below for the exact fields to use.

  1. 1Click the 'Channel' field and type the channel name or select from the list
  2. 2Click into the 'Message Text' field
  3. 3Type your message template, inserting Asana data pills where needed
  4. 4Set 'Bot Name' to something recognizable like 'Asana Updates'
  5. 5Optionally set 'Bot Icon' to an Asana logo emoji :asana:
  6. 6Click 'Continue'
What you should see: You should see the Message Text field populated with a mix of static text and purple data pills referencing Asana fields.
Common mistake — The 'Completed At' field from Asana returns a UTC timestamp in ISO 8601 format, e.g. 2024-03-15T14:32:00.000Z. It will appear exactly like that in Slack unless you add a Formatter step before this action to convert it to a readable date.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
10

Zap Editor > Insert Step > Formatter by Zapier > Date / Time > Format

Add a Formatter step to clean up the timestamp

Go back and insert a Formatter by Zapier step between the Filter and the Slack action. Choose 'Date / Time' as the transform type and 'Format' as the action. Map the 'Completed At' field from Asana as the input. Set the output format to 'MMMM D, YYYY [at] h:mm A' — this produces output like 'March 15, 2024 at 2:32 PM'. Then return to the Slack action and swap the raw timestamp data pill for the Formatter output. This one step makes the Slack message readable to non-technical teammates.

  1. 1Click '+' between Filter and Slack action
  2. 2Select 'Formatter by Zapier'
  3. 3Choose 'Date / Time' then 'Format'
  4. 4Set Input to the 'Completed At' data pill from Asana
  5. 5Set 'To Format' to 'MMMM D, YYYY [at] h:mm A'
  6. 6Click 'Continue', then update the Slack message to use the Formatter output
What you should see: The Formatter test result should show a human-readable date like 'March 15, 2024 at 2:32 PM' instead of the raw ISO string.
Common mistake — Formatter by Zapier defaults to UTC. If your team is in a different timezone, set the 'To Timezone' field explicitly or the times will be off by hours.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}

This Code by Zapier step runs after the Formatter step and before the Slack action. It compares the task's due date against the completion date and appends a late indicator to the message if the milestone was finished after its due date. Paste this into a 'Run Python' Code by Zapier step and map 'input_data' fields to the Asana due date, completed date, task name, project name, assignee name, and permalink from earlier steps.

JavaScript — Code Step# Code by Zapier — Python
▸ Show code
# Code by Zapier — Python
# Adds late/on-time indicator to Slack message before sending
# Map these in the input_data section of the Code step:

... expand to see full code

# Code by Zapier — Python
# Adds late/on-time indicator to Slack message before sending
# Map these in the input_data section of the Code step:
# due_date, completed_date, task_name, project_name, assignee_name, permalink

from datetime import datetime

# Parse dates from Asana (date fields arrive as 'YYYY-MM-DD' strings)
due_raw = input_data.get('due_date', '')
completed_raw = input_data.get('completed_date', '')
task_name = input_data.get('task_name', 'Unknown Task')
project_name = input_data.get('project_name', 'Unknown Project')
assignee = input_data.get('assignee_name', 'Unassigned')
permalink = input_data.get('permalink', '')

# Default timing label
timing_label = ''

if due_raw and completed_raw:
    try:
        due_date = datetime.strptime(due_raw, '%Y-%m-%d')
        # Completed date comes as ISO 8601 — strip time component
        completed_date = datetime.strptime(completed_raw[:10], '%Y-%m-%d')
        delta = (completed_date - due_date).days
        if delta > 0:
            timing_label = f'⚠️ ({delta} day{"s" if delta > 1 else ""} late)'
        elif delta == 0:
            timing_label = '✅ On time'
        else:
            timing_label = f'🚀 {abs(delta)} day{"s" if abs(delta) > 1 else ""} early'
    except ValueError:
        timing_label = ''

# Compose the final Slack message
message = (
    f'✅ *Milestone Complete:* {task_name}\n'
    f'*Project:* {project_name}\n'
    f'*Completed by:* {assignee}\n'
    f'*Due date:* {due_raw} {timing_label}\n'
    f'🔗 View in Asana: {permalink}'
)

output = [{'slack_message': message, 'timing_label': timing_label}]
11

Zap Editor > Action > Test Action > Publish

Test and activate the Zap

Click 'Test action' in the Slack step — Zapier will post a real test message to your selected Slack channel using the sample Asana data. Go to Slack and verify the message looks correct: readable date, proper milestone name, working link, and the right channel. If anything looks off, click back into the Slack action and edit the message text. Once the test message looks right, click 'Publish' at the top of the Zap editor to turn it on. The Zap is now live and polling Asana every 1-15 minutes depending on your plan.

  1. 1Click 'Test action' in the Slack step
  2. 2Check your Slack channel for the test message
  3. 3Review the message for formatting, data accuracy, and link validity
  4. 4Click 'Back' to edit if anything needs adjustment
  5. 5Click 'Publish' to activate the Zap
What you should see: You should see a test message appear in your Slack channel and a green 'Zap is on' confirmation banner in the Zapier editor.

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 Zapier for this workflow

Use Zapier for this if your team is non-technical, doesn't want to maintain infrastructure, and completes fewer than 300 milestone tasks per month. Setup takes under 30 minutes. The Zap editor's step-by-step interface makes it easy to hand off to a project manager or ops person who has never built an automation. The one scenario where you'd skip Zapier: if you need to monitor more than 3 Asana projects simultaneously, the one-project-per-Zap limitation turns into a maintenance problem fast. At 6+ projects, use Make instead.

Cost

Here's the cost math. Each Zap run consumes 3 tasks: one for the trigger, one for the Filter, one for the Slack action. Add the Formatter step and you're at 4 tasks per run. If your team completes 50 milestones per month, that's 200 tasks/month — well inside Zapier's free tier (100 tasks). At 100 milestones/month you hit 400 tasks and need the Starter plan at $19.99/month. Make handles the same workflow for free up to 1,000 operations/month, and its operations are roughly equivalent to Zapier tasks. At 100 milestones/month, Make saves you $240/year for identical output.

Tradeoffs

Make's Asana module can watch multiple projects in one scenario and has a native 'Watch Tasks' trigger that responds faster than Zapier's polling. n8n's Asana node supports full task filtering by custom fields without a separate Filter step, and if you self-host n8n the cost is near zero. Power Automate has a decent Asana connector but Slack message formatting is noticeably worse — block kit isn't supported, so messages look plain. Pipedream lets you write JavaScript directly against the Asana and Slack APIs, which means you can handle edge cases like custom fields and conditional channel routing in 30 lines instead of building 4 separate Zap steps. Zapier still wins here for one reason: the guided builder catches configuration mistakes before they go live. For a non-coding team, that guardrail is worth the cost.

Three things you'll hit after going live. First, Asana's 'Completed At' timestamp is always UTC — if your team is in New York or London, Slack messages will show times that are 4-8 hours off until you add the Formatter timezone conversion. Second, if someone completes a task in a mobile app while offline and it syncs later, the Asana API reports the sync time as the completion time, not when the person actually tapped 'Complete'. Expect occasional timestamps that look wrong by hours. Third, Zapier's Asana integration does not support custom fields in the trigger data on the free or Starter plan — custom fields like 'Task Type: Milestone' only appear in the data payload on Professional and above. If you're relying on a custom field for filtering, confirm your plan tier before building the Filter step.

Ideas for what to build next

  • Add deadline proximity alertsBuild a second Zap using Schedule by Zapier as the trigger (runs daily at 9 AM) and Asana's 'Find Tasks' search action to pull tasks due within 3 days. Post those to Slack as a morning digest so teams see upcoming milestones before they're late.
  • Route updates to different channels by projectAdd a Paths by Zapier step after the Filter to check the project name and route messages to different Slack channels — #engineering-updates for dev milestones, #marketing-updates for campaign milestones. This removes the need to maintain one catch-all channel.
  • Log milestone completions to a Google SheetAdd a second action after the Slack step that appends a row to a Google Sheet with the task name, project, assignee, due date, completion date, and late/on-time status. Over 90 days this creates a milestone delivery record you can use to spot patterns in delays.

Related guides

Was this guide helpful?
Slack + Asana overviewZapier profile →