Event
trigger.asana_event
TriggerBusiness appsconnection requiredruns in-engine
Registers an Asana webhook on publish and starts one run per delivered event, verified against Asana's X-Hook-Signature.
Start a run when Asana reports a change to a task, project or workspace.
Connection
- Required
- Yes — the node will not save without one
- Auth type
- Bearer token
- Providers
- Asana
- Secret shape
- the Asana personal access token, or an OAuth access token
- Resolved by
- config.connection_id, else node.connection_id
- Note
- An OAuth token needs the webhooks:write scope (webhooks:read to reconcile). Publishing also needs MANTLE_APP_PUBLIC_BASE_URL set to a public https URL — Asana refuses a target it cannot reach, and answers 403 for hostnames like localhost.
Configuration
3 fields, 2 required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.
| Field | Type | Required | Default | Constraints | Example |
|---|---|---|---|---|---|
workspace Gid of the workspace the resource belongs to. Asana requires it to list webhooks, which is how publishing finds and clears a subscription an earlier half-finished publish left behind. | string | Yes | — | matches ^\d+$ | 1201234567890123 |
resource Gid of the resource to watch — a task, project, workspace, portfolio or team. A project reports events for the tasks inside it; a workspace, portfolio, team or goal REQUIRES filters below. | string | Yes | — | matches ^\d+$ | 1209876543210987 |
filters Whitelist of events to deliver, as Asana filter objects: [{"resource_type": "task", "action": "changed", "fields": ["due_on"]}]. An event passes if it matches any filter. Leave empty on a task or project to receive everything; Asana refuses a workspace, portfolio, team or goal webhook with no filters. | array | No | — | ≤ 50 characters; array of object | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"resource": "1209876543210987",
"workspace": "1201234567890123"
}Output
One shape.
asana event
One flattened Asana event. Asana's events are thin by design — read the full record with an asana.* node when you need it.
Extra keys beyond the ones listed can appear.
| Field | Type | Example |
|---|---|---|
action What happened to the resource: added, changed, removed, deleted or undeleted. Branch on this when one webhook watches several actions. | string | changed |
resource_gid Gid of the resource the event is about — the task, project or story that changed, which is NOT always the resource the webhook subscribes to (a project webhook reports its tasks). | string | 12345 |
resource_type That resource's Asana type, e.g. task, project, story. | string | task |
resource_name The resource's name when Asana sent one; empty otherwise. Asana's webhook events are deliberately thin, so treat this as a hint and read the record with an asana.* node when you need its fields. | string | — |
user_gid Gid of the user whose action raised the event, or empty when Asana raised it itself (a rule, a recurring task rolling over). | string | 987654 |
parent_gid On added/removed events, the gid of the container the resource was added to or removed from. Empty on every other action. | string | — |
parent_type That container's Asana type, e.g. project. | string | — |
created_at When Asana recorded the change (ISO 8601, milliseconds). | string | 2012-02-22T02:06:58.147Z |
change_field On a 'changed' event, the name of the field that changed, e.g. assignee. Empty on every other action. | string | assignee |
change Asana's change block — {field, action, new_value | added_value | removed_value}. Empty on any action other than 'changed'. | object | — |
payload The Asana event exactly as delivered, for anything the fields above do not lift out. | object | — |
{
"action": "changed",
"change": {
"action": "changed",
"field": "assignee",
"new_value": {
"gid": "987654"
}
},
"change_field": "assignee",
"created_at": "2012-02-22T02:06:58.147Z",
"parent_gid": "",
"parent_type": "",
"payload": {
"action": "changed",
"change": {
"action": "changed",
"field": "assignee"
},
"created_at": "2012-02-22T02:06:58.147Z",
"resource": {
"gid": "12345",
"resource_type": "task"
},
"user": {
"gid": "987654",
"resource_type": "user"
}
},
"resource_gid": "12345",
"resource_name": "Ship the release notes",
"resource_type": "task",
"user_gid": "987654"
}Notes
- Publishing creates the webhook in Asana; unpublishing, disabling or archiving deletes it. A workflow that is off is off at Asana too.
- Asana confirms the target while the create call is in flight: it POSTs an X-Hook-Secret that Mantle echoes back, and that value signs every later delivery. Asana never reveals it again.
- Deliveries are verified against X-Hook-Signature before any run starts; an unsigned or mis-signed POST is refused with 401.
- Asana sends no event id, so a redelivery is deduped on a digest of the event's own fields. Two identical events in the same millisecond would start one run, not two.
- Asana deletes a webhook after 24 hours with no successful delivery — including of its 8-hourly heartbeat. Publish again to re-register.
See Event run in a workflow.
In a technical demo we add the Asana connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.