Asana AI Request Triage and Routing
When a new task lands in an Asana intake project, the flow sends the description to Azure OpenAI to classify type, priority, and effort, assigns it to the right team/owner and section, sets a due date, and posts to Teams. Low-confidence items go to a human triager. Automates request triage that would otherwise be manual.
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 automates request triage in Asana using Azure OpenAI. It polls an Asana intake project; for each new task it fetches the full description, asks Azure OpenAI to classify the request (type, priority, effort, owner, due date) with a confidence score, and then routes it: confident items are assigned, dated, moved to a section, commented, and announced in Teams; low-confidence items are moved to a manual-triage section and a human is pinged in Teams.
Why it matters: Manual triage is a bottleneck. AI classification routes the bulk of requests instantly and consistently, leaving only the ambiguous ones for a person — and every decision is recorded as a comment on the task for an audit trail.
As-built status: Built API-first as a Dataverse workflow record. Ships Off. Flow Checker = 0 errors / 1 warning (the warning is just "This flow is off"). All three connections are bound and green in the designer.
Use Case
An operations or project-management team runs a high-volume Asana intake project. Requests arrive as tasks with free-text descriptions. Rather than a person reading and routing each one, the flow classifies and routes automatically, escalating only the cases the model is unsure about. Audience: Operations, Project Managers.
Flow Architecture
When a new task is created in the intake project
Asana — OnTaskCreatedV2Polling trigger (5 min, splitOn body/data) that fires once per new intake task. Params: workspace, project.
Initialize configuration variables
Initialize VariableLoad confidence threshold, default assignee, routing guidance, OpenAI deployment, auto/triage section ids, and Teams group/channel ids from environment variables.
Get Task Details
Asana — GetTaskV2Fetch full task name, notes/description, and permalink.
Build OpenAI Messages
ComposeSystem prompt (routing guidance + required JSON schema) plus user message (task name + description).
Classify With Azure OpenAI
Azure OpenAI — ChatCompletions_Create_2024Feb15PreviewReturns a JSON object: type, priority, effort, owner_email, due_in_days, confidence, summary. Temperature 0, JSON response format.
Parse Classification
Parse JSONParse the model's JSON into typed fields.
Compute Due Date
ComposeConvert due_in_days into an absolute yyyy-MM-dd date (defaults to 3 days).
Condition: Confident Enough To Auto-Route
Condition (If)Branch on whether confidence is greater than or equal to the threshold.
Set Assignee And Due Date
HTTP — PUT /tasks/{gid}Confident branch: set assignee and due date via the Asana REST API (connector has no update-task op).
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_AsanaWorkspaceId | String | <configure> | Asana workspace for the trigger. |
| flowlibs_AsanaIntakeProjectId | String | <configure> | Intake project the trigger polls. |
| flowlibs_AsanaAutoSectionId | String | <configure> | Section for confidently routed tasks. |
| flowlibs_AsanaTriageSectionId | String | <configure> | Section for low-confidence / manual triage. |
| flowlibs_AsanaPAT | String | REPLACE_WITH_ASANA_PAT | Asana Personal Access Token (Bearer) for the HTTP write-back calls. |
| flowlibs_AzureOpenAIDeployment | String | gpt-4o | Azure OpenAI deployment/model name. |
| flowlibs_TriageConfidenceThreshold | String | 0.7 | Min confidence (0-1) to auto-route. |
| flowlibs_DefaultAssigneeEmail | String | triage@yourcompany.com | Fallback assignee when the AI has no confident owner. |
| flowlibs_RoutingGuidance | String | (routing rules text) | Owner/team routing rules injected into the AI system prompt. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Asana | shared_asana | OnTaskCreatedV2 GetTaskV2 AddCommentV2 |
| Azure OpenAI | shared_azureopenai | ChatCompletions_Create_2024Feb15Preview |
| Microsoft Teams | shared_teams | PostMessageToConversation |
| HTTP | http | PUT /tasks/{gid} POST /sections/{id}/addTask |
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.
- Tune the threshold
- Raise flowlibs_TriageConfidenceThreshold to send more borderline items to humans; lower it to auto-route more aggressively.
- Routing rules
- Edit flowlibs_RoutingGuidance to describe your teams/owners; the model uses it to choose owner_email.
- Resolve owner to gid
- Add an Asana ListUsersV2 + Filter step to map the AI's owner_email to a user gid for a guaranteed-valid assignee.
- Effort to due date
- Change Compute Due Date to derive the due offset from effort (e.g. XL = 10 days) instead of the model's due_in_days.
- Persist a record
- Add a Dataverse CreateRecord to log every classification for reporting / model-quality review.
- Richer Teams card
- Swap the HTML message for an Adaptive Card with approve/reassign buttons.
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.01Trigger task id (after splitOn)
The gid of the newly created intake task.
EXPR.02Chat messages
Array of {role, content} sent to Azure OpenAI.
EXPR.03Model output text
Raw JSON content returned by the model.
EXPR.04Confidence gate
True when the model is confident enough to auto-route.
EXPR.05Due date
Absolute due date from the model's due_in_days.
EXPR.06HTTP auth header
Bearer header for the Asana REST write-back calls.
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.