conversation.updated
Fires when a conversation's fields change in SparrowDesk
Fires when a conversation's fields change — for example its priority, assignment, subject, or tags. The event fires on any persisted change, so a trivial edit produces an event too.
The payload carries the full current conversation object plus a previousAttributes object listing only the fields that changed, each holding its prior value. This makes the event self-contained: you can apply it idempotently (keyed on the event id) and tolerate out-of-order delivery (reconcile via last_updated_at) without re-fetching from the API.
For the envelope fields, see The webhook request.
Example payload
{
"id": "evt_019f40d93c217e27b19dce3b9c00e65f",
"eventType": "conversation.updated",
"timestamp": "2026-07-08T08:30:06.439Z",
"accountId": "1001",
"payload": {
"conversation": {
"id": "11",
"brand": "Acme Support",
"brand_id": 5069,
"source": "Mail",
"status": "Pending",
"priority": "Urgent",
"created_at": 1780467362,
"first_response_time": 1780467379,
"resolution_time": null,
"due": null,
"first_response_due": null,
"requested_by_email": "[email protected]",
"requested_by_phone": null,
"requested_by_id": 4254678,
"assigned_to_member_id": 8544,
"assigned_to_team_id": 2312,
"last_updated_at": 1783499406,
"subject": "Billing question",
"description_html": "<p>Hi, I think I was charged twice this month.</p>",
"description_text": "Hi, I think I was charged twice this month.",
"tags": [
{
"id": 1850,
"label": "billing"
}
],
"custom_fields": [],
"csat": {
"score": null,
"sentiment": null,
"feedback": null,
"scale": null
},
"properties": null
},
"previousAttributes": {
"priority": "Medium"
},
"actor": {
"type": "agent",
"id": 8544
}
},
"webhookMetadata": {
"webhookTargetId": "1",
"deliveryAttemptId": "019f40d93c67707b809cf266c6a51710",
"deliveryAttemptNumber": 1
}
}Payload fields
| Field | Type | Description |
|---|---|---|
conversation | object | The full current conversation object. See the field reference on conversation.created. |
previousAttributes | object | Only the fields that changed, each holding its prior value. Unchanged fields are absent. In the example above, priority changed from Medium to the current Urgent; nothing else changed. |
actor | object | Who made the change: { "type": string, "id": number }. |
The actor object
| Field | Type | Description |
|---|---|---|
type | string | user (a customer), agent (a human agent), or zoona (SparrowDesk's AI agent — appears only if your workspace has the Zoona AI add-on). |
id | number | ID of the user, agent, or AI agent that made the change. |
For nested objects such as custom fields, previousAttributes carries the changed sub-object as a whole (the entire prior value), not a per-field diff.
Related events
conversation.status_changed— fires specifically on status transitionscontact.updated— the samepreviousAttributesconvention for contacts