--- title: Topic types | Featurebase description: All available webhook event topics in Featurebase. --- Featurebase webhooks support the following event topics. Subscribe to the topics you need when registering your webhook. ## Available topics ### Feedback & changelog topics | 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 | ### Conversation topics | 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 | ## Post events ### post.created 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`) - `author` object with user details - Post metadata (`slug`, `createdAt`, `upvotes`) ### post.updated 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`). ### post.deleted Triggered when a post is permanently deleted from the system. **Payload includes:** - Full post details at the time of deletion - `author` information ### post.voted Triggered when a user upvotes or removes their upvote from a post. **Payload includes:** - `object: 'post_vote'` - Type identifier - `action`: Either `"add"` or `"remove"` - `postId`: The post ID that was voted on - `voter`: The user who voted (either `{ object: 'admin', ... }` or `{ object: 'contact', ... }`) ## Changelog events ### changelog.published 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 locale - `categories` array with notification settings ## Comment events ### comment.created Triggered when a new comment is posted on any post. **Payload includes:** - `object: 'comment'` - Type identifier - Comment content and metadata - `author` object with user information - `postId`: Parent post reference - `parentCommentId`: For replies, the parent comment ID (flat structure) - `isPrivate`: Privacy setting ### comment.updated Triggered when a comment’s content is modified. **Payload includes:** - Updated comment content - The `changes` array showing what was modified ### comment.deleted Triggered when a comment is permanently deleted. **Payload includes:** - Full comment details at the time of deletion ## Conversation events 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. ### Conversation-level topics 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. #### conversation.user.created Triggered when a user (contact or lead) starts a new conversation through the messenger or email. **`data.item`:** `Conversation` object\ **`data.changes`:** Not included #### conversation.admin.closed 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"`) #### conversation.admin.opened 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"`) #### conversation.admin.snoozed 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"`) #### conversation.admin.unsnoozed 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"`) #### conversation.admin.assigned Triggered when a conversation is assigned to an admin or team, or when the assignment changes. **`data.item`:** `Conversation` object\ **`data.changes`:** Included (e.g., `adminAssigneeId` or `teamAssigneeId` changed) #### conversation.priority.updated Triggered when a conversation’s priority flag is changed. **`data.item`:** `Conversation` object\ **`data.changes`:** Included (e.g., `priority` changed from `false` to `true`) #### conversation.handover\_requested 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) #### conversation.deleted Triggered when a conversation is permanently deleted. **`data.item`:** `Conversation` object at the time of deletion\ **`data.changes`:** Not included #### conversation.contact.attached Triggered when a contact is added as a participant to an existing conversation. **`data.item`:** `Conversation` object\ **`data.changes`:** Included (e.g., `participants` changed) #### conversation.contact.detached Triggered when a contact is removed from a conversation’s participants. **`data.item`:** `Conversation` object\ **`data.changes`:** Included (e.g., `participants` changed) #### conversation.read Triggered when read receipts are updated on a conversation. **`data.item`:** `Conversation` object (with updated `readReceipts`)\ **`data.changes`:** Included (e.g., `readReceipts` changed) ### Message-level topics These topics send a single **ConversationPart** object as `data.item`. The specific variant depends on the `partType` discriminator. These topics **never** include `data.changes`. #### conversation.user.replied 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) #### conversation.admin.replied 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) #### conversation.admin.noted 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"`) #### conversation\_part.redacted 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 field naming conventions 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` | ## Next steps - **Handler examples** - Code examples for processing webhooks