Audience
¶ Resolved once
broadcast_recipients
Product guide
Broadcasts send one campaign to many selected contacts while still creating ordinary 1:1 WhatsApp conversations. Audiences are resolved once, messages are paced deliberately, and dashboard metrics are based on the rows that actually matter.
Audience
broadcast_recipients
Pacing
60 / messages_per_minute
Each tick schedules its successor on the broadcasts queue.
Campaign lifecycle
Use the same contact selection shape as bulk actions, plus optional CSV numbers.
Resolve the audience into broadcast_recipients at create time.
The worker sends exactly one recipient per tick inside the campaign's send window.
Each recipient gets a normal outbound message row in their own conversation.
Delivery, replies, tags, and attention items are derived from dashboard-safe sources.
Sending model
ReplyBox sends each recipient an ordinary 1:1 chat, so replies land in the inbox naturally.
The original filter is not rerun after create time, even if tags or assignees change later.
Campaigns can send a plain message with variables and attachment, or start a Message Flow per recipient.
Windows are stored as local minutes plus an IANA timezone, including overnight windows.
broadcast:read, broadcast:manage, and broadcast:delete gate access.
Campaigns are capped at 50k recipients so pacing and reporting stay predictable.
Dashboard
GET /broadcasts/dashboard drives the headline tiles, table/calendar surface, outcome bar, and attention rail together so the same campaign cannot report different truths in different panels.
messages.status
Repliesmaintained counter
Tagssaved audience filter
Attentionderived per request
Metrics rules
record_replies counter.sent_count only means handed to the connector; it is not delivery.Failure model
BROADCAST_SWEEP_SECONDS.Operator guardrails
MAX_RECIPIENT_ATTEMPTS
Deploy no connector change for orchestration-only worker changes
Use receipt-backed delivery, not send counters
Replies are inbox conversations, not a separate broadcast channel