# workflow.run.completed

A workflow run ended, with `execution.status` `completed`, or `exited` when it ended on purpose before its last node.

### Exits

An exit is a handoff, or a button that switched the contact to another workflow.




**Payload for `workflow.run.completed`:**

- **test** `boolean`: Always true when present: only a sample sent by POST /v1/webhooks/test with an event carries it. Real deliveries never do.
- **id** (required) `string`: Event id, the dedupe key.
- **profiles**: `WebhookProfiles` - See schema definition
- **event** (required) `string`: No description - one of: workflow.run.started, workflow.run.completed, workflow.run.failed
- **timestamp** (required) `string` (date-time): No description
- **workflow** (required) `object`: 
  - **id** `string`: No description
  - **name** `string,null`: Null when the workflow was deleted while the run was live.
- **execution** (required) `object`: 
  - **id** `string`: Workflow run (execution) id.
  - **status** `string`: running on workflow.run.started; completed or exited (ended on purpose before the last node, e.g. a handoff) on workflow.run.completed; failed on workflow.run.failed. - one of: running, waiting, completed, exited, failed
- **conversation** (required) `object,null`: Null while a comment-triggered run has not sent the private reply that opens its conversation.
- **contact** (required) `object,null`: No description
- **trigger** (required) `object`: 
  - **type** `string,null`: The trigger node type, e.g. inbound_message (the default when the node sets none). Null when the workflow was deleted while the run was live.
  - **text** `string`: The inbound message that started the run, when there was one.
- **error** `string`: workflow.run.failed only: which node failed and why.