Features

Compose & send

Targeting an audience, attaching media, varying your message per group, reading the delivery preview, scheduling, and watching a send go out live.

Open Compose

Compose is the send form: pick who, write what, check the preview, go. It unlocks once you've tagged at least one group.

Targeting#

Three ways to say who gets it, in increasing order of precision:

  • A preseteveryone, internal. Bundles of tags you defined on the Groups page.
  • One or more tagsfirst-year, alumni.
  • Specific groups — pick them individually. When you name groups explicitly, that list is used as-is and no tag expansion happens.

If your organisation has several numbers, you also choose which number sends. Groups belong to numbers, so switching the number changes the available audience.

Writing the message#

Plain text with WhatsApp formatting. Both WhatsApp's own markers and the markdown you probably type by reflex work — **bold** is converted to WhatsApp's *bold* on the way out, and ~~strike~~ to ~strike~, so you don't have to remember which app you're in.

Full guidance on what to actually write: Writing messages that land.

Personalisation tokens#

Token Becomes
{groupName} The name of the group receiving the message
{category} That group's tag

So Hi {groupName}! arrives as "Hi Year 2 — Law!" in one group and "Hi Alumni 2019!" in the next. The delivery preview shows you the substitution before you send.

Message variation (spin tax)#

Wrap alternatives in braces separated by pipes and PromotionBot picks one at random per group:

{Hey|Hi|Hello} everyone — {tickets are live|tickets just dropped}!

Every group gets a slightly different message. This matters more than it looks: identical text blasted to thirty groups in one window is a textbook spam signal, and varying it is one of the cheapest ways to look like a person. See Staying unbanned.

Braces without a pipe are treated as a token, not a variation — {groupName} keeps working exactly as above.

Media#

Attach an image, video, or document and your text becomes its caption. Uploads count against your plan's storage allowance (Plans & billing).

Media you'll reuse can be saved and picked again later rather than re-uploaded each time.

Delivery preview#

Before you send, Compose shows a server-computed summary of what will actually happen:

Reaches 12 of 14 groups · 1 cooling down until 18:40 · 1 over daily cap

This is the most useful thing on the page. It is computed by resolving your audience and running the same gate checks the real send runs — inactive groups, caps, the cooldown — so it can't quietly disagree with the outcome. If the number is inside its quiet hours, you'll see that the send will be held until the window ends, in your own timezone.

Skipped groups are listed with the reason. Nothing is silently dropped.

If a daily cap is what's blocking groups, the preview says so and offers the upgrade path — but read Groups before raising a cap. Usually the right fix is a narrower audience, not more volume into the same one.

Send now, schedule, or repeat#

  • Send now — dispatches immediately.
  • Schedule — queues it for a date and time in your organisation's timezone. The scheduler fires it whether or not anyone's logged in. Two identical pending sends scheduled for within a minute of each other are rejected, however far apart you created them — so a double-click can't double-send, and neither can re-queueing the same thing for the same slot tomorrow.
  • Repeat — creates a recurring send, either every N days or on chosen weekdays ("every Mon/Wed"). For anything you'll want to name, pause, or measure over time, use a campaign instead.

If you're a non-admin sending on the shared number, all three create a pending request for an admin instead of a send. See Team, roles & approvals.

When a send is too big for the hour#

If the fanout would take this number past its rate ceiling — 60 messages an hour, 400 a day — the send stops before dispatching anything and tells you how much room is left. Admins get a Send anyway — I accept the risk option; everyone else needs to split the audience or wait.

This isn't a plan limit and upgrading won't move it. Details and when it's reasonable to override: sending past the rate ceiling.

Live progress#

After "Send now", Compose swaps the form for a live progress view: a bar, a per-group status list, and an ETA based on the pace observed so far.

It is slow, and that's the point. Before each group PromotionBot sends a typing indicator and waits a moment scaled to how long the message is; after each group it waits a randomised few seconds, occasionally a longer pause. A forty-group send takes several minutes. There is no fast mode — the pacing is the anti-ban feature. Exact numbers: the send cadence.

You can navigate away; the send continues server-side. Coming back to the composer keeps your draft intact.

At the end you get a summary: delivered, skipped, failed, with reasons. Failures are also collected on the Analytics page.

Test sends#

There is a test send button on Numbers (and in the onboarding wizard). It sends a fixed check message to the linked account's own chat to prove the connection works end to end.

Know what it does not do: it is not a preview of your draft. It sends canned text, not what you've typed, and the self-send path applies only formatting normalisation — no spin-tax variation, no {groupName} substitution, and no link shortening. It is also admin-only on the shared number.

To check a draft before it goes wide, use the delivery preview — which does resolve tokens and show the spun text — or send to a single small group first by picking that group explicitly.

Any URL in your message is automatically rewritten into a per-group tracking link. You don't do anything; just paste the real URL. That's what makes Analytics able to tell you which audience clicked.