# Every offered webhook event now actually fires

**Category:** [Webhooks](https://help.totalctrl.app/hc/totalctrl/totalctrl-help-center/en-US/categories/platform-webhooks)
**Updated:** 2026-10-04

## What was wrong

The webhook subscription page offered a list of events to tick. For thirty-three of them, nothing in TotalCtrl ever sent one. You could subscribe, save, and wait indefinitely — and there was no way to tell that apart from a quiet week.

## What now fires

AppEvents
Ad ManagerCampaign created (discovered by a sync), budget updated, sync completed, audience synced, pixel event received
Agent InboxAll four cross-app signals: at-risk customer, delivery risk, revenue at risk, support cascade
API HubSpec synced from GitHub, SDK build ready, SDK build failed
AccountingInvoice voided, payment received
AI Chat AgentConversation resolved
CCMSTopic updated, publication updated
ContactsCustom field created and deleted, contacts imported
CreatorCampaign archived
Digital AssetsAsset shared
Help CenterCategory created, updated and deleted
Meeting CalendarBooking created, booking rescheduled
NewsletterEdition scheduled, edition cancelled
Personal FinanceTransactions synced
Product CatalogVariant updated and deleted, feed generated
Project ManagerComment posted on a task
Prompt ManagerLibrary updated, evaluation run failed
Time TrackingTime logged, budget threshold crossed
UsersUser created
WikiConfluence import completed

## Two changed name

**Bookings.** The public booking page was sending `calendar.booking_created`, with an underscore, while the picker offered `calendar.booking.created` with a dot. Since essentially every booking is made through that page, "a booking was created" was the one thing your booking webhook could never tell you about. It now sends the name you subscribed to.

**Newsletter.** Three events were named `newsletter.issue.*`, but there is no such thing as an issue here — the object is an **edition**, and `newsletter.edition.sent` already existed and worked. `newsletter.issue.sent` was a duplicate of it and has been removed; the other two are now `newsletter.edition.scheduled` and `newsletter.edition.cancelled`. None of the three could ever be delivered, so nothing you have set up changes.

## Things worth knowing about the new ones

- **Contacts imported** and **transactions synced** fire *once per batch*, with counts. A webhook per row would mean four thousand deliveries from one CSV.

- **Payment received** fires per payment, and only for money arriving. A refund or a payout is a different direction and does not borrow the name.

- **Budget threshold** fires on the crossing, once — not on every hour logged after a project passes 80%.

- **Conversation resolved** means the visitor confirmed the answer was right. The model ending a chat, an idle timeout and a teammate closing a tab are three other things, and none of them is a resolution.

- **Topic updated** fires when a version is saved, not while you type — the editor autosaves every few seconds.

- **Asset shared** does not carry the access token. A webhook body is stored in a delivery log and posted to a URL somebody typed into a form; a share credential belongs in neither.

---

## Related Articles

- [Every offered webhook event now actually fires](https://help.totalctrl.app/en-US/articles/webhooks-all-events-live-1)
- [Webhook signature checks that fail, and why](https://help.totalctrl.app/en-US/articles/webhooks-signature-troubleshooting)
- [Events you can now subscribe to that you could not before](https://help.totalctrl.app/en-US/articles/webhooks-newly-available-events)
- [Events you can now subscribe to that you could not before](https://help.totalctrl.app/en-US/articles/webhooks-newly-available-events-1)
- [Issue events now fire for issues created through the API](https://help.totalctrl.app/en-US/articles/webhooks-issues-api-event-names)

---
[← Back to TotalCtrl Help Center](https://help.totalctrl.app/en-US/)