# contact.updated (/webhooks/events/contact-updated)

Fires when a contact's fields change. The event fires on any persisted change, so a trivial edit produces an event too.

The payload carries the **full current contact object** plus a `previousAttributes` object listing only the fields that changed, each holding its prior value. This makes the event self-contained: you can upsert it into your own system idempotently (keyed on the event `id`) and tolerate out-of-order delivery (reconcile via `updated_at`) without re-fetching from the API.

For the envelope fields, see [The webhook request](/webhooks#the-webhook-request).

## Example payload

```json
{
  "id": "evt_019f41a1cb517b9cbbecd606550a5d84",
  "eventType": "contact.updated",
  "timestamp": "2026-07-08T12:09:10.256Z",
  "accountId": "1001",
  "payload": {
    "contact": {
      "id": 4296206,
      "first_name": "Jordan",
      "last_name": "Rivera",
      "full_name": "Jordan Rivera",
      "email": "jordan.rivera@example.com",
      "phone": "+1 555 0100",
      "language": null,
      "time_zone": null,
      "country": null,
      "region": null,
      "city": null,
      "active": true,
      "unsubscribed": false,
      "blocked": false,
      "avatar": null,
      "company_id": null,
      "company_name": null,
      "custom_fields": {},
      "properties": {
        "initial_avatar_color": {
          "backgroundColor": "linear-gradient(0deg, rgba(255, 255, 255, 0.75) 0%, rgba(255, 255, 255, 0.75) 100%)",
          "textColor": "linear-gradient(180deg, #C083D8 0%, #9830C2 100%)"
        }
      },
      "created_at": 1783512490,
      "updated_at": 1783512548
    },
    "previousAttributes": {
      "last_name": "",
      "full_name": "Jordan",
      "email": "jordan@example.com"
    }
  },
  "webhookMetadata": {
    "webhookTargetId": "38",
    "deliveryAttemptId": "019f41a1cb6f739992c6129bd5693cca",
    "deliveryAttemptNumber": 1
  }
}
```

## Payload fields

| Field                | Type   | Description                                                                                                                                                                                               |
| -------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `contact`            | object | The full current contact object. See the field reference on [`contact.created`](/webhooks/events/contact-created#the-contact-object).                                                                     |
| `previousAttributes` | object | Only the fields that changed, each holding its **prior** value. Unchanged fields are absent. In the example above, the contact's last name and email changed; `phone` is absent because it didn't 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

* [`contact.created`](/webhooks/events/contact-created) — a new contact is created
* [`contact.deleted`](/webhooks/events/contact-deleted) — a contact is deleted
* [`conversation.updated`](/webhooks/events/conversation-updated) — the same `previousAttributes` convention for conversations
