Skip to content

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.

Bulk message composer

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:

ChannelSetupSpeed
WhatsAppRequires an approved WhatsApp Business senderNear-instant per message
SMSRequires a Twilio (or equivalent) configurationNear-instant
EmailRequires a verified sender domainSeconds-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 and rendered 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 queued until 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:

  1. The bulk action row is created and flips to processing.
  2. The edge function hands off the target IDs + message body to the send-message function with source: "bulk_action" and the bulk action's ID.
  3. The send-message function fans out into per-recipient message_logs rows, each routed through the right channel adapter.
  4. The bulk action row flips to delegated. A reconcile cron tracks how many of the messages have landed and updates success_count / failed_count as 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 ​

ActionRequired permission
Open send-message in the action barmembers.edit AND messaging.send
Use a non-approved templatemessaging.template_override
Schedule for laterSame 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 ​