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