Send a message in bulk β
Use bulk send-message when you have an announcement, a service reminder, or a follow-up that should land in a whole slice of members at once. The bulk action hands off to the same messaging engine that powers single-member sends, so templates, variables, opt-out handling, and channel routing all work the same way.

Open the composer β
From the member list, build your selection, open the More actions dropdown in the action bar, and click Send message. The standard message composer opens, pre-populated with the selection count in the recipient pill.
Pick a channel β
The composer offers every channel your org has configured:
| Channel | Setup | Speed |
|---|---|---|
| Requires an approved WhatsApp Business sender | Near-instant per message | |
| SMS | Requires a Twilio (or equivalent) configuration | Near-instant |
| Requires a verified sender domain | Seconds-to-minutes |
If a channel isn't configured, the option is hidden. See Messaging for the per-channel setup.
TIP
For announcements that aren't time-critical, email is the cheapest path per message. For service-day reminders, WhatsApp or SMS land in the lockscreen and get read.
Draft the body β
You can:
- Type the body inline β supports variables like
andrendered per recipient at send time. - Pick a template β the dropdown shows every approved template for the chosen channel. Templates are required for WhatsApp.
- Schedule for later β drop a date and time; the action sits in
queueduntil the schedule fires.
The composer flags any recipient whose channel isn't reachable (no phone, opted out of SMS, invalid email). They show up as failures in the bulk action's failed-items list when the send finishes.
How the bulk send actually runs β
Send-message is a delegated bulk action. That means:
- The bulk action row is created and flips to
processing. - The edge function hands off the target IDs + message body to the
send-messagefunction withsource: "bulk_action"and the bulk action's ID. - The
send-messagefunction fans out into per-recipientmessage_logsrows, each routed through the right channel adapter. - The bulk action row flips to
delegated. A reconcile cron tracks how many of the messages have landed and updatessuccess_count/failed_countas deliveries come back.
WARNING
A delegated bulk action stays in that status until the messaging queue finishes. For large WhatsApp sends, that can stretch over minutes or hours depending on your sender's rate limits. The progress bar updates as deliveries are acknowledged.
Opt-out handling β
Recipients who have unsubscribed from a channel are filtered out before the queue is built. They appear in the failed-items list with the reason "Opted out of [channel]," but they don't count as errors against you β opt-outs are a hard signal you should respect.
The opt-out applies per channel. A member who opted out of SMS can still receive email; the bulk action handles each channel independently.
See Channels and unsubscribe for the opt-out model in detail.
Tracking the conversation β
Every bulk message lands in the Communication log (Messaging β Communication log) tagged with source: bulk_action and the bulk action's ID. That gives you:
- A single timeline per recipient showing what they received.
- A reverse-lookup from a recipient's reply back to the originating bulk action.
- Aggregate delivery rates per bulk send β useful for "did the announcement land?"
Two-way replies β
WhatsApp and SMS replies route into the Conversations inbox. The reply is linked back to the bulk action that sent the prompt, so when Mary replies "I'll be there" to the service reminder, you can see which campaign she's responding to without scrolling.
Email replies follow normal email β they go to the configured reply-to address, not the conversations inbox.
Permissions β
| Action | Required permission |
|---|---|
| Open send-message in the action bar | members.edit AND messaging.send |
| Use a non-approved template | messaging.template_override |
| Schedule for later | Same as immediate send |
Without messaging.send, the option is hidden from the dropdown entirely.
Common questions β
What's the rate limit? Per-org rate limit is 10 bulk-action invocations per minute. Per-channel throughput is governed by your sender configuration β see WhatsApp, SMS, Email.
Can I cancel mid-send? Yes, but only for sends still in queued. Once it flips to delegated, messages are being dispatched and individual ones can't be recalled.
Where do the failures end up? In the bulk action's failed-items table, with the per-recipient error (no phone, opted out, template rejected, etc.). You can retry β but for opt-outs, retrying re-fails.
Next steps β
- Monitoring and retries β track the delegated send.
- Conversations β handle the replies.
- Channels and unsubscribe β manage opt-outs.