# Bulk announcements

Send one announcement to hundreds of parents or customers, safely.

> **In a nutshell:** Write one row per recipient first, then send each from a queue with its own reference, paced under 300 requests per minute. If anything crashes, resend everything unconfirmed - references stop duplicates.

## The flow

1. **Choose an approved template** - announcements start conversations, so they must be templates.
2. **Create one row per recipient** in your database before sending anything.
3. **Queue the sends** with `reference: "announcement-{id}-{recipient id}"`.
4. **Pace them** under your product's 300 requests per minute - across all your businesses.
5. **Resume after failure** by resending every row not yet `202`/`200`: the same references never send twice.

## Limits that apply

| Limit | What happens |
|---|---|
| PaalChat: 300 requests/minute per product | `429 rate_limited` - wait `Retry-After` |
| Meta: the business's `messaging_limit` tier | Sends beyond it fail as `message.status` `failed` |
| Meta: marketing opt-outs | `131050` failures for users who stopped marketing messages |

Check the business's `messaging_limit` with [`GET .../whatsapp`](/docs/api/get-whatsapp)
before a large send, and split the audience across days if needed.

> [!WARNING]
> Use `UTILITY` templates for information parents expect (closures, exams, fees).
> Promotional content is `MARKETING`, costs more, and is limited more by Meta.
