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
Before You Start: What You'll Need
Before sending your first bulk SMS campaign, make sure you have:
For US messaging, you'll also need to be registered for 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
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"
Step 3: Write Your Message
Compose your message in the text editor. You can use personalization variables to make each message unique:
Pro tip: Keep your message under 160 characters when possible to avoid splitting into multiple segments. Learn more about GSM-7 encoding and character limits.textHi {{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.
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
csvphone,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
- 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
typescriptimport 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:
typescriptimport 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 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:
textReply 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 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
Compliance Considerations
United States
For US messaging, you need:
- A2P 10DLC registration (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:
typescriptconst 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
Troubleshooting Common Issues
Messages Not Delivering
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. Higher scores = faster throughput.
Next Steps
Ready to send your first bulk SMS campaign? Here's what to do:
Have questions? Check out our complete API documentation or contact our support team.
Related Resources
- What is A2P 10DLC? - Understanding US SMS compliance
- GSM-7 Character Encoding - Why character counts matter
- Customer Segmentation - Target your messages effectively
- RCS Messaging - The future of business texting
- API Documentation - Complete API reference