Open it — three clicks
The whole feature lives in one dialog on the Contacts page. Here is how to get to it.
It sits between Export and New contact, above the contact table.
The first option fills your CRM. The second one only sends.
A dialog opens on top of the page. This is it — everything happens in here, and it stays open until you send.
Every column becomes a variable you can drop into the message. Nothing is written to your contacts unless you choose to.
One dialog, three steps
Drop the file in. It tells you who is getting the message.
Pick which connected number it sends from.
Write it once, using your columns. Then schedule.
Is this the right tool? (vs Import contacts)
“Without importing” means the columns of your spreadsheet live inside this one blast. They address and personalise the messages, they appear in the report — and that’s it. They are never written onto a contact record, never searchable, never part of a filter. There are exactly two exceptions, and you have to ask for both: creating a contact for a number that isn’t in your workspace yet, and ticking a column to save it onto the contact.
Upload your list
Your file needs three things. Everything else is optional.
| Parent Name | Mobilematches contacts | Student | Class | Next lesson |
|---|---|---|---|---|
| Mrs Tan | 91234567 | Ethan | P5 Maths | Tue 4pm |
| Mr Lim | +6598765432 | Sara | P5 Maths | Wed 5pm |
| Mrs Ng | 9111 2233 | Kai | P4 Science | Tue 6pm |
6.59123E+10. Once it does, the real number is gone. Before you save, select the phone column and set its format to Text.Full file rules
- File type —
.csv,.xlsx,.xlsmor.xls. Up to 20 MB. - Headings become variable names, so write them as you’d like to see them in the menu — Parent Name, not col_a.
- Up to 60 columns, each heading up to 64 characters. Anything past that is ignored.
- Country codes — a number written without one is read using your workspace’s default country. Fine for a single-country list; if yours spans countries, write the code into every number (
+6591234567). The upload step tells you how many had none. - No heading row? Switch First row to Data, not headings — the columns are then named Column 1, Column 2, and no row is lost.
Once the file is read, step 1 turns into a summary of it. This screen answers who is getting this message and why isn’t everyone before you have written a word.
All 5 of these can be dropped into the message as variables. Nothing here is saved to your contacts.
| Parent Name | Mobilematches contacts | Student | Class | Next lesson |
|---|---|---|---|---|
| Mrs Tan | 91234567 | Ethan | P5 Maths | Tue 4pm |
| Mr Lim | +6598765432 | Sara | P5 Maths | Wed 5pm |
| Mrs Ng | 9111 2233 | Kai | P4 Science | Tue 6pm |
First 3 of 128 rows
- 1Your file — name, row and column count, and Replace if you picked the wrong one.
- 2The headline — how many people get this, and what was left out. Open the link; it’s worth it every time.
- 3How we read your file — six decisions already made for you, each with a Change link. The defaults are usually right.
- 4Your columns — your own sheet, first three rows, so you can see we read it the way you meant.
The six settings under “How we read your file”
Phone column
The column that addresses the message. Auto-detected — first by heading (phone, mobile, whatsapp, hp, contact no), then by looking at the values. In the columns table it’s the grey chip labelled matches contacts, because it addresses the message rather than appearing inside it.
Name for new contacts
Only used when a row’s number isn’t a contact yet. The value is split at the first space into a first and last name. Leave it unset and the new contact is named after the phone number.
Rows not in your workspace
Create new contacts (the default) means every row gets its message and any unknown number becomes a contact — so their reply lands in your Inbox as a real conversation. Skip those rows messages only people you already have. Leave it on for anything you actually want replies to.
Repeated numbers
Send once per number (the default) sends only the first row when a number repeats, and lists the rest with the differing values spelled out. Send every row sends one message per row. A payment chaser: once per number. Two children in two classes: every row.
First row
Whether row 1 is your headings or your first piece of data.
Sheet
Only appears when the workbook has more than one sheet. We read the first one and tell you which.
“N things to check in this file”
The amber line collects everything odd about the upload, each item saying what we did about it: numbers damaged by Excel (excluded), values that didn’t read correctly (an encoding problem — re-save as CSV UTF-8 or .xlsx), numbers without a country code, repeated headings (renamed with a “(2)” suffix), blank headings (ignored), columns empty in every row, and a first row that may not be headings.
Who does not get it
Open Show the N rows not being sent and every excluded row is named, with its reason and the row number you’ll find it on in your own spreadsheet — heading row counted, so it matches Excel.
91234567 · Mrs Tan — rows 2, 47 · differ in Next lesson: sending “Tue 4pm”, not sending “Thu 4pm”
98765432 · Mr Lim — rows 9, 88 · only the first row is sent
Row 63 · “6.59123E+10” — damaged by Excel
Every one of these comes back in the report with its reason.
Three reasons a row is left out: its number can’t be read, its number already appeared on an earlier row, or it isn’t a contact and you chose Skip those rows. Every one of them comes back in the downloadable report with the same reason attached.
Advanced · save one of your columns onto the contact
If a value in your spreadsheet is worth keeping (a student’s name, a class, a membership tier), you can write it onto the contact as part of the send. On step 1, open Also save a column to a contact field, tick a column, then choose which contact field it lands in.
Off for every column. Tick one to write that row’s value onto the contact when the blast is created — that is the only thing here that touches your CRM.
This field doesn’t exist yet — it’s created when you send.
- Map to an existing contact field or one of your custom fields.
- Or create a new custom field right here — it shows as · new and is only created when you send. Abandon the dialog and nothing is created.
- Each contact field takes one column only. A ticked column with no field chosen is ignored.
Choose the channel
Pick which connected number the blast goes out from. Only connected channels are listed; if none are, you get a link to connect one. Back returns you to your list with everything intact.
Write the message
This is where your spreadsheet turns into personalised messages. The mechanism is the same on every channel: you place a variable wherever a person’s own details belong, and it fills in per recipient at send time.
Drop in a column
Wherever you can type — a template placeholder, a free-text message, a media caption — there’s a tag icon. Click it, pick a column, and it drops in.
Columns of term-3-parents.xlsx · used in this message only
A variable appears as a violet chip. It is one thing, not text: press Backspace and the whole variable goes, never half of it.
More about chips
Behind the chip is a plain token, {{list.Parent Name}}. You can type or paste one directly; it turns into a chip as soon as it matches one of your columns.
The four groups in the menu
- From your list — your spreadsheet’s columns, with row 1’s value under each name. These exist for this message only.
- Contact — fields from the contact record itself (first name, custom fields). Useful when the spreadsheet doesn’t carry something your CRM already knows.
- Custom values — workspace-wide values like your centre’s address or a booking link. Same for everyone.
- Date & time —
{{now}},{{now_date}}and{{now_time}}, filled at the moment the message is sent, in your workspace’s timezone.
The search box at the top searches all four groups at once.
If you replace the file afterwards
Any variable whose column no longer exists turns into a struck-through red Deleted variable chip. A red panel names the missing columns and Send stays disabled until you fix them — because the alternative is a customer reading a raw {{list.Term 3 grade}}.
This message uses a column your file no longer has
Term 3 grade — remove it or pick the matching column from the variable menu before sending.
Fill a WhatsApp template
On an official WhatsApp Business number, step 3 becomes three tabs. You can’t skip forward: a template has to be chosen before Configure unlocks, and every placeholder filled before Schedule does.
Fixed copy — you can’t edit it here. You decide what fills each numbered placeholder.
- 1. Select template — pick from your approved templates. You can create one here, but it has to clear Meta’s review first, so build templates a day or two before the blast.
- 2. Configure — the important tab. You can’t edit the words; you decide what fills each numbered placeholder, from a column, a contact field, a custom value, or text you type.
- 3. Schedule — the recipient card, the sending schedule and the Send button.
Details of the Configure tab
- One placeholder can hold more than a variable. Mix chips and typed text freely — “Class (Term 3)” is a perfectly good answer.
- A placeholder is capped at 256 characters, and a chip is never cut in half by that limit.
- If the template has a media header — image, video or document — you can upload your own file, or leave it and the template’s default media is used.
- Every placeholder must be filled before the Schedule tab unlocks.
“If empty, use” — don’t skip this
WhatsApp refuses a template message whose placeholder is blank. Map a placeholder to a column that is empty on some rows and those rows will not send at all — the message never goes out, and the row comes back in the report as an error.
The fix is the If empty, use box beneath each parameter: type what should appear when the cell is blank — “there”, “your child”, “our usual time”.
6 rows will not send — a variable is empty and has no If empty text.
Check the preview
A live preview of one real recipient’s message sits below, drawn as a WhatsApp bubble. Page through rows with the arrows, or jump to one by name.
4 rows have an empty Next lesson — it will render blank.
The warnings beneath the bubble are the important part: they count empty cells across every row of your file, not just the fifty you can page through.
Two things the preview can’t show you
- Contact fields, custom values and date tokens can’t be resolved in the browser, so they stay as chips rather than sample text. They fill in normally at send time.
- On a free-text channel there is no blank-value restriction — an empty variable simply renders as nothing, so an amber pill there is a style warning, not a delivery one.
Free-text channels (not official WhatsApp Business)
There are no templates and no tabs — you get a message box and write whatever you like, dropping chips in as you go. No approval step, and no blank-value restriction: a variable that comes back empty simply renders as nothing. You can attach an image or a document, and its caption takes the same chips. Everything in Drop in a column above applies here unchanged.
Schedule it and send
The recipient card repeats step 1’s promise — same number of people, same file, same consequences — so you never have to go back and check. Below it, the schedule decides when and how fast it goes out.
2 rows will not receive a message — their number already appears on an earlier row.
- Action name — how the blast appears on the Bulk Actions page. Name it something you’ll recognise in a month (“Term 3 lesson confirmations”), not “test”.
- Start on — when the first batch goes out. Defaults to now.
- Batch quantity and Time interval per batch — together they set your sending pace. Maximum 5 per batch.
- Days and hours — tick the days sending is allowed and set the daily window. Outside it, sending pauses and picks up the next allowed slot. This is what keeps a large blast from messaging people at 3am.
After it goes out
Your blast appears on the Bulk Actions page as a Send Message action, under the name you gave it. Every row of your spreadsheet ends up with one of four outcomes.
Use Download report and you get your own spreadsheet back — same columns, same order — with Status and Reason appended.
| Parent Name | Mobile | Student | Statusadded | Reasonadded |
|---|---|---|---|---|
| Mrs Tan | 91234567 | Ethan | SUCCESS | — |
| Mr Lim | +6598765432 | Sara | SUCCESS | — |
| Mrs Tan | 9123 4567 | Ethan | SKIPPED | Duplicate of row 2 |
| Mrs Ng | 6.59123E+10 | Kai | ERROR | Invalid phone number |
What “View details” shows you
- Recipient source — the file (and sheet) it came from.
- Rows in file and Messages scheduled — the difference between the two is what got excluded.
- Duplicate rows skipped, New contacts created, Rows excluded — filled in as the blast resolves your file.
- Columns saved to contacts — or “None — list columns used in this message only”.
- Channel, Start on, and Batch quantity / interval.
If your own sheet already has a column called Status or Reason, both appended columns are renamed Exabloom Status and Exabloom Reason so nothing of yours is overwritten.
Setups to copy
Four common jobs. The two settings that change most between them are Repeated numbers and Rows not in your workspace.
Good to know & pitfalls
- Format the phone column as Text before you save. Excel turns a long number into
6.59123E+10, and that value is genuinely gone — the row is excluded, and no amount of fixing on our side can recover it. - An empty cell is worse on a template than in free text. Free text just leaves a gap; a template row with a blank placeholder will not send at all unless you gave it an If empty, use value.
- Closing the dialog throws the list away. The file, the settings and the message are held in the dialog only — there is no draft. Finish the three steps in one sitting.
- The blast starts when you schedule it, not instantly. It goes out in batches inside the days and hours you set — check its progress on the Bulk Actions page.
- Your spreadsheet is not saved to your contacts. The columns exist for this message only, unless you tick one in Also save a column to a contact field.
- Numbers without a country code are read using your workspace’s default country. If your list mixes countries, write the country code into every number.
- A column needs a heading to be usable. Columns with a blank heading are ignored; repeated headings are renamed with a “(2)” suffix so each one can still be used separately.
- Only the first 60 columns are read, and a heading is capped at 64 characters. Delete the columns you don’t need before uploading — it makes the variable menu far easier to use, too.
First big blast coming up?
Send us the file and we’ll sanity-check it with you before it goes out — our Singapore-based team is one message away.