Featurebase webhooks support the following event topics. Subscribe to the topics you need when registering your webhook.
| Topic | Description |
|---|---|
post.created | A new post was created |
post.updated | An existing post was updated |
post.deleted | A post was successfully deleted |
post.voted | A post received a vote |
changelog.published | A new changelog entry was published |
comment.created | A new comment was created |
comment.updated | An existing comment was updated |
comment.deleted | A comment was successfully deleted |
| Topic | Description |
|---|---|
conversation.user.created | A user started a new conversation |
conversation.user.replied | A user (contact) replied to a conversation |
conversation.admin.replied | An admin replied to a conversation |
conversation.admin.noted | An admin added an internal note to a conversation |
conversation.admin.closed | An admin closed a conversation |
conversation.admin.opened | An admin reopened a conversation |
conversation.admin.snoozed | An admin snoozed a conversation |
conversation.admin.unsnoozed | A conversation was unsnoozed (manually or automatically) |
conversation.admin.assigned | A conversation was assigned to an admin or team |
conversation.priority.updated | A conversation's priority was changed |
conversation.handover_requested | An AI agent requested handover to a human agent |
conversation.deleted | A conversation was deleted |
conversation.contact.attached | A contact was added as a participant to a conversation |
conversation.contact.detached | A contact was removed from a conversation |
conversation.read | A conversation was marked as read |
conversation_part.redacted | A conversation part (message) was redacted |
Triggered when a user or admin creates a new post (feedback, feature request, bug report, etc.).
Payload includes:
object: 'post'- Type identifier- Full post details (
title,content,status,boardId) authorobject with user details- Post metadata (
slug,createdAt,upvotes)
Triggered when any field on a post is modified, including:
- Title or content changes
- Status changes (e.g., "In Review" → "Completed")
- Board changes
- Tag modifications
The changes array in the payload shows exactly what was modified. Field names use Nova conventions (e.g., boardId, status).
Triggered when a post is permanently deleted from the system.
Payload includes:
- Full post details at the time of deletion
authorinformation
Triggered when a user upvotes or removes their upvote from a post.
Payload includes:
object: 'post_vote'- Type identifieraction: Either"add"or"remove"postId: The post ID that was voted onvoter: The user who voted (either{ object: 'admin', ... }or{ object: 'contact', ... })
Triggered when a changelog entry is published (made live).
Payload includes:
object: 'changelog'- Type identifier- Full changelog details (
title,content,featuredImage) - Locale information
firstPublishInLocale: Whether this is the first publish in this localecategoriesarray with notification settings
Triggered when a new comment is posted on any post.
Payload includes:
object: 'comment'- Type identifier- Comment content and metadata
authorobject with user informationpostId: Parent post referenceparentCommentId: For replies, the parent comment ID (flat structure)isPrivate: Privacy setting
Triggered when a comment's content is modified.
Payload includes:
- Updated comment content
- The
changesarray showing what was modified
Triggered when a comment is permanently deleted.
Payload includes:
- Full comment details at the time of deletion
Conversation webhooks include conversationId and conversationUrl fields in the top-level envelope alongside the standard fields. These topics are split into two categories based on what data.item contains.
These topics send a full Conversation object as data.item, excluding the conversationParts array (individual messages are not included — use the Conversations API to fetch them if needed). Topics that represent a state change also include a data.changes array showing what fields were modified.
The data.changes array contains objects with field, oldValue, and newValue properties. Fields like updatedAt, lastActivityAt, and waitingSince are excluded from the diff.
Triggered when a user (contact or lead) starts a new conversation through the messenger or email.
data.item: Conversation objectdata.changes: Not included
Triggered when an admin closes a conversation.
data.item: Conversation object (with state: "closed")data.changes: Included (e.g., state changed from "open" to "closed")
Triggered when an admin reopens a previously closed or snoozed conversation.
data.item: Conversation object (with state: "open")data.changes: Included (e.g., state changed to "open")
Triggered when an admin snoozes a conversation until a specific time.
data.item: Conversation object (with state: "snoozed" and snoozedUntil timestamp)data.changes: Included (e.g., state changed to "snoozed")
Triggered when a snoozed conversation is unsnoozed, either manually by an admin or automatically when the snooze timer expires.
data.item: Conversation object (with state: "open")data.changes: Included (e.g., state changed from "snoozed" to "open")
Triggered when a conversation is assigned to an admin or team, or when the assignment changes.
data.item: Conversation objectdata.changes: Included (e.g., adminAssigneeId or teamAssigneeId changed)
Triggered when a conversation's priority flag is changed.
data.item: Conversation objectdata.changes: Included (e.g., priority changed from false to true)
Triggered when the AI agent determines it cannot handle the conversation and requests handover to a human agent.
data.item: Conversation object (with botConversationState: "handed_off_to_human")data.changes: Included (e.g., botConversationState changed)
Triggered when a conversation is permanently deleted.
data.item: Conversation object at the time of deletiondata.changes: Not included
Triggered when a contact is added as a participant to an existing conversation.
data.item: Conversation objectdata.changes: Included (e.g., participants changed)
Triggered when a contact is removed from a conversation's participants.
data.item: Conversation objectdata.changes: Included (e.g., participants changed)
Triggered when read receipts are updated on a conversation.
data.item: Conversation object (with updated readReceipts)data.changes: Included (e.g., readReceipts changed)
These topics send a single ConversationPart object as data.item. The specific variant depends on the partType discriminator. These topics never include data.changes.
Triggered when a contact replies to an existing conversation.
data.item: ConversationPart — either a UserMessagePart (partType: "user_msg") or an EmailMessagePart (partType: "email_msg" from a contact)
Triggered when an admin or bot sends a reply visible to the user in a conversation.
data.item: ConversationPart — an AdminMessagePart (partType: "admin_msg"), BotMessagePart (partType: "bot_msg"), or EmailMessagePart (partType: "email_msg" from an admin)
Triggered when an admin adds an internal note to a conversation. Internal notes are only visible to other admins.
data.item: ConversationPart — an AdminNotePart (partType: "admin_note")
Triggered when a conversation part (message) is redacted by an admin.
data.item: ConversationPart — the redacted part (any human message part variant with redacted: true)
Nova webhooks use the standardized API field naming:
| Resource | Key Fields |
|---|---|
| Post | boardId, status, author, tags, isPinned, createdAt, updatedAt |
| Comment | postId, parentCommentId, author, isPinned |
| Vote | postId, voter (with object: 'admin' or object: 'contact') |
| Changelog | categories (not changelogCategories) |
| Conversation | state, priority, adminAssigneeId, teamAssigneeId, participants, source, readReceipts, botConversationState |
- Handler examples - Code examples for processing webhooks