How to Import CSV and Excel Contacts for Bulk SMS (Without Wrecking the List)
Prepare phone columns, Ghana number formats, merge fields, duplicates, and encoding so your first SplitSMS upload sends to real handsets — not spreadsheet artefacts.
Most bulk SMS problems start in the spreadsheet, not the gateway. A column of names in the phone field, numbers stored as 2.33E+11, leading zeros stripped by Excel, or a mix of 024… and +233… in the same file will fail a chunk of your blast and make the report look like the platform is broken.
This guide is the checklist we wish every first-time sender used before clicking Upload on SplitSMS. It applies whether you export from a school MIS, a church membership sheet, WooCommerce, or a Google Sheet.
Use a boring file on purpose
Save as CSV UTF-8 when you can. XLSX often works, but CSV fails less often on commas inside names. One header row. One phone column with a clear name: phone or mobile. Optional columns: first_name, last_name, email, group, amount, due_date — only if you will actually merge them.
Delete decorative header rows, merged cells, and “Notes” sheets. SplitSMS cannot guess that row 4 is a title and row 5 is data. If your export has junk at the top, delete it in Excel first.
Fix Ghana numbers before you import
Pick one format and convert the whole column. International without plus — 233201234567 — is the safest for APIs and most African gateways. Local 0201234567 is fine if every row is Ghana and you convert on import. Mixing 020, 23320, +233 20, and 00233 in one file is how duplicates and fails appear.
In Excel, format the phone column as Text before you paste, or you will lose the leading 0. If you already lost zeros, a formula that prepends 233 and strips spaces and dashes will save the file. Remove letters, parentheses, and “WhatsApp only” notes from the phone column — those belong in a notes column, not in to.
Stop Excel from eating your numbers
Scientific notation (2.332E+11) is not a phone number. Set the column to Text, re-paste from a source that still has the full digits, or import using Google Sheets (File → Import) which is slightly kinder to long numbers. Then export CSV.
If you maintain the master list in Sheets, connect Google Sheets to SplitSMS when you send often. Re-uploading a damaged Excel file every Friday is how errors return.
Map merge fields only when the data is real
Personalization like Hi {first_name}, your balance is GHS {amount} is powerful for collections. It is embarrassing when {first_name} is blank or “N/A”. Scan the column for empties. Use a fallback in copy (“Hi parent”) if many rows have no name.
Keep merge tokens matching the SplitSMS field names you mapped on upload. A heading called “Student” will not fill {first_name} unless you map it. Test on three rows: a complete row, a row with only a phone, and a row with a weird character in the name.
Dedupe like you mean it
Same parent with two children should get two fee texts if the amounts differ, or one combined text if you wrote it that way. Same person in “Members” and “Choir” should not get the same event SMS twice. Deduplicate on normalized phone, not on name (two people named Ama is normal).
SplitSMS groups help: import once into Parents-2026, then send. Do not import the same CSV into a new group every week without removing the old one.
Respect consent in the file itself
Add a column opted_in or source (checkout, form, staff). Filter marketing sends to opted_in = yes. Transactional fee and OTP lists can be wider, but still must be your members or customers — not a purchased dump.
When someone says stop, remove them from promo groups the same day. Leaving STOP numbers in the next blast is how you get complaints and poor routing reputation.
Import into SplitSMS
Open Contacts, choose import, upload the CSV, map phone (required) and any merge columns, pick or create a group, and review the preview rows. If the preview shows blank phones, cancel and fix the file. Do not “send anyway.”
After import, spot-check five random contacts. Then send a test campaign to a group that contains only your team. If those arrive with the right Sender ID and merge values, the list is ready.
After the send: clean from the report
Export or scan failed numbers. Invalid format and not a subscriber should leave the group. Temporary failures can be retried once; permanent invalids should not. A cleaner list next month is cheaper than a bigger list this month.
If you use Smart Forms, new phones can land in a group automatically so you are not copying from a form export every Monday. That is the long-term fix for messy CSVs.
When to skip CSV entirely
Google Contacts import, Google Sheets connect, WooCommerce order SMS, and the API are all better than a weekly Excel ritual when the data already lives in those systems. CSV is for one-off lists and schools that still live in spreadsheets. Use it well, then graduate the repeating workflows.
Need a working file today? One header, one phone column in 233 format, a short test group, then the real group. SplitSMS signup includes trial credits so the first test does not require a Paystack top-up.
Try SplitSMS free
Send bulk SMS, OTP, and campaigns — 5 free credits on signup.