---
title: How to Send Bulk SMS: Complete Guide with API & Dashboard
description: Learn how to send bulk SMS messages effectively using both a visual dashboard and API.
date: 2025-12-18
author: Victor Villalobos
locale: en
source: https://www.zavu.dev/en/blog/how-to-send-bulk-sms
tags: SMS, Bulk Messaging, API, Tutorial
---
# How to Send Bulk SMS: Complete Guide with API & Dashboard
Sending SMS messages to thousands of customers at once might seem daunting, but it doesn't have to be. Whether you're announcing a flash sale, sending appointment reminders, or keeping customers informed about their orders, bulk SMS is one of the most effective communication channels available.
In this guide, we'll walk you through everything you need to know about sending bulk SMS - from using a simple dashboard interface to integrating with our powerful API.
## What is Bulk SMS?
Bulk SMS (also known as mass texting or SMS broadcasting) is the practice of sending a single message to a large group of recipients simultaneously. Unlike individual messages, bulk SMS is designed for:
- **Marketing campaigns** - Promotions, sales, new product launches
- **Transactional notifications** - Order updates, shipping alerts
- **Alerts and reminders** - Appointments, events, deadlines
- **Internal communications** - Team updates, emergency notifications
According to Gartner, SMS has a 98% open rate compared to just 20% for email, making it an incredibly effective channel for time-sensitive communications.
## Before You Start: What You'll Need
Before sending your first bulk SMS campaign, make sure you have:
1. **A Zavu account** - [Sign up for free](https://dashboard.zavu.dev) if you haven't already
2. **A phone number** - You can purchase one directly from our dashboard
3. **Your contact list** - Phone numbers in E.164 format (e.g., +14155551234)
4. **Your message content** - Keep it concise and valuable
For US messaging, you'll also need to be registered for [A2P 10DLC](/blog/what-is-a2p-10dlc) - but don't worry, we handle that for you automatically.
## Method 1: Using the Dashboard (No Code Required)
The easiest way to send bulk SMS is through our visual dashboard. Here's how:
### Step 1: Create a New Broadcast
1. Log in to your [Zavu Dashboard](https://dashboard.zavu.dev)
2. Navigate to **Broadcasts** in the left sidebar
3. Click **Create Broadcast**
### Step 2: Configure Your Campaign
Give your broadcast a descriptive name that helps you identify it later:
- Good: "Black Friday Sale 2025 - VIP Customers"
- Not so good: "Campaign 1"
Select **SMS** as your channel and choose which sender (phone number) to use.
### Step 3: Write Your Message
Compose your message in the text editor. You can use personalization variables to make each message unique:
```
Hi {{name}}, don't miss our exclusive Black Friday deals!
Use code FRIDAY25 for 25% off your next order.
Shop now: https://yourstore.com/sale
Reply STOP to unsubscribe.
```
**Pro tip:** Keep your message under 160 characters when possible to avoid splitting into multiple segments. Learn more about [GSM-7 encoding](/glossary/what-is-gsm7) and character limits.
### Step 4: Add Your Contacts
You have several options for adding recipients:
- **Upload CSV** - Import a spreadsheet with phone numbers and personalization data
- **Manual entry** - Add individual numbers directly
- **Import from contacts** - Select from your existing contact list
Your CSV should look like this:
```csv
phone,name,order_id
+14155551234,John,ORD-001
+14155555678,Sarah,ORD-002
+14155559012,Mike,ORD-003
```
### Step 5: Review and Send
Before sending, you'll see:
- Total number of recipients
- Estimated cost
- Message preview with personalization
You can either:
- **Send immediately** - Start the broadcast right away
- **Schedule for later** - Pick a specific date and time
### Step 6: Monitor Progress
Once your broadcast starts, you can track progress in real-time:
- Messages sent vs. pending
- Delivery confirmations
- Failed deliveries with reasons
- Opt-out requests
## Method 2: Using the Broadcasts API
For developers who need programmatic control, our Broadcasts API offers complete flexibility. Here's how to send bulk SMS with code:
### Step 1: Install the SDK
```bash
# Using npm
npm install @zavudev/sdk
# Using bun
bun add @zavudev/sdk
```
### Step 2: Create a Broadcast
```typescript
import Zavudev from "@zavudev/sdk";
const client = new Zavu(); // Uses ZAVU_API_KEY from environment
// Create a new broadcast campaign
const broadcast = await client.broadcasts.create({
name: "Black Friday Sale 2025",
channel: "sms",
text: "Hi {{name}}, don't miss our Black Friday deals! Use code FRIDAY25 for 25% off. Reply STOP to unsubscribe.",
});
console.log("Broadcast created: " + broadcast.id);
// Output: Broadcast created: brd_abc123
```
### Step 3: Add Contacts
You can add up to 1,000 contacts per API call:
```typescript
// Add contacts with personalization variables
const result = await client.broadcasts.contacts.add(broadcast.id, {
contacts: [
{
recipient: "+14155551234",
templateVariables: { name: "John" }
},
{
recipient: "+14155555678",
templateVariables: { name: "Sarah" }
},
{
recipient: "+14155559012",
templateVariables: { name: "Mike" }
}
]
});
console.log("Added: " + result.added + ", Duplicates: " + result.duplicates + ", Invalid: " + result.invalid);
```
For larger lists, batch your requests:
```typescript
// Helper function for batching
async function addContactsInBatches(broadcastId: string, contacts: any[], batchSize = 1000) {
for (let i = 0; i < contacts.length; i += batchSize) {
const batch = contacts.slice(i, i + batchSize);
await client.broadcasts.contacts.add(broadcastId, { contacts: batch });
console.log("Added batch " + (Math.floor(i / batchSize) + 1));
}
}
```
### Step 4: Send the Broadcast
```typescript
// Send immediately
await client.broadcasts.send(broadcast.id);
// Or schedule for later
await client.broadcasts.send(broadcast.id, {
scheduledAt: "2025-11-29T09:00:00Z" // Black Friday, 9 AM UTC
});
```
### Step 5: Monitor Progress
```typescript
// Check broadcast progress
const progress = await client.broadcasts.progress(broadcast.id);
console.log("Status: " + progress.status);
console.log("Progress: " + progress.percentComplete + "%");
console.log("Delivered: " + progress.delivered);
console.log("Failed: " + progress.failed);
console.log("Pending: " + progress.pending);
```
### Complete Example
Here's a full working example:
```typescript
import Zavudev from "@zavudev/sdk";
async function sendBlackFridayCampaign() {
const client = new Zavu();
// 1. Create the broadcast
const broadcast = await client.broadcasts.create({
name: "Black Friday Sale 2025",
channel: "sms",
text: "Hi {{name}}, Black Friday is here! Get 25% off with code FRIDAY25. Shop: https://yourstore.com/sale. Reply STOP to opt out."
});
// 2. Add your contacts
const customers = [
{ recipient: "+14155551234", templateVariables: { name: "John" } },
{ recipient: "+14155555678", templateVariables: { name: "Sarah" } },
{ recipient: "+14155559012", templateVariables: { name: "Mike" } },
// ... more customers
];
await client.broadcasts.contacts.add(broadcast.id, { contacts: customers });
// 3. Schedule for Black Friday at 9 AM
await client.broadcasts.send(broadcast.id, {
scheduledAt: "2025-11-29T09:00:00Z"
});
console.log("Campaign scheduled! ID: " + broadcast.id);
// 4. Check progress later
const progress = await client.broadcasts.progress(broadcast.id);
console.log("Status: " + progress.status + " - " + progress.percentComplete + "% complete");
}
sendBlackFridayCampaign().catch(console.error);
```
## Best Practices for Bulk SMS
### 1. Respect Character Limits
SMS messages using standard [GSM-7 encoding](/glossary/what-is-gsm7) support 160 characters per segment. Messages with special characters (emojis, certain accents) switch to Unicode, reducing the limit to 70 characters.
**Recommendation:** Keep messages under 160 characters when possible to minimize costs.
### 2. Always Include Opt-Out Instructions
In most countries, you're legally required to provide a way for recipients to unsubscribe. Always include:
```
Reply STOP to unsubscribe.
```
Zavu automatically handles opt-out requests and removes unsubscribed contacts from future campaigns.
### 3. Personalize Your Messages
Personalized messages see significantly higher engagement. Use template variables like:
- `{{name}}` - Recipient's name
- `{{order_id}}` - Order number
- `{{appointment_date}}` - Scheduled date
### 4. Send at the Right Time
According to HubSpot research:
- **Best days:** Tuesday, Wednesday, Thursday
- **Best times:** 10 AM - 12 PM and 2 PM - 3 PM local time
- **Avoid:** Early mornings, late nights, weekends (unless urgent)
### 5. Segment Your Audience
Don't send the same message to everyone. Use [customer segmentation](/glossary/what-is-customer-segmentation) to create targeted campaigns:
- VIP customers get early access
- New customers get welcome offers
- Inactive customers get re-engagement messages
### 6. Test Before Sending
Always send a test message to yourself or your team before launching a campaign. Check for:
- Personalization variables rendering correctly
- Links working properly
- Message displaying well on mobile
- Character count within limits
## Understanding Costs
Bulk SMS pricing varies by:
- **Destination country** - US messages typically cost $0.01-0.02 each
- **Message length** - Long messages may be split into multiple segments
- **Volume** - Higher volumes often qualify for better rates
Zavu provides transparent pricing with no hidden fees. You can see the estimated cost before sending any campaign.
## Compliance Considerations
### United States
For US messaging, you need:
- [A2P 10DLC registration](/blog/what-is-a2p-10dlc) (we handle this for you)
- TCPA compliance - Prior express written consent for marketing
- Clear opt-out mechanism
### Europe
For EU messaging:
- GDPR compliance - Explicit consent required
- Clear identification of sender
- Right to withdraw consent
### Canada
- CASL compliance - Express or implied consent
- Sender identification
- Unsubscribe mechanism
## Advanced Features
### Smart Routing
When you use the `smart` channel option, Zavu automatically selects the best channel for each recipient:
```typescript
const broadcast = await client.broadcasts.create({
name: "Multi-channel Campaign",
channel: "smart", // Automatically choose SMS, WhatsApp, or Email
text: "Your message here..."
});
```
This can significantly reduce costs by routing messages through the most cost-effective channel available.
### Webhooks for Real-Time Updates
Set up webhooks to receive real-time notifications about your broadcast:
- Message delivered
- Message failed
- Contact opted out
- Broadcast completed
Learn more in our [API documentation](https://docs.zavu.dev/webhooks).
## Troubleshooting Common Issues
### Messages Not Delivering
1. **Check phone number format** - Must be E.164 (e.g., +14155551234)
2. **Verify sender registration** - US numbers need 10DLC registration
3. **Check carrier filtering** - Some content may trigger spam filters
### High Failure Rates
- **Invalid numbers** - Clean your list before sending
- **Carrier issues** - Try sending at different times
- **Content filtering** - Avoid spam-like language
### Slow Delivery
Delivery speed depends on your [10DLC trust score](/blog/what-is-a2p-10dlc). Higher scores = faster throughput.
## Next Steps
Ready to send your first bulk SMS campaign? Here's what to do:
1. **[Create a free account](https://dashboard.zavu.dev)** - No credit card required
2. **Get a phone number** - Purchase directly from the dashboard
3. **Import your contacts** - Upload your customer list
4. **Create your first broadcast** - Use the dashboard or API
Have questions? Check out our [complete API documentation](https://docs.zavu.dev) or [contact our support team](/contact-us).
## Related Resources
- [What is A2P 10DLC?](/blog/what-is-a2p-10dlc) - Understanding US SMS compliance
- [GSM-7 Character Encoding](/glossary/what-is-gsm7) - Why character counts matter
- [Customer Segmentation](/glossary/what-is-customer-segmentation) - Target your messages effectively
- [RCS Messaging](/glossary/what-is-rcs-messaging) - The future of business texting
- [API Documentation](https://docs.zavu.dev) - Complete API reference