Key Takeaways
- CSV troubles split into parse errors, mapping errors, invalid MSISDNs, and radio failures after a clean import.
- Fix the file before you raise OEM SMS rate ceilings. A bad column will just fail faster.
- E.164 in a dedicated column beats “whatever Excel did to leading zeros.”
- Professional and Business include bulk from Excel/CSV. You still supply operator credit.
- STOP and consent are not a spreadsheet header you can skip.
The import failed. Where?
“Bulk CSV troubleshooting” is four different jobs wearing one ticket. Either the file would not parse, the columns mapped wrong, the numbers were junk, or the file was fine and the phones could not send. Treat them in that order. Hammering retry on a scientific-notation column only burns airtime on the rows that accidentally survived.
Feature: bulk SMS from Excel/CSV. Priced by devices and send volume. You bring the SIM. Professional/Business own this upload; Free’s 300 SMS lifetime is the wrong tool for a 40,000-row dump.
Four stages
- Upload / encoding (UTF-8 vs Windows-1252, commas vs semicolons).
- Column map (phone, body, name, locale).
- Validation (E.164, empty body, missing consent flag if you require one).
- Send (queue, radio, operator, DLR).
“If stage 3 rejected 90% of rows, a successful ‘campaign started’ on the remaining 10% is not a victory. It is a silent list wipe.”
Error catalog
| Symptom | Stage | Fix |
|---|---|---|
| Gibberish headers, broken names | Parse | UTF-8 CSV, not “CSV UTF-8 BOM” mixed with Excel Mac |
| Every number 8.8E+12 | Parse | Text format in Excel; re-export |
| Bodies in the phone column | Map | Remap; do not send |
| Local numbers without country code | Validate | Prefix or a country column; see E.164 guide |
| Imported, zero DLRs | Send | Device online, airtime, campaign actually running |
| First 200 sent, rest pending | Send | OEM rate ceiling + one modem; add devices or slow the job |
Number format
Store MSISDNs as text with a leading plus. Bangladesh 017… without 880 is a domestic assumption that will wreck a mixed file. Contact lists should be clean before you attach a campaign.
Dedup on the normalized number, not the raw cell. `+8801711` and `8801711` and `01711` (if you allow it) are one person. Sending three OTPs because Excel had three spellings is how you get barred.
Column mapping
Spintax and personalization exist on paid bulk. A missing `{{name}}` is a mapping issue, not a radio issue. Preview ten rows. If names are phone numbers, stop.
Language columns: Unicode bodies concatenate. Budget segments. Bulk SMS use case. Do not dump a legal novel into SMS and then open a “CSV bug” ticket.
Pacing vs a dead SIM
One handset will not ingest a CPaaS-sized blast. Pace the job. Raising Android SMS rate ceilings is a separate tutorial; carrier fair-use still applies. A “stuck campaign” with a red battery icon is not an importer bug.
Isolate OTP from this lane. OTP on the same modem will starve while the CSV crawls.
Live send fields: Developer Center. Samples are REST, not a spreadsheet SDK.
Consent in the file
A column named `consent=yes` that nobody verified is not a legal theory. Keep STOP working during the send. STOP. Re-importing last year’s list without a suppression join is how you recreate the incident you just closed.
UTF-8 and CSV as a format: RFC 4180. Excel is a UI, not a spec.
Next steps
Re-export a 20-row canary as UTF-8 text numbers, map it, send to staff SIMs, then scale. Pricing: plans.
Related product pages
Jump to the live product docs for this topic—not another long-form article.
- bulk SMS from Excel and CSVSpreadsheet campaigns
- bulk SMS with consent best practicesHigh-volume outreach
- SMS API documentationLive endpoint reference
- device and SMS volume pricingPlans and allowances





