What it is
Campaigns is the workspace for scheduled, audience-targeted WhatsApp blasts. It uses two Meta APIs depending on the send’s category:- MARKETING sends route through the Marketing Messages Lite API — high-volume optimized, opt-in-required, US recipients blocked.
- UTILITY sends route through the standard WhatsApp Cloud API — for transactional/account-related notifications. Different pricing category, fewer geographic restrictions.
- One audience (uploaded as CSV — phone numbers + arbitrary template variables)
- One or more sends scheduled in chronological order (think of them as messages in a drip sequence)
- One WhatsApp number to send from (any active WABA phone number in your org)
Send categories
Pick category per send when adding it to the sequence. The campaign editor only lets you pick templates whose Meta-side category matches the send category — switching the send category clears your template pick.
Why mix them? A common pattern: send 1–3 are MARKETING (engagement push), send 4 is UTILITY (the actual confirmation/receipt with no marketing content). Keeping them in one campaign keeps audience handling consistent without forcing you to spin up a parallel campaign just to swap APIs.
Replies to campaign messages flow back through your existing bot — the bot attached to the chosen WhatsApp number handles conversations as it normally would.
Lifecycle
A campaign moves through these states:Sends within a campaign
Each send is a single blast. Per-send config:- Scheduled time + IANA time zone (DST-aware — the saved UTC instant respects the picked zone’s rules at that exact moment)
- Template — Meta-approved MARKETING-category template (created in WhatsApp Business Manager)
- Audience filter — off (full audience, minus opt-outs) or on (narrowed by inbound webhook payload)
max_messages_per_second (default 20 — tune up after a successful dry run). Per-recipient delivery, read, and failure events flow back from Meta’s webhook and are recorded for analytics.
Geographic eligibility
Two policy realities Meta enforces for MARKETING sends, which Campaigns surfaces at upload time:- US recipients are blocked with error 131049 across all WhatsApp marketing APIs. We mark them
ineligible_geoat audience ingest and skip them at send time. - EEA / UK / Japan / South Korea — sends deliver, but Meta does not return read/click metrics through standard webhooks for these regions. The audience detail page surfaces the affected count so you don’t misread their analytics.
Opt-outs
When a recipient replies with a STOP-style keyword (stop, unsubscribe, unsub, cancel, end, quit, remove me, opt out, opt-out), an opt-out is recorded for that organization + phone. The materializer skips opted-out numbers on subsequent sends, automatically.
Match is conservative — only when the keyword is the entire message or a leading keyword followed by punctuation. We don’t match phrases like “please don’t stop sending these”.
Opt-outs are per-organization. The same phone replying STOP to org A is not opted out from org B’s campaigns.
Onboarding gates
Before your first send actually goes through: For MARKETING sends:- Your WhatsApp Business Account (WABA) must accept the MM Lite Terms of Service in Meta’s App Dashboard. There’s no API to do this on your behalf — manual one-time step per WABA.
- You need at least one approved MARKETING-category template in your WABA.
- For 80k-recipient sends, your WABA needs TIER_100K or higher messaging tier (visible via
GET /{phone-number-id}?fields=messaging_limit_tier). - Recipients must be opted in to receive WhatsApp marketing messages from your business — required by Meta’s marketing message policy. You confirm this at campaign creation time (
product_policyflag, sent on every API call).
- You need at least one approved UTILITY-category template in your WABA.
- No MM Lite ToS or
product_policyflag required. - Standard Cloud API messaging-limit tiers apply.

