Send WhatsApp Bulk Messages from an Excel/CSV List
The most practical way to send bulk messages is to prepare your recipient list in an Excel or CSV file and upload it. But success depends heavily on the quality of that list: badly formatted numbers never arrive, and a dirty list raises your ban risk. This guide walks through preparing a clean list, normalizing numbers into the correct 90... form, personalizing the message with an [Name] column, and spreading large lists safely over time.
1. Why working from Excel/CSV makes the most sense
Entering contacts one by one is fine for a handful of people, but unbearable at scale. The advantage of the Excel/CSV approach is that you export the data straight from wherever it already lives — an accounting app, an e-commerce panel, a signup form, a CRM — and use it directly. Set the columns up properly once and you reuse the same template for every campaign.
A bulk list needs at least two columns: number and name. Add extra columns such as city, order number or appointment time as needed and reference them as placeholders in the message body. A sample list looks like this:
| name | number | city |
|---|---|---|
| Ayse | 905321234567 | Izmir |
| Mehmet | 905339876543 | Ankara |
| Zeynep | 905445556677 | Bursa |
To pair this with ready-made copy, use the patterns in the WhatsApp bulk message templates guide.
2. Number format: the single most critical step
The number-one reason messages fail to arrive is the wrong number format. WhatsApp expects the number in international form: country code + number, digits only. For Turkey that means dropping the leading 0 and prefixing 90. The table below contrasts correct and incorrect forms:
| What the user typed | Correct (normalized) | Status |
|---|---|---|
| 0532 123 45 67 | 905321234567 | ✅ Zero dropped, 90 added |
| +90 532 123 45 67 | 905321234567 | ✅ + and spaces stripped |
| 532 123 45 67 | 905321234567 | ✅ Country code added |
| (0532) 123-45-67 | 905321234567 | ✅ Parentheses and dashes removed |
| 0090 532 123 4567 | 905321234567 | ✅ 00 prefix reduced to 90 |
| 532-1234567 (landline) | — | ❌ Not mobile, remove from list |
The system's number normalization strips spaces, the + sign, parentheses and dashes; still, the safest path is to keep the list in plain 90... form in Excel already. That removes all ambiguity, and technically the number is turned directly into a chatId (for example [email protected]). Because messages go out without requiring the recipient to save you, the number format matters even more here — see messaging without saving contacts.
2.1 Why does Excel drop the leading zero?
Excel treats a phone number as a number, silently removes the leading 0, and sometimes converts it into scientific notation like 5.3212E+11. Two fixes:
- Set the column to Text format: select the number column, right-click → Format Cells → Text, then paste the numbers again.
- Start the number with 90: since the leading zero is already dropped, the problem disappears at the root — typing
905321234567leaves no zero for Excel to trim.
When saving as CSV, always choose CSV UTF-8. Otherwise non-ASCII characters break — a name like Ayşe shows up as AyÅŸe and your personalized messages look mangled.
3. Personalizing with an [Name] column
Sending everyone the same text feels cold, and from WhatsApp's spam perspective, an identical body going out hundreds of times is a bad signal. The fix is personalization. You bind the name column in your list to the [Name] placeholder in the message text; the system swaps [Name] for that person's name on every row.
For example, this template:
Hi [Name], your order has shipped 📦 Your tracking number was also texted to you. Have a great day! (Reply STOP to opt out.)
arrives at 905321234567 as "Hi Ayse, your order has shipped…". With the same placeholder logic you can define extra columns like [City] or [OrderNo]. You'll find personalization patterns grouped by category in the message templates guide, and you can trigger these sends automatically with the automated WhatsApp messaging approach.
Keep the name column clean: use "Ayse" rather than an all-caps "AYSE". That small tidy-up noticeably warms up the message.
4. A clean list means fewer bans
List quality directly affects ban risk. Messaging invalid numbers, non-WhatsApp lines or people who never wanted to hear from you raises your undeliverable rate and complaint odds — both spam signals in WhatsApp's eyes. Before sending, clean the list with these steps:
- Remove duplicates: if a number appears twice, clear it with Excel's "Remove Duplicates". The system already applies a 4-hour cooldown per number, but a clean list from the start is best.
- Strip landlines and incomplete numbers: drop entries shorter than 12 digits or that aren't mobile.
- Exclude anyone without consent: message only people who agreed to hear from you.
- Permanently flag opt-outs: never re-add anyone who replied "STOP".
A clean list doesn't just lower ban risk; with no wasted sends, you spend your daily rate quota on real recipients. For ban signals and the discipline to avoid them, keep the rules to avoid bans guide handy.
Ethics and law: owning an Excel list does not mean you have the right to message the people on it. For commercial/marketing messages, data-protection law (Turkey's KVKK 6698 and the GDPR in the EU) requires explicit consent, and every marketing message must carry an opt-out line. Purchased or scraped lists lead to both bans and legal penalties. See consent-compliant messaging.
5. The upload flow
Once the list is ready, sending proceeds like this:
- Prepare the file: save the Excel as
CSV UTF-8; usenameandnumberas the column headers. - Upload to the panel: pick the list on the compose screen. The system normalizes numbers and flags the invalid ones.
- Write the message: add the
[Name]placeholder and, where relevant, the opt-out line. - Preview: check how the first few rows will look — especially that special characters and the
[Name]swap render correctly. - Queue it: the server validates requests and adds them to the Redis/BullMQ queue; the actual sending is done by the worker — the only sender — at the anti-ban pace.
You can also schedule the send for a later date/time; for the scheduling logic, see automated message sending.
6. Spreading a large list over time
Because of the anti-ban regime, sending runs at human speed: 45–90 s between messages, an 8–12 min break every 15 messages, a 05:00–23:00 window and ~25–30 messages per hour. That puts the safe daily ceiling around 450–500 messages. So large lists automatically spread across several days:
| List size | Estimated time | Note |
|---|---|---|
| 500 people | ~1 day | Finishes within a single window |
| 1,500 people | ~3–4 days | Auto-split across days |
| 5,000 people | ~10–12 days | Plan a patient campaign |
| 10,000 people | ~3 weeks | Warm-up + chunked sending advised |
Don't start a large list on a brand-new number; warm the number up first (gradually increasing volume). For details see number warm-up. Rather than rushing and pushing the rate, keeping the list clean and the sending steady is what keeps your number alive in the long run.
Frequently asked questions
What format should the phone numbers be in?
Country code and digits only: for Turkey, 90 + 5xx..., e.g. 905321234567. Drop the leading 0; no spaces, parentheses or dashes.
Excel keeps dropping the leading zero. What do I do?
The cell is in "Number" format. Set the column to "Text", or write numbers as 90...; the problem disappears. Save as CSV UTF-8.
How do I personalize the message per recipient?
Add a name column and use the [Name] placeholder in the text. The system substitutes each person's name for [Name] on every row.
Can I send to a 5,000-person list at once?
No cap on list size, but speed is limited (~450–500/day). 5,000 people spread over ~10–12 days at the anti-ban pace; the system queues it automatically.
Upload your Excel list and start sending
Run the open-source system on your own server — it normalizes numbers, personalizes with [Name], and sends at a safe pace.