broadcast.* events
Message broadcast lifecycle: when a send starts, and what it delivered.
Message broadcast lifecycle: when a send starts, and what it delivered. Fires when a creator sends a message to a segment of their members through the project's connector. Two events bracket every send: one as it starts, carrying the audience and how many members it will reach, and one when it finishes, carrying the delivered and failed tallies.
Both fire for broadcasts started anywhere: the dashboard, the bot, the REST API, a Zap or an n8n workflow. They are emitted by the sending job rather than by each entry point, so a broadcast triggered by automation is indistinguishable from one typed into the dashboard.
| Event | Fires when |
|---|---|
broadcast.queued | A broadcast started sending, with its audience and recipient count. |
broadcast.completed | The send finished, with delivered and failed tallies. |
Audience segments
The audience field on both events is one of:
| Value | Reaches |
|---|---|
all | Every member with a linked chat |
customer | Paying members |
trialing | Members on a trial |
lead | Members who started the bot but never subscribed |
churned | Members whose subscription ended |
expiring_soon | Members whose access lapses inside expiring_within_days |
cancelled_still_active | Members who turned renewal off but have time left |
paused | Members whose subscription is paused rather than ended |
trialing_cardless | Members on a trial with no card on file |
all_pass_holders | Holders of any currently-active pass window |
all_pass_holders_not_in_queue | As above, but only those who have not tapped their invite yet |
pass_holders | Holders of one named window |
pass_holders_not_in_queue | Holders of one named window who have not queued |
The two single-window pass segments carry a pass_window_id; every other segment reports pass_window_id: null. The four pass segments require the passes capability: a project whose plan no longer includes it cannot address them, and the API refuses the send rather than silently reaching nobody.
expiring_soon reports the horizon it used in expiring_within_days; every other segment reports null. Note that an auto-renewing subscription is never in this segment: a subscription's end date is rewritten on every renewal, so a date alone would describe the next invoice rather than an expiry.
Narrowing by plan
Any segment except lead and the four pass segments can be narrowed to a single plan, and both events then carry that plan in data.plan_id. It composes with the segment rather than replacing it: customer plus a plan means people paying for that plan right now, churned plus a plan means people who held it and left. Segments that cannot be narrowed always report plan_id: null.
This matters for a consumer that counts sends per audience: two broadcast.completed events can now carry the same audience and describe different populations, and plan_id is what tells them apart.
A member is only ever a recipient if they have a chat on that project's bot. Members with no chat, or whose chat belongs to a different bot, are excluded, which is why a recipient count is often well below a project's total membership.
The message body is never in the payload
Neither event carries the text that was sent. Broadcasts are not stored (a broadcast is a send, not a record) and a body is arbitrary creator content up to 4096 characters. Repeating it on every subscribed endpoint would hand it to integrations that only need to know a send happened.
If you need the copy alongside the outcome, send the broadcast through the REST API or a Zap and correlate on project_id and created_at.
What does not emit
A broadcast that is refused never emits either event, because nothing was sent:
- the project has no connected bot
- the audience is unknown
- the body is empty once reduced to the connector's HTML subset
- a pass segment was requested by a project whose plan no longer includes passes
- a single-window segment was requested with no window
The REST API and MCP tool reject all of these up front with a validation error. The dashboard and bot paths log and abort.
Required ability
Tokens subscribing to broadcast.* events must carry broadcast:send at mint time. There is no separate read ability: knowing that a broadcast went out, to whom and how many, is the same privilege as being able to send one.
Events
broadcast.queued
A broadcast started sending, carrying the audience it resolved to and how many members it will reach.
broadcast.completed
A broadcast finished sending, carrying the delivered and failed tallies.
Compare with the current pages
How is this guide?