Asana Blocked Dependency Alert
On a schedule (or on task update), the flow finds Asana tasks blocked by an incomplete dependency or marked Blocked, notifies the blocked task's assignee and the owner of the blocking task in Teams, and escalates dependencies blocking the critical path. Keeps work flowing by surfacing blockers fast.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
This flow surfaces blocked work in Asana before it stalls a delivery. On a daily schedule it sweeps every monitored Asana project, finds incomplete tasks that are blocked by an incomplete dependency or carry a Blocked tag, posts a comment on the blocked task documenting the blocker, notifies the project channel in Microsoft Teams, and escalates any blocker that sits on the critical path by email to the manager.
Why it matters: Blocked tasks stall silently — the blocked assignee waits, and the owner of the blocking task often doesn't even know they're holding up downstream work. Surfacing the dependency to both parties fast, with an audit comment on the task itself, keeps work flowing.
Status: Built and shipped Off (demo). Going live requires only authorizing the three connections + setting the environment-variable values (Asana workspace/project GIDs, Teams group/channel, manager email, and the Asana PAT in Key Vault).
Use Case
A delivery team runs its work in Asana with task dependencies. They want dependency blockers detected automatically each morning and routed to the people who can clear them — the blocked task's assignee and the channel owner — with critical-path blockers escalated to management. The flow also leaves a comment on the Asana task so the blocker is documented in-context.
Flow Architecture
Dependency Sweep Daily 0900
Recurrence (Day/1, 09:00 ET)Daily sweep of every monitored Asana project.
Initialize variables
Initialize VariableBind each env var (Workspace, ProjectIds, CriticalTag, ManagerEmail, Teams group/channel, AsanaApiBase, AsanaApiToken) plus a configurable Blocked tag marker to a variable.
Compose Project Id List
Compose — split(varAsanaProjectIds, ',')Turn the comma list into an array.
For Each Project
Foreach (Sequential)Iterate each monitored project GID.
List Tasks In Project
Asana — ListTasksAll tasks in the project (connector).
Filter Incomplete Tasks
Query (Filter array)Keep only completed = false tasks.
For Each Open Task
Foreach (Sequential)Iterate each incomplete task.
Get Task Dependencies
HTTP — GET /tasks/{id}Fetch dependencies (+completion), tags, assignee — connector has no dependency op.
Filter Incomplete Dependencies
Query (Filter array)Keep dependencies with completed = false (the active blockers).
Compute blocked signals
ComposeIncomplete blocker count, first blocker name, and whether a tag contains the Blocked marker.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_AsanaWorkspaceGid | String | REPLACE_WITH_ASANA_WORKSPACE_GID | Asana workspace GID scoping ListTasks. |
| flowlibs_AsanaProjectIds | String | 1200000000000001,1200000000000002 | Comma-separated project GIDs to monitor. |
| flowlibs_CriticalTag | String | critical-path | Tag name marking a task as critical-path (escalated). |
| flowlibs_ManagerEmail | String | manager@contoso.com | Recipient of critical-path escalation emails. |
| flowlibs_TeamsGroupId | String | REPLACE_WITH_TEAMS_GROUP_ID | Teams team (group) ID for notifications. |
| flowlibs_TeamsChannelId | String | REPLACE_WITH_TEAMS_CHANNEL_ID | Teams channel ID for notifications. |
| flowlibs_AsanaApiBaseUrl | String | https://app.asana.com/api/1.0 | Asana REST base URL for the dependency lookup. |
| flowlibs_AsanaApiToken | String | REPLACE_WITH_ASANA_PAT | Asana Personal Access Token for the HTTP call (Key Vault-backed). |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Asana | shared_asana | ListTasks AddComment |
| Microsoft Teams | shared_teams | PostMessageToConversation |
| Office 365 Outlook | shared_office365 | SendEmailV2 |
| HTTP | http | GET /tasks/{id} (dependency/tag lookup) |
Note — All connections are referenced as solution connection references; the flow is portable between environments as long as a connection is mapped at import time.
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- Predicted slip
- Extend the comment/Teams message to estimate downstream delay from the blocker's own due date.
- Per-project digest
- Collect blocked tasks into an array and send one rolled-up Teams card per project instead of one message per task.
- Trigger on task update
- Swap the Recurrence trigger for an Asana task-updated trigger to surface blockers in near real-time (keep the same body of logic).
- Tune the Blocked marker
- Change varBlockedTagMarker to match your board's tag (e.g. on-hold).
- Wider escalation
- Add a second critical tier or CC the blocking task's owner on the escalation email.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01Project list
Comma list of project GIDs into an array.
EXPR.02Incomplete tasks filter
Keep only open tasks.
EXPR.03Dependency lookup URI
Asana REST dependency/tag lookup.
EXPR.04Active blockers filter
Filter dependencies array for incomplete blockers.
EXPR.05Is blocked
Blocked when an incomplete dependency or Blocked tag exists.
EXPR.06Is critical
True when the task carries the critical-path tag.
Customize & download
Generate a ready-to-import copy of this solution with your environment-variable values baked in — available on Base, Pro, or Team.
Upgrade to customize
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.