• Customermates logo
    CustomermatesDocumentation
  • Introduction
  • Comparison
Getting Started
  • Quickstart
  • Core Concepts
  • From Pipedrive
Integrations
  • Introduction
  • MCP
  • Connect Claude Desktop
  • Connect ChatGPT
  • Connect Cursor
  • Webhooks
  • OpenAPI 3.1.0
  • N8N
Self-Hosting
  • Self-Hosted vs Cloud
  • Get Started
  • Managing Your Installation
  • Architecture & Security
Reference
  • Setup AI Assistant
  • MCP Tool Catalog
  • Webhook Events
  • Filter Syntax
  • API Keys
  • Go back
  1. Introduction
  2. Webhook Events

Webhook event catalog

Every event Customermates emits, when it fires, and the payload shape.

TL;DR — 15 events across the five entity types, all with the same predictable envelope. *.updated events include a changes record so you can act on diffs without comparing state.

Envelope

Every delivery follows the same shape:

{
  "event": "<event-name>",
  "data": {
    "userId": "<who-triggered-it>",
    "companyId": "<tenant>",
    "entityId": "<affected-record>",
    "payload": { /* event-specific */ }
  },
  "timestamp": "<iso-8601>"
}

The userId is the user that caused the write, which includes a user acting through an API key.

Event list

EventWhen it firesPayload keys
contact.createdA contact is created via UI, API, MCP, or importcontact
contact.updatedAny contact field changescontact, changes
contact.deletedA contact is deletedcontactId
organization.createdAn organization is createdorganization
organization.updatedAny organization field changesorganization, changes
organization.deletedAn organization is deletedorganizationId
deal.createdA deal is createddeal
deal.updatedAny deal field changesdeal, changes
deal.deletedA deal is deleteddealId
service.createdA service is createdservice
service.updatedAny service field changesservice, changes
service.deletedA service is deletedserviceId
task.createdA task is createdtask
task.updatedAny task field changestask, changes
task.deletedA task is deletedtaskId

Payload example: contact.updated

{
  "event": "contact.updated",
  "data": {
    "userId": "u_123",
    "companyId": "c_abc",
    "entityId": "ct_xyz",
    "payload": {
      "contact": {
        "id": "ct_xyz",
        "firstName": "Max",
        "lastName": "Mustermann",
        "notes": { /* Tiptap JSON */ },
        "organizationIds": ["org_1"],
        "userIds": [],
        "dealIds": ["deal_1", "deal_2"],
        "customFieldValues": [
          { "columnId": "col_stage", "value": "won" }
        ]
      },
      "changes": {
        "organizationIds": {
          "previous": [],
          "current": ["org_1"]
        }
      }
    }
  },
  "timestamp": "2026-04-22T10:00:00.000Z"
}

The changes record

Each key in changes is a field name whose value moved. previous is what was there before, current is what is there now.

Arrays of relationship ids compare as sets. Objects compare by deep equality. Scalar fields compare by value.

If a write does not actually change any field, the event is suppressed. You will not see no-op *.updated events.

Notes are JSON, not markdown

The notes field in payloads is Tiptap JSON, the same structure the editor stores. To render as markdown on your side, run it through a Tiptap-compatible serializer. In MCP tools, get_entities with include: "withNotes" returns notes pre-serialized to markdown.

Deleted payloads

Delete events carry only the id, not the final state of the record. If you need the final state for a delete hook (for archiving, say), subscribe to *.updated as well and keep a local mirror.

Next

  • Webhooks overview — subscribe, verify, retry.
  • MCP tool catalog — manage webhooks from your AI.
Envelope
Event list
Payload example: contact.updated
The changes record
Notes are JSON, not markdown
Deleted payloads
Next