Help Center
Broadcasts & outreach9 min read

Send a message to a list

You have a spreadsheet — a class register, a booking export, a sign-up sheet — and you want to message everyone on it, with each person’s own details in their own message. Send to a list does exactly that, straight from the file, without importing anything into your CRM first.
Start here

Open it — three clicks

The whole feature lives in one dialog on the Contacts page. Here is how to get to it.

1Open Contacts in the left sidebar
Inbox
Leads
Calendars
Contacts
Bulk Actions
Workflows
2On the Contacts page, click Import in the toolbar
All contactsSearch by name or phoneFilterColumnsExportImportNew contact

It sits between Export and New contact, above the contact table.

3Choose the second option — Send to a list
Import
Import contacts
Add or update people in your workspace.
Send to a listNewMessage everyone in a spreadsheet, using its columns in the message.

The first option fills your CRM. The second one only sends.

Contacts → Import → Send to a list.

A dialog opens on top of the page. This is it — everything happens in here, and it stays open until you send.

Send message to a list
Step 1 of 3 — Upload your list
Drag & drop your list here
.CSV or .XLSX (max 20 MB) · one column must be a phone number
or
Browse files

Every column becomes a variable you can drop into the message. Nothing is written to your contacts unless you choose to.

Step 1 of 3. Drop your .CSV or .XLSX file onto it, or click Browse files.
What you need
A .CSV or .XLSX file with one column of phone numbers, and at least one messaging channel connected. Nothing else.
The whole thing

One dialog, three steps

Send message to a list
Step 1 of 3 — Upload your list
term-3-parents.xlsx
125 people will get this message
Phone column · Mobile
Repeated numbers · once each

Drop the file in. It tells you who is getting the message.

Send message to a list
Step 2 of 3 — Choose channel
Whatsapp Business
Whatsapp

Pick which connected number it sends from.

Send message to a list
Step 3 of 3 — Compose & schedule
Hi Parent Name, confirming Student
Start 21 Aug, 10:00Send

Write it once, using your columns. Then schedule.

The dialog labels each step for you. Back and Next move between them; nothing is sent until the last screen.
The one idea
Every column in your spreadsheet becomes a variable you can drop into the message, and each person receives their own row’s values. You write one message; everyone reads a different one.
1 · One row of your sheet
Parent NameMrs TanMobile91234567StudentEthanClassP5 MathsNext lessonTue 4pm
2 · The message, with your columns mapped in
Hi Parent Name, just confirming Student’s Class lesson on Next lesson. See you then!
3 · What Mrs Tan receives
Hi Mrs Tan, just confirming Ethan’s P5 Maths lesson on Tue 4pm. See you then!
One row in, one message out — the same whether you typed the sentence or picked an approved template.
Most blasts go out as a template
If your workspace sends from an official WhatsApp Business number — most do — you don’t write the sentence. You pick a pre-approved template and decide what fills each of its placeholders. That path has one setting you really shouldn’t skip: “If empty, use”.
Is this the right tool? (vs Import contacts)
You want these people in your CRM permanently
Every mapped column is written onto the contact record and stays there.
Import contacts
You want to message people already in Exabloom
Filter or tick the rows you want, then use the bulk send action.
Select contacts on the Contacts page
You want to message a one-off list, using its own columns
The spreadsheet is the audience and the source of the merge fields. Nothing is saved to your CRM unless you tick it.
Send to a list

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

Step 1 of 3

Upload your list

Your file needs three things. Everything else is optional.

Parent NameMobilematches contactsStudentClassNext lesson
Mrs Tan91234567EthanP5 MathsTue 4pm
Mr Lim+6598765432SaraP5 MathsWed 5pm
Mrs Ng9111 2233KaiP4 ScienceTue 6pm
One heading row on top
Those headings become your variable names.
One column of phone numbers
The only required column. Format it as Text.
One row per message
Two children, two reminders — that is two rows.
A well-shaped list. The phone column addresses the message; every other column can go inside it.
The one that catches everyone
Excel loves turning a long phone number into scientific notation — 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, .xlsm or .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.

Send message to a list
Step 1 of 3 — Upload your list
1term-3-parents.xlsx128 rows · 5 columns
Replace
2125 people will get this message
2 duplicate rows skipped · 1 unreadable number
Show the 3 rows not being sent
3How we read your file
Phone column
Mobile · auto-detected
Change
Name for new contacts
Parent Name
Change
Rows not in your workspace
Create new contacts
Change
Repeated numbers
Send once per number
2 rows will not receive a message
Change
First row
Column headings
Change
Sheet
Term 3 · 1 of 3 in this workbook
Change
2 things to check in this file
4Your columns

All 5 of these can be dropped into the message as variables. Nothing here is saved to your contacts.

Parent NameMobilematches contactsStudentClassNext lesson
Mrs Tan91234567EthanP5 MathsTue 4pm
Mr Lim+6598765432SaraP5 MathsWed 5pm
Mrs Ng9111 2233KaiP4 ScienceTue 6pm

First 3 of 128 rows

Also save a column to a contact field
Next
Step 1 after a file is read. Read it top to bottom, then press Next.
  1. 1Your file — name, row and column count, and Replace if you picked the wrong one.
  2. 2The headline — how many people get this, and what was left out. Open the link; it’s worth it every time.
  3. 3How we read your file — six decisions already made for you, each with a Change link. The defaults are usually right.
  4. 4Your columns — your own sheet, first three rows, so you can see we read it the way you meant.
Good to know
If Exabloom can’t work out which column holds the phone numbers, the headline turns red and says so. Set the right one under Phone column and the count appears.
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.

Hide the 3 rows not being sent

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.

Duplicates name both rows and spell out what differs, so you can see which version is going out.

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.

Watch out
When a duplicate group’s rows differ — same parent, two lesson times — the first row in the file wins. If both matter, set Repeated numbers to Send every row.
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.

1 column also saved to contacts

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.

Parent Name
Student
Student name · new

This field doesn’t exist yet — it’s created when you send.

Off by default, for every column. This panel is the only thing in the dialog that touches your CRM.
  • 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.
Watch out
This overwrites whatever the contact currently has in that field. If your spreadsheet is less current than your CRM, don’t tick the column.
Step 2 of 3

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.

Send message to a list
Step 2 of 3 — Choose channel
Back
Whatsapp BusinessOfficial number · sends approved templates
WhatsappFree text — you write the message yourself
Step 2 of 3. This choice decides what step 3 looks like.
Good to know
On an official WhatsApp Business number, step 3 becomes “pick a template and decide what fills each placeholder”. On any other channel you write free text. Either way, your spreadsheet’s columns are available in exactly the same variable menu.
Step 3 of 3

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.

Send message to a list
Step 3 of 3 — Compose & schedule
Hi Parent Name, just confirming Student’s Class lesson on Next lesson. See you then!
Chips fill in per recipient at send time
Search fields…
From your list5
Contact12
Custom values4
Date & time3

Columns of term-3-parents.xlsx · used in this message only

Parent Name
Mrs Tan
Mobile
91234567
Student
Ethan
Class
P5 Maths
Next lesson
Tue 4pm
The menu opens on “From your list” — your own columns, with row 1’s value underneath each so you can recognise them.

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

Hi Parent Name, your Deleted variable is confirmed.

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.

Replace it from the menu, or delete it — Send is blocked until you do.

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.

Send message to a list
Step 3 of 3 — Compose & schedule
1. Select template
2. Configure
3. Schedule
Approved template bodyApproved
Hi {{1}}, just confirming {{2}}’s {{3}} lesson on {{4}}. See you then!

Fixed copy — you can’t edit it here. You decide what fills each numbered placeholder.

2. Configure — what fills each placeholder
{{1}}Parent Name
If empty, usethere
{{2}}Student
{{3}}Class
{{4}}Next lesson
If empty, useyour usual slot
The template body stays as approved; each numbered placeholder is mapped to one of your columns. Mrs Tan’s row fills slot 1 with “Mrs Tan”, slot 2 with “Ethan”, and so on.
  • 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”.

Body · parameter 1
Parent Name
If empty, use
there

6 rows will not send — a variable is empty and has no If empty text.

A parameter filled from a column, with a fallback for the rows where that column is blank — and the red line that appears when one is missing.
Tip
A quick rule: if a column has any empty cells — and the step 1 warnings will have told you — give its placeholder a fallback. It costs one word and saves a batch of failed rows.

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.

Preview· row 3 of 50 · Mrs Ng · 9111 2233Row 3 · Mrs Ng
Hi Mrs Ng, just confirming Kai’s P4 Science lesson on empty. See you then!

4 rows have an empty Next lesson — it will render blank.

Violet text is a value that resolved — that’s what the person will read. An amber “empty” pill means that cell is blank on this row.

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.

Tip
Page through five or six rows before sending, and deliberately look for the row you’d be embarrassed to send. It’s the cheapest quality check in the product.
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.

Step 3 · finish

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.

Send message to a list
Step 3 of 3 — Compose & schedule
125 contacts
will receive this message ·from list term-3-parents.xlsx

2 rows will not receive a message — their number already appears on an earlier row.

Action name
Term 3 lesson confirmations
Start on
21 Aug 2026, 10:00
Batch quantity
5
Time interval per batch
2
MINUTES
Perform this action on these days
MonTueWedThuFriSatSun
Perform this action between these hours
09:00
18:00
Send
Name it, set the pace, press Send. Nothing has gone out at that moment — it is scheduled, and starts on your Start on time.
  • 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.
Watch out
If something goes wrong the dialog says so and nothing is sent — your list, message and schedule are all still there. Fix what it flags and press Send again. Don’t close the dialog: that throws the list away.
After you send

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.

Status
What it means · Reason column
SUCCESS
The message went out to this row.
Reason:
SKIPPED
The same number already appeared on an earlier row.
Reason: Duplicate of row 47
SKIPPED
The number is not a contact and you chose not to create new ones.
Reason: Not in workspace
ERROR
The number could not be read, or the send itself failed.
Reason: Invalid phone number
The four outcomes, and the Reason text that comes with each. Row numbers in a reason match your own spreadsheet.

Use Download report and you get your own spreadsheet back — same columns, same order — with Status and Reason appended.

Parent NameMobileStudentStatusaddedReasonadded
Mrs Tan91234567EthanSUCCESS
Mr Lim+6598765432SaraSUCCESS
Mrs Tan9123 4567EthanSKIPPEDDuplicate of row 2
Mrs Ng6.59123E+10KaiERRORInvalid phone number
Open it in Excel, filter on Status, and you have your follow-up list.
Tip
Filter the report on Status = ERROR, fix those rows in your original file, and re-upload just those as a second small blast. That’s the whole clean-up loop.
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.

Cookbook

Setups to copy

Four common jobs. The two settings that change most between them are Repeated numbers and Rows not in your workspace.

Lesson / appointment reminders
One row per booking, with a date-time column written exactly as you want it read (“Tue 4pm”, not a raw Excel serial). Set Repeated numbers to Send every row — a parent with two children genuinely needs two messages.
Payment or renewal chasers
Columns for amount and due date. Leave Send once per number on so nobody is chased twice, and check the “rows not being sent” list to see which row won each duplicate.
Event invite to a bought or collected list
Most numbers won’t be contacts yet. Leave Create new contacts on, set Name for new contacts to your name column, and the blast creates each person as it goes — so replies land in your Inbox against a real contact.
Results / grades notification
A sensitive one: preview several rows before sending, and set an If empty, use value on any parameter that could be blank. Nothing looks worse than a results message with a hole in the middle of it.

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.