--- 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