Skip to content
Dashboard

Consuming webhooks

How to parse and handle incoming Featurebase webhook payloads.

When your app receives a webhook request from Featurebase, check the topic attribute to see what event caused it. The first part of the event type will tell you the payload type, e.g., a post, comment, etc.

{
"id": "notif_0193a6e6-fb6b-78ef-b71f-15008d9f9cde",
"object": "notification_event",
"topic": "post.updated",
"data": {
"object": "notification_event_data",
"item": {
"id": "6755c4afb12a37dffa6319b0",
"object": "post",
"title": "My new title"
},
"changes": [
{
"field": "title",
"oldValue": "My old title",
"newValue": "My new title"
}
]
}
}

In the example above, a post was updated, and the payload type is a notification_event_data. Notice how the changes array contains the old and new values for the changed fields.

Each webhook event includes:

FieldDescription
objectAlways "notification_event"
idUnique identifier for the webhook event (prefixed with notif_)
topicThe specific event type
organizationIdYour organization’s unique identifier
webhookIdID of the webhook configuration
createdAtTimestamp when the event occurred
deliveryStatusCurrent delivery status of the webhook
conversationIdShort ID of the conversation (conversation topics only)
conversationUrlDirect link to the conversation in the dashboard (conversation topics only)
dataContains the event details
data.objectAlways "notification_event_data"
data.itemThe resource that triggered the event
data.changesFor update events, an array of { field, oldValue, newValue } objects showing changes

The data.item object structure varies based on the event type. For conversation topics, it is either a full Conversation object (for conversation-level topics) or a single ConversationPart object (for message-level topics). See Topic types for details on which topics send which object.

Nova webhook payloads use the standardized API format:

AspectNova Format
Type identifierobject: 'resource_name'
Board referenceboardId
Authorauthor: { id, name, profilePicture }
Statusstatus: { object: 'post_status', ... }
Tagstags: [...]
Comments enabledfeatures.commentsEnabled
Access controlaccess.userIds, access.companyExternalIds
TimestampscreatedAt, updatedAt
PinnedisPinned
{
"object": "notification_event",
"id": "notif_0193a70c-3015-757c-a260-22ae37c86608",
"topic": "post.updated",
"organizationId": "6595518396205e06b897ad65",
"webhookId": "675346db13af7340748ce850",
"createdAt": "2024-12-08T16:13:34.102Z",
"deliveryStatus": "pending",
"data": {
"object": "notification_event_data",
"item": {
"object": "post",
"id": "67546dfb6e1363426b90707f",
"title": "New title",
"content": "<p>New content</p>",
"boardId": "6755d0970b5d5b1fefdf54f4",
"status": { "object": "post_status", "name": "Completed", "color": "Green", "type": "completed" },
"author": { "id": "5fef50c5e9458a0012f82456", "name": "Admin", "email": "admin@example.com" },
"createdAt": "2024-12-08T17:06:30.577Z",
"updatedAt": "2024-12-08T17:06:30.577Z"
},
"changes": [
{ "field": "title", "oldValue": "Old title", "newValue": "New title" },
{ "field": "content", "oldValue": "<p>Old content</p>", "newValue": "<p>New content</p>" }
]
}
}

Conversation-level topics (like conversation.admin.closed) send a full Conversation object as data.item and may include a data.changes array. The conversationParts array is not included in webhook payloads — use the Conversations API to fetch messages if needed. The envelope also includes conversationId and conversationUrl.

{
"object": "notification_event",
"id": "notif_0194b7f8-ac3d-79ef-c82g-26119e0a0def",
"topic": "conversation.admin.closed",
"organizationId": "6595518396205e06b897ad65",
"conversationId": "12345",
"conversationUrl": "https://yourorg.featurebase.app/dashboard/inbox/all/conversation/12345",
"webhookId": "675346db13af7340748ce850",
"createdAt": "2025-06-15T14:22:01.000Z",
"deliveryStatus": "pending",
"data": {
"object": "notification_event_data",
"item": {
"object": "conversation",
"id": "12345",
"title": "Help with billing",
"state": "closed",
"priority": false,
"adminAssigneeId": "5fef50c5e9458a0012f82456",
"teamAssigneeId": null,
"participants": [{ "type": "customer", "id": "507f1f77bcf86cd799439012" }],
"source": { "object": "message_source", "bodyHtml": "<p>I need help with my billing.</p>" },
"readReceipts": [],
"createdAt": "2025-06-15T14:00:00.000Z",
"updatedAt": "2025-06-15T14:22:00.000Z"
},
"changes": [{ "field": "state", "oldValue": "open", "newValue": "closed" }]
}
}

Message-level topics (like conversation.admin.replied) send a single ConversationPart as data.item. They never include data.changes. The specific part variant depends on the partType discriminator.

{
"object": "notification_event",
"id": "notif_0194b802-1a5f-79ef-d93h-37220f1b1egh",
"topic": "conversation.admin.replied",
"organizationId": "6595518396205e06b897ad65",
"conversationId": "12345",
"conversationUrl": "https://yourorg.featurebase.app/dashboard/inbox/all/conversation/12345",
"webhookId": "675346db13af7340748ce850",
"createdAt": "2025-06-15T14:22:01.000Z",
"deliveryStatus": "pending",
"data": {
"object": "notification_event_data",
"item": {
"object": "conversation_part",
"id": "3",
"partType": "admin_msg",
"bodyHtml": "<p>I've updated your billing details.</p>",
"bodyMarkdown": "I've updated your billing details.",
"channel": "messenger",
"author": { "type": "admin", "id": "5fef50c5e9458a0012f82456", "name": "Support Agent" },
"redacted": false,
"createdAt": "2025-06-15T14:22:00.000Z",
"updatedAt": "2025-06-15T14:22:00.000Z"
}
}
}
  • Topic types - View all available webhook event types