The directory is the list of the people you send SMS to: a number, a name, a company, labels and custom fields. Groups gather contacts so you can reach them at once, with a campaign or a quick send. The opt-out list records the numbers that asked to stop receiving your messages, and the gateway enforces it on every send.
Everything stays on your gateway. The directory is never sent to us or to anyone else.
Contacts
The Contacts screen lists your directory.
| Control | Use |
|---|---|
| Search a contact | Find a contact by name, number or company |
| Label, Group, Opted out filters | Narrow the list |
| New contact | Create a contact by hand |
| Import a CSV | Import a file, see Import a CSV file |
| Export as CSV / Export as JSON | Download the contacts the current filters show |
The table shows each Contact, its Number, its Groups, its Labels and its State (Opted out or not). From each row you can edit, delete, and opt out or opt back in.
The fields of a contact
| Field | Rules |
|---|---|
| Number in international format | Required, + then the country code, for example +261341234567. One contact per number |
| First name, Last name | Up to 120 characters each |
| Company | Up to 160 characters |
| Email address | Up to 254 characters |
| Internal notes | Up to 2,000 characters. For your team only, never sent |
| Labels, comma separated | Up to 24 labels of 40 characters. Use them to sort and filter: "vip", "retail", "2026 fair" |
| Custom fields | Up to 32 fields of your own (for example "loyalty card", "city"), 60 characters for the name and 500 for the value. They come from a CSV import or from the API, and the contact panel of a conversation shows them |
The fields of a contact can be inserted into a message through the variables of templates: "Hello {firstname}" becomes "Hello Rina" for each recipient.
Two contacts cannot share a number: creating a second one answers "This contact already exists."
Deleting a contact removes it from the directory and from its groups. The messages already exchanged stay in the conversations, and an opt-out stays in force: deleting the contact of someone who said STOP does not allow you to write to them again.
Groups
The Groups screen manages your distribution lists. A group is what a campaign targets, and what the Contact group mode of quick send uses.
| Action | Effect |
|---|---|
| New group | Group name (up to 80 characters, unique regardless of case) and Description (up to 500) |
| Edit the group | Rename it or change its description |
| Open a group | See its members, Add contacts, or Remove from the group |
| Delete this group | The group disappears, its contacts stay in the directory |
A contact can belong to several groups. A contact who opted out stays in its groups, but campaigns and quick sends skip it.
A group attached to a running or scheduled campaign cannot be deleted: "This group is attached to a running or scheduled campaign." Wait for the campaign to end first.
You can also file a contact in a group from the contact panel of a conversation (Add to a group), or at import time.
Import a CSV file
Import a CSV fills the directory from a spreadsheet or from another tool. Nothing is saved until you confirm: the dialog first analyses the file and shows you what will happen.
- Choose the file. A CSV file with a header row, up to 32 MB. The separator (comma, semicolon, tab or vertical bar) is detected automatically, so a file saved by a spreadsheet in any language works.
- Check the Column mapping. The dialog recognises the usual column names, in several languages: "phone", "mobile", "telephone", "numero" for the number; "first name", "prenom"; "last name", "nom"; "company", "societe"; "email", "courriel"; "notes"; "tags", "labels". Correct any column if needed, or set it to Ignore; the preview updates. A column nothing recognises becomes a custom field under its own name, up to 32. The number column is required.
- Choose what to do with Numbers already present:
- Keep the existing contact (default): a contact already in the directory is left untouched;
- Update with non-empty columns: the file completes the existing contact, and an empty cell never erases what you typed by hand.
- Add to group (optional): every imported contact, new or already present, joins that group. Handy to import a list straight into the group a campaign will target.
- Read the Import summary: rows read, to create, to update, already present and kept, rejected, and the First rows, as they will be read. Rejected rows lists the lines refused, with the reason: Missing number, Invalid number, Duplicate in the file, Malformed row.
- Click Import N contacts.
Numbers must be in international format (+261...). Duplicates are detected on the number once
normalised: +261 34 12 345 67 and +261341234567 are the same contact. A labels column may hold
several labels separated by commas, semicolons or vertical bars.
Importing a number that is on the opt-out list does not lift the opt-out.
Opt-out
A person who asks to stop receiving your SMS must stop receiving them. The gateway takes care of it.
Automatic opt-out. When a correspondent answers with a stop word, the number is opted out at once. The message must be the stop word alone, or followed by a word such as "SMS" or "ALL"; upper or lower case, accents and punctuation do not matter. Recognised words:
| Stop words | May be followed by |
|---|---|
| STOP, STOPALL, STOPPER, ARRET, ARRETER, DESABONNER, DESABONNEMENT, DESINSCRIRE, DESINSCRIPTION, UNSUBSCRIBE, OPTOUT, QUIT, CANCEL, END, FIN | SMS, ALL, TOUT, TOUS, TOUTES, MESSAGE, MESSAGES, TODO |
"STOP", "Stop." and "stop sms" opt out; "Please don't stop" does not. This list is deliberately narrow: it follows what carriers publish, so a customer who writes "I can't stop smiling" is not opted out by mistake. To react to other words, add a rule in Automation.
Manual opt-out. In Contacts, Opt out asks for an optional Reason for the opt-out and applies at once. The contact panel of a conversation offers the same button, without the reason.
What an opt-out does:
- every new send to the number is refused, from the dashboard, a campaign or the API, with "This number has opted out.";
- messages already queued for that number are Cancelled instead of leaving;
- campaigns leave the number out when they start, so their totals are real;
- a quick send to a group leaves it out before sending.
The opt-out belongs to the number, not to the contact. A STOP from a number that is not in your directory is recorded all the same, and deleting a contact does not lift it. Only Opt back in lifts it: do it only when the person asked for it. For a number that is not in your directory, create its contact first: it appears Opted out, and you can then opt it back in. Changing the number of a contact does not carry its opt-out along: the opt-out stays with the old number, and the contact takes the state of its new number.
The Opted out filter of Contacts lists the opted-out contacts.
Options
| Option | Where | Default | Allowed values | Effect |
|---|---|---|---|---|
| Number | Contact form; API phone |
Required | International format, unique | Identifies the contact; the opt-out follows it |
| Name, company, email, notes | Contact form | Empty | See the fields | Display, search, template variables |
| Labels | Contact form, import; API tags |
None | Up to 24, 40 characters | Label filter, sorting |
| Custom fields | Import, API customFields |
None | Up to 32; name 60, value 500 characters | Template variables, contact panel |
| Groups | Groups screen, contact panel, import; API groupIds |
None | Any number | Targets of campaigns and quick sends |
| Opted out | Opt out / Opt back in; API POST and DELETE /contacts/{contactId}/blacklist |
No | Yes or no, with an optional reason | Refuses every send, cancels queued messages, removes from campaign audiences |
| Numbers already present | Import dialog; API dedupe |
Keep the existing contact (skip) |
skip, update |
Whether the import completes existing contacts |
| Add to group | Import dialog; API groupId |
No group | A group | Files every imported contact in it |
| Column mapping | Import dialog; API map (field=column) |
Deduced from the headers | phone, firstName, lastName, company, email, notes, tags, custom:<name> |
Which column fills which field |
| Separator | Detected; API delimiter |
Detected from the first line | Comma, semicolon, tab, vertical bar | How the file is split |
| Preview | Automatic in the dialog; API dryRun=true |
Preview first | true or false |
Runs the whole import without writing anything |
API
| Method and path | Use |
|---|---|
GET /contacts |
List and search the directory, filter by label, group or opt-out |
POST /contacts |
Create a contact |
GET, PATCH, DELETE /contacts/{contactId} |
Read, change, delete a contact |
POST /contacts/{contactId}/blacklist |
Opt the contact's number out |
DELETE /contacts/{contactId}/blacklist |
Opt it back in |
POST /contacts/import |
Import a CSV file |
GET /contacts/export |
Export the filtered directory, as CSV or JSON |
GET, POST /groups |
List, create groups |
GET, PATCH, DELETE /groups/{groupId} |
Read, rename, delete a group |
GET, POST /groups/{groupId}/contacts |
List members, add up to 500 contacts per call |
DELETE /groups/{groupId}/contacts/{contactId} |
Remove a contact from a group |
Troubleshooting
| Symptom | What to check |
|---|---|
| Many rows rejected as Invalid number | The numbers lack the country code. Add it in the spreadsheet (+261 in front of 034..., dropping the leading 0) |
| The number column is not recognised | Pick it by hand in Column mapping |
| "This file is larger than 32 MB." | Split the file in several parts |
| "This contact already exists." | Another contact has this number: search for it and edit it instead |
| A group cannot be deleted | A running or scheduled campaign uses it |
| A contact receives nothing | Is it Opted out? Check the State column |
| Someone who said STOP must be written to again | Only if they asked for it: Opt back in on their contact |