Contacts
Who your customers are, and how to organise them.
Contacts
A contact is one person, stored apart from anything they ever said to you. Conversations open and close; the contact record is what outlives them and carries the history, the labels, the notes and the custom attributes. How a contact comes to exist | Route | What it does | |---|---| | Someone messages you | The channel creates the contact from whatever the provider sent | | Add contact in the contacts list | You type the details yourself | | Import contacts | A CSV file, or a pasted list of phone numbers | The first route is the one that fills most accounts, and it is worth knowing what it stores. A WhatsApp message from a number Lynomia Chat has not seen before creates a contact whose phone number is that number and whose name is the WhatsApp display name. If the provider sent no name, Lynomia Chat generates a placeholder one, so a list of oddly-named contacts is a sign that names are not arriving, not a sign that something failed. The three identities Three fields decide whether two records are the same person. Each is unique inside your account. | Field | Uniqueness | Usually set by | |---|---|---| | Phone number | one contact per number | the channel, the contact form, an import | | Email | one contact per address, upper and lower case treated as the same | the contact form, an import, an email channel | | Identifier | one contact per identifier | your own system, through an import or the API | Leaving a field empty is always allowed, and empty never collides: any number of contacts may have no email at all. But a value that is already in use is refused, and you are told which field clashed. When exactly one field clashed, the dialog finds the contact that already holds it and offers to open it, which is almost always what you wanted. The identifier is your own key for this person — a membership number, a CRM id. It is the only one of the three with no field in the contact form, so it arrives through an import or the API. Phone numbers are stored in international form A stored number is a +, the country code, then the rest: +96522201234. Fifteen digits is the ceiling. A number that names its own country is understood on its own, and 00 at the front is read as +. A local number such as 0551112233 can only be stored if you also say which country it belongs to, using the country field on the contact. Lynomia Chat will not guess. It does not infer the country from your account language, your timezone, or the WhatsApp number the message arrived on, because a wrong guess produces a number that looks right and reaches nobody. The check is structural: it confirms the shape of an international number, not that the number is in service. A contact nobody can reach is not listed The contacts list shows contacts that have at least one of the three identities. A record with only a name is stored, but it does not appear — there is no way to message it, so there is nothing to do with it. Imports report these rows before you commit to them. Merging two contacts Merging is for the case you cannot prevent: the same person reached you twice, once by WhatsApp and once by email, and you now have two records. 1. Open the record you want to get rid of. 2. Go to the Merge tab. 3. Search for the record you want to keep. That one is the primary contact. 4. Confirm. Conversations, messages, notes and channel links all move to the primary contact. Where both records hold a value for the same field, the primary contact's value wins. The record you opened is then deleted. One thing does not move: labels. The record being removed takes its labels with it. If it carries a label that matters, apply that label to the primary contact before you merge. Blocking Block contact, in the header of a contact, is for someone you want to stop hearing from. Once blocked, inbound WhatsApp messages from that person are dropped rather than queued, any conversation of theirs is set to resolved and muted, and no notifications are raised. Blocking governs what comes in. It does not govern what goes out. Nothing filters blocked contacts out of a campaign, so a blocked person still receives a campaign whose label they carry. Keep them out of the labels you send to — or build the audience you send to with blocked is false as one of its conditions, which is a filter you can add. Who can do this | Action | Role | |---|---| | View, search, create and edit contacts | any agent | | Apply and remove labels | any agent | | Merge two contacts | any agent | | Delete a contact | administrator | | Import and export | administrator, or an agent whose custom role includes contact management | Limits - Deleting a contact is permanent, deletes its conversations with it, and is refused while that contact is online. - Changes to a contact are not recorded in the account's audit log. - The contacts list pages fifteen rows at a time, which matters when you are selecting many of them — see bulk actions. - Uniqueness is per account. Two accounts on the same installation may both hold the same number, and neither can see the other's. Related - Custom attributes - Import contacts - Bulk actions on contacts - Labels - Shared audiences If it does not work "This phone number already belongs to another contact in this account." The number is in use. The dialog offers to open the contact that holds it; merge if they really are two records for one person. The number will not save and the error mentions a country. You entered a local number with no country. Either write it in full international form, or choose the country on the contact. I imported contacts and cannot find them in the list. The rows had no email, phone number or identifier. They exist, but the list only shows contacts that can be reached. A colleague cannot see Import or Export. Both are administrator actions. On plans with custom roles, an agent granted contact management also gets them.
Custom attributes
A custom attribute is a field you invent. Lynomia Chat ships with the fields everybody needs — name, phone number, city, status, priority — and a custom attribute is how you add the one your business needs and nobody else does: a policy number, a delivery zone, a subscription tier, the date a warranty ends. An attribute has two halves, and keeping them apart makes the rest obvious. The definition is created once, in Settings, and belongs to the account. The value is set per contact or per conversation. Creating a definition stores no data; it creates a field that can now hold data. Contact attributes and conversation attributes You choose which one an attribute is when you create it, and the choice cannot be changed afterwards. | | Describes | Where the value is set | |---|---|---| | Contact attribute | the person, for as long as they are a customer | the Attributes tab on the contact | | Conversation attribute | this one exchange | the panel beside the conversation | A delivery zone is a property of the person. An order number is a property of this conversation. Getting it wrong is not fatal, but it is tedious to undo, because the type and the model are fixed once the attribute exists. When to use one Use a custom attribute when the answer is a value you will need to read back, filter on, or put in a message, and no other field already holds it. - The answer is not yes or no. A delivery zone, a contract tier, a preferred branch, a reference number from another system. A label can only say this is true of them; an attribute says this is what it is. - You want to filter or segment on the value. Attributes are available as conditions in a contact filter and therefore in a shared audience, and as conditions in an automation rule. - You want it in a WhatsApp template. A template's variables can be filled from a contact attribute, which is how one approved template serves every customer without a separate draft each. - Agents need it in front of them. The value sits in the panel beside the conversation, so nobody has to open another tool to find the customer's account number. If you cannot name the question the attribute answers, you do not need the attribute yet. An unused definition is one more empty field every agent sees on every contact. When not to use one - When a label would do. A label is a yes/no decision you can filter and send campaigns to, and it costs nothing to define. A checkbox attribute that is only ever true is a label written the long way. - When Lynomia Chat already knows. Order history, spend and store membership arrive from a connected shop and stay current. An attribute you type by hand is correct on the day you type it and never again. - For anything secret. Attribute values are visible to every agent who can open the contact, and they travel in exports. What you need first Only an administrator can create, rename or delete definitions. Any agent can then fill them in. Creating one Go to Settings → Custom attributes → Add custom attribute. | Field | Notes | |---|---| | Display name | What agents see. Required. | | Key | The machine name, used in imports, filters and variables. No spaces. Letters of any alphabet, numbers, _, . and -. Unique within its model. | | Description | Required. It is the hint shown when the attribute is offered as a message variable, so write it for the next person. | | Applies to | Contact or Conversation. Fixed afterwards. | | Type | Text, Number, Link, Date, List or Checkbox. Fixed afterwards. | | List values | For the List type, the options an agent may pick from. | | Regex pattern and cue | Text type only. A pattern the value must match, and the hint shown when it does not. | A key may not be one of the built-in field names — phone_number, status, priority and the rest are taken, and Lynomia Chat refuses rather than shadowing them. What you can do with the values This is the part worth planning before you define anything, because it is what makes an attribute more than a note. - Filter. Contacts and conversations can both be filtered on their own custom attributes, with operators suited to the type — greater than for a number, before a date, is present for anything. - Save the filter. A contact filter saved as a shared audience becomes a reusable recipient source for a campaign, re-counted every time it is opened. - Condition an automation rule. Rules can read both conversation and contact custom attributes as conditions. - Insert into a message. Type {{ in the reply editor and the attribute appears in the list. {{contact.custom_attribute.policy_number}} and {{conversation.custom_attribute.order_number}} are the forms. A worked example You deliver, and the driver needs to know the zone. 1. Settings → Custom attributes → Add custom attribute. Display name "Delivery zone", key delivery_zone, applies to Contact, type List, values Salmiya / Hawalli / Jahra / Farwaniya. 2. On a contact, open Attributes and pick the zone. Agents can do this while the conversation is open. 3. In the contacts list, filter on Delivery zone is Jahra, and save it as a shared audience called "Jahra customers". 4. When a road closes, send a campaign to that audience. Step 3 is the payoff. The attribute was worth defining because it made step 4 a question you can ask rather than a list you have to keep. Limits - Type and model are fixed once created. The key is read-only after creation too. To change any of them, create a new attribute and move the values. - The regex pattern is checked in the form, not on the data. A value written by an import or through the API is stored as given, whether or not it matches. - A value can exist without a definition. An import stores every column it does not recognise as a custom attribute value on the contact. It will not appear in the Attributes panel unless an attribute with exactly that key exists. - Deleting a definition does not erase the values. They stop being displayed. Re-creating an attribute with the same key brings them back into view. - No automation action writes an attribute. Rules can read attributes; nothing in Lynomia Chat sets one for you. Every value is typed by a person, imported, or written through the API. - There is no bulk editor for attribute values. Set them on the contact, or bring them in with an import. Related - Contacts - Import contacts - Labels - Shared audiences - Automation rules If it does not work The attribute is not in the contact's Attributes tab. It was created as a conversation attribute. Check Applies to in Settings. I cannot save the key. It contains a space, or it is the name of a built-in field. The values I imported are nowhere. The column header and the attribute key must match exactly, including case. Fix the key or re-import with the right header. Settings has no Custom attributes page. You are signed in as an agent. Definitions are an administrator job.
Import contacts
An import is how a list that lives somewhere else becomes contacts you can message. It has two entrances — a CSV file, or phone numbers pasted into a box — and from the moment you press Continue they behave identically, because pasted numbers are turned into a one-column file and run through the same importer. The part worth knowing before you use it is the preview: it tells you what the import will do, row by row, without doing any of it. When to use it, and when not Use it when you are moving from another tool, when somebody has handed you a list of numbers for a campaign, or when you want to relabel many contacts at once — export them, edit the labels column, import the file back. The export includes that column and the importer reads it, so the round trip works. Do not import to keep a field up to date. An import is a one-off write and will not notice later changes at the source. Membership that goes stale belongs in a shared audience, which is recalculated each time it is used. What you need first - You must be an administrator. On plans with custom roles, an agent granted contact management can import too. - Any label you want to apply must already exist. The import refuses a row naming a label this account does not have, rather than inventing it. - A .csv file of 10 MB or less, if you are importing a file. The CSV columns There is no column mapping step. Headers are matched by name, so they must be spelled exactly as below. Download a sample csv in the dialog gives you a file with the right headers. | Column | What it does | |---|---| | name | the contact's name | | phone_number | the number, in any of the forms described below | | email | the email address | | identifier | your own key for this person | | labels | one or more existing labels, separated by commas | | company_name | stored on the contact | | city | stored on the contact | | country_code or country | the country for this row's phone number, overriding the import's choice | Every other column is kept on the contact as a custom attribute value, keyed by the column header — but it is only visible in the Attributes panel if a custom attribute with exactly that key exists. The three choices for the whole import | Choice | Effect | |---|---| | Labels for every contact in this import | Added to every row, on top of anything in the row's own labels column | | Country for local numbers | Used only for rows that give no country of their own, and only for numbers written without a country code | | Contacts this account already has | Update their details, or Keep their details | Phone numbers A number is stored in international form, but what you may write in the file is wider than that. | In the file | Stored as | |---|---| | +966551112233 | +966551112233 | | 00966551112233 | +966551112233 | | 966551112233 | +966551112233 | | 0551112233, with the country set to Saudi Arabia | +966551112233 | | 0551112233, with no country | skipped — "a local number needs a country" | Lynomia Chat refuses rather than guesses: a local number with no country could belong to any of a dozen countries, and a wrong guess stores a number that looks plausible and reaches nobody. The country that was used is remembered on the contact, so editing it later starts from the same country. Duplicates Against your account, a row is matched by identifier first, then email, then phone number. What happens next is the choice you made: | | Update their details | Keep their details | |---|---|---| | Name, company, city | overwritten when the row has a value | untouched | | Email, phone, identifier | overwritten when the row has a value | untouched | | Custom attributes | merged; the row's keys win, the rest survive | untouched | | Labels | added | added | A blank cell never clears a stored value, under either choice. Labels are additive either way, because an import should not be able to delete a decision another agent made. Within the file, a second row naming a contact an earlier row already named is counted as a repeated row. One contact is created, and both rows' labels land on it. Since a phone number can belong to only one contact in an account, a file listing the same number twice produces one contact, not two. There is no merge option on import — see contacts for merging two existing records. Pasting numbers Choose Paste numbers instead of a file. One number per line, or separated by commas, semicolons or tabs, so a hand-typed list and a column copied from a spreadsheet both work. Spaces inside a number are fine: +965 5111 2233 is one number. This path sets phone numbers only — names, emails and identifiers need a CSV — and takes at most 10,000 numbers per paste. Steps 1. In the contacts list, open the add menu and choose Import contacts. 2. Pick CSV file or Paste numbers, and provide one. 3. Set the labels, the country for local numbers, and what to do about contacts you already have. 4. Continue. Read the preview. 5. Import. The preview groups rows into New contacts, To update, Left as they are, Repeated rows, No way to reach and Will be skipped, lists the rows you need to act on with the reason for each, and shows each number as it would be stored. It examines the first 250 rows and says whether that was the whole file. Nothing happens until step 5. You can go Back, change a choice, and look again. A worked example A trade show gave you 600 numbers in a spreadsheet, written as local Kuwaiti numbers. 1. Create a label expo-2026 in Settings first. 2. Paste the column in, or save it as a CSV with one phone_number header. 3. Set Labels to expo-2026, Country for local numbers to Kuwait, and leave the duplicate choice on Update their details. 4. Continue. The preview says 548 new contacts, 11 to update, 38 repeated rows and 3 skipped, and names the three. 5. Import, then fix the three by hand. Those 11 "to update" are people you already had. They keep their names and gain the label. Limits - No undo. An import cannot be rolled back. The preview exists so that you do not need one. - The preview checks the first 250 rows; longer files are imported the same way, just not shown in full. - The import runs in the background and the page does not report when it finishes. The account's administrators receive an email, with the rejected rows attached as a CSV — your original row plus an errors column saying why. - The per-import breakdown of counts lives on that import's own page under Settings → Data, which needs the Data import feature enabled for your account. - A row with a name and nothing else is created but never appears in the contacts list. The preview counts it under No way to reach. Related - Contacts - Custom attributes - Bulk actions on contacts - Labels - Shared audiences If it does not work Every row was skipped for unknown labels. The labels column names labels that do not exist in this account. Create them, or clear the column. Everything was skipped with "a local number needs a country". The file has local numbers and no country was chosen. Set Country for local numbers, or add a country_code column. The file will not upload. It must have a .csv extension and be 10 MB or smaller. Export again as CSV rather than renaming an .xlsx. The import changed names I wanted left alone. The duplicate choice was Update their details. Re-run with Keep their details to add labels without touching anything else. Arabic names came out as symbols. Save the CSV as UTF-8. Exports from Lynomia Chat already are, and re-import cleanly.
Bulk actions on contacts
A bulk action is one instruction applied to many contacts. Lynomia Chat offers three: add labels, remove labels, and delete. They all work the same way, and the interesting part is not the buttons — it is what "many" is allowed to mean. Two kinds of selection The contacts list shows fifteen rows at a time, so there are two different things you might mean by "all of them". | | What it selects | How you get it | |---|---|---| | Rows | the contacts you ticked | tick them, or Select all (15) for the page | | The whole view | every contact the current view matches, however many pages that is | tick everything on the page, then Select all N in this view | The second option only appears once the page itself is exhausted and the view has more rows beyond it, because until then the two mean the same thing. Once it is on, the bar stops counting rows and reads All N selected. Touching any individual checkbox turns it back off — a hand-made change to the selection is no longer "everything this view matches". A row selection survives paging, so you can also build one up across several pages by hand. The views you can act on as a whole Whichever view you are in is the view that gets acted on: - the contacts list, on its own or narrowed to one label - a search - the Active contacts list - a filter you have applied, or a saved shared audience The resolution happens on the server, from the same description the list was built from, so the contacts acted on are the contacts the list was showing. This is also why a whole-view action is not available until you have scrolled to the bottom of the page: only the server can enumerate the rows your browser does not have. On a search, Lynomia Chat sometimes cannot say how many results there are without a slow count, and in that case the button reads Select all results in this view with no number. It still acts on all of them. A missing number is honest, not a failure. When to bulk-act, and when to do something else A bulk action is the right tool only when you want a one-off, permanent change to the contacts themselves. Three near neighbours do something different, and reaching for the wrong one is the usual mistake: | What you actually want | Use | Why not a bulk action | |---|---|---| | A group that keeps itself up to date | a shared audience | a label applied today does not notice tomorrow's new customers | | To get contacts into the account in the first place | import contacts | bulk actions only change contacts that already exist | | To message this group | a campaign | labelling people does not send anything | | To mark one conversation, not the person | a conversation label | a contact label follows the customer across every conversation they ever have | Do not use a bulk action when the set is a question, not a list. "Customers who bought in the last 60 days" changes every day. Labelling them freezes an answer that was only true at the moment you pressed the button. Save it as a shared audience instead, and the answer stays current. Do use one when the set really is a list. "These 240 contacts came from the trade show" is a fact that does not change, and a label is exactly how you record it — including because a label is the only way to reach a hand-picked set from a campaign at all. A shared audience stores a query, not a set of people, so there is no way to express "these specific contacts" in one. What you can do | Action | Who | Notes | |---|---|---| | Assign Labels | any agent | Additive. Existing labels on the contact are kept. The label must already exist in the account. | | Remove Labels | any agent | Subtractive. Labels the contact does not carry are ignored. | | Delete | administrator | Permanent, and takes the contacts' conversations with them. | The Remove menu lists every label in the account rather than only the ones your selection carries, so you may see labels that do nothing when removed. That is harmless. Steps 1. Open the contacts list and get to the set you want: search, apply a filter, or open a label or audience. 2. Tick the rows, or tick the page and then Select all N in this view. 3. Choose an action in the bar that appears. 4. Wait. The action is queued and the list refreshes once it has actually run, so the rows you see afterwards are the result and not a stale copy. A worked example You want every customer in Hawalli who has bought from you to carry the label hawalli, so you can message them when a branch opens there. 1. In the contacts list, apply a filter: city is Hawalli. 2. Tick the checkbox at the top of the page. The bar says 15 selected. 3. Select all 412 in this view. The bar now says All 412 selected. 4. Assign Labels → hawalli. 5. Open Contacts → Tagged with → hawalli to confirm, and use it as a campaign's recipients from there. Note what step 4 did: it put the label on the contacts, which is what a campaign reads. Labelling conversations would not have worked — see labels. Limits - 10,000 contacts per action. A view matching more than that is refused outright and nothing is queued. An action that silently did a quarter of the job would be worse than one that did nothing. Narrow the view, or work through it page by page. - Only labels and deletion. There is no bulk edit of names, phone numbers, custom attributes or the blocked flag, and no bulk "add to an audience". To change field values in bulk, export the contacts, edit the file and import it back. - No partial-failure report. If one contact in a selection cannot be saved, it is skipped quietly. The action reports success for the batch. - Bulk actions are not recorded in the audit log, and neither is any other change to a contact. - Deletion cannot be undone, and unlike deleting a single contact it does not stop for a contact who is currently online. - Export is a separate action in the page header, not part of this bar. It exports the view you are looking at, is administrator-only, and arrives by email. Related - Contacts - Labels - Import contacts - Shared audiences - WhatsApp campaigns If it does not work "Select all N in this view" is not offered. Either every row of the view is already on the page — in which case the page selection is the whole view — or you have not selected the whole page yet. It appears only once every visible row is ticked. The message says the view has too many contacts. It matches more than 10,000. Add a condition to the filter and try again; nothing was changed. The labels menu will not accept a label. Labels have to exist in the account before they can be assigned. Create it in Settings first. Delete is missing from the bar. You are signed in as an agent. Deleting contacts is an administrator action. I removed a label and the contacts still show it. Check which label. Contact labels and conversation labels are stored separately, and this bar only touches contact labels.