Docs · Product guides
Bulk SMS campaigns
Send one message to thousands of people as a single campaign, see what it will cost before it goes, and track every delivery.
Choose who receives it
A bulk send needs a message and exactly one way to pick recipients.
Note: Clean the list before you send: international format (+254…), no duplicates, no people who asked to stop. Invalid numbers fail and show up in the failed list.
Send the campaign
{
"campaign_name": "Friday deals",
"from": "DUKAFRESH",
"group_id": "grp_loyal",
"message": "Friday deals are live: 20% off fresh produce until 8pm. Reply STOP to opt out."
}The response gives you a campaign_id, how many numbers it will reach (recipient_count) and the credits it is expected to use (estimated_credits = recipients × segments). Those credits are reserved straight away, so a campaign cannot run out halfway.
Cost before you send
Tip: Keeping a campaign to one segment often halves the cost. Shorten links and drop emoji.
Schedule it
Add scheduled_at to send later, for example at 9am when people are awake but not busy. Until it starts you can cancel with DELETE /v1/campaigns/{id}, and reserved credits go back to your balance.
Track it
Watch progress
GET /v1/campaigns/{id} shows the campaign and its progress. GET /v1/campaigns lists all of them.
Get each result
Subscribe to sms.delivered and sms.failed webhooks to update each customer record as results come in.
Report on it
GET /v1/reports/summary gives sent, delivered, failed and credits for any date range.
Limits
send-bulk allows 10 requests a minute. One request can reach a whole group, so you rarely need more. Never loop single sends for a campaign.