All documentation
Reference

Webhooks: Payload, Projects and Event Filters

Understand the webhook envelope, project isolation, channel identity and exact event filtering.

Text

Overview

PulseGrid wraps every webhook event in a consistent envelope. Important fields: - delivery_id: identifies the delivery to this endpoint and stays stable across retries. - id: identifies the original PulseGrid event. - event: event name such as message or delivery.updated. - project: project that produced the event. - channel: realtime channel where it happened. - sender: publishing identity. - data: application event content. - meta: supporting context. - source: how PulseGrid received the event. - sent_at: UTC timestamp. One original event can be delivered to several endpoints. The event ID stays the same while each endpoint delivery has its own delivery_id.

Setup

Endpoint selection requires: 1. endpoint project matches event project, 2. endpoint is active, 3. event filter is * or includes the exact event name, 4. project webhook allowance remains available. Examples: - Alpha endpoint + Alpha message + * = delivered. - Alpha endpoint + Beta message = not delivered. - Alpha endpoint + Alpha order.paid + message-only filter = not delivered. Recommended event names: chat.message.created customer.created order.created order.paid payment.failed delivery.updated driver.location.updated

Code example

Webhooks: Payload, Projects and Event Filters
JSON
{
  "delivery_id": "afa3e157-1268-4ec0-977f-4556484722a0",
  "id": "05afc0c0-66a2-4ce3-9bbf-dcbc2abc2b47",
  "event": "delivery.updated",
  "project": {
    "id": "PROJECT_UUID",
    "name": "Demo",
    "slug": "demo"
  },
  "channel": {
    "id": "CHANNEL_UUID",
    "name": "Live Operations",
    "slug": "live-operations"
  },
  "sender": {
    "identifier_id": "node_dispatch",
    "identifier_label": "Node Dispatch"
  },
  "data": {
    "order_id": "ORD-1042",
    "status": "in_transit"
  },
  "meta": {"source": "dispatch_app"},
  "source": "api",
  "sent_at": "2026-08-29T20:58:51.861643+00:00"
}

Notes

The payload timestamp is UTC. Do not infer local timezone from it without explicit conversion. A skipped non-matching event is not a failed delivery because PulseGrid never attempted to send it.