# Add, edit and merge a contact

Create somebody by hand, correct their details, and join two records that turn out to be the same person.

## Quick start

1. Open **Contacts** and click **New contact**. On the app, use the **Contacts** tab.
2. Type the **Name**, pick the dialling code, and type the **Phone**.
3. Click **Add contact**. With a number and a WhatsApp channel, the chat opens straight away.
4. Nothing reaches the customer until you send; your first message must be an approved template.
5. On the web, to join a duplicate, tick both rows, open **⋯**, choose **Merge**, and pick which to keep.

## Watch out

- A merge cannot be undone. The record you do not keep is deleted.
- Marketing consent is combined, not taken from the keeper: a withdrawal on either record wins, otherwise a consent carries over.

![The New contact dialog, with Name, dialling code and Phone.](https://inchat.inseller.my/help/contacts/add-edit-and-merge-contacts-1.webp)

![Two duplicate Michael Torres rows ticked, ready for Merge.](https://inchat.inseller.my/help/contacts/add-edit-and-merge-contacts-2.webp)

## Getting here

To create: **Contacts** → **New contact**. To edit: open the contact and click the value you want to change. To merge: tick exactly two rows, then **⋯** → **Merge**. On the app: the **Contacts** tab to create, **Edit details** on the contact screen, and the duplicate it suggests to merge.

## Before you start

- Owners, admins and agents can create, edit and merge. A **viewer** sees the values and no **New contact** button.
- You do not have to create anybody who has written to you. A contact appears the first time somebody messages a connected channel.
- Merging deletes one of the two records. Read the panel before you confirm.

## Fields

| Field | What it means | Limits |
| --- | --- | --- |
| Name | Required, up to 120 characters. | — |
| Country dial code and Phone | The number, saved in international form. This is the value everything else looks the person up by. | — |
| Email | Optional. | — |
| Message from | Which of your WhatsApp numbers to open the chat on. | Shown only when your workspace has more than one, and it counts only if you change it. |

## How it works

- A phone number is stored in international form or not at all. It is a matching key rather than a label: sending, duplicate detection and broadcast addressing all find the person by it.
- Typing a number somebody already has is not an error. You are taken to that person's open conversation, which is what you wanted anyway.
- With a number and a WhatsApp channel you can reach, saving opens the chat straight away. With no number, or no channel, you land on the contact's own page instead.
- The form says it plainly: they have not written in yet, so your first message has to be an approved template.
- **Message from** counts only when you change it. Left alone, the server picks the number this customer already writes to, which is usually the right one.
- Editing happens where the value is. Click it in the panel, type, and it saves when you click away; a save that fails puts the old value back and says so.
- The number box holds the local part and the picker beside it holds the dialling code, so a number is never shown with its country code twice.
- Your own contact fields save one at a time, and the value is read back from the server rather than trusted as typed.
- Merging asks which of the two to keep. The other one's conversations, channels and messages move across, and it stops existing.
- The keeper's own values win. A name, phone, email, stage, country, language or field value the keeper is missing is filled in from the other one, and their tags are combined. The keeper also takes the earlier first-seen date and the later last-seen date.
- Marketing consent is the exception to that rule. A withdrawal on either record wins, and otherwise a consent on either record carries over to the keeper. A block on either record also carries over.
- If both have an open conversation on the same channel, the other one's is closed first, so two open chats do not collide.
- A merge happens all at once. If any part of it fails, none of it happened, so there is never a half-merged person.
- The merge is recorded on the keeper's **Activity** tab, naming who did it and which record went.
- The app runs the same merge, offered the other way round. Its contact screen lists the duplicates it suspects, and merges the one you pick into the contact you are looking at.

## When it fails

- A number the app cannot read: **That phone number doesn't look right. Include the country code.**
- An address that is not an email: **That email address isn't valid.**
- **Merge** is greyed out unless exactly two rows are ticked and neither is blocked: **Select exactly two contacts, neither blocked, to merge them.**
- Trying to merge without the right role: **You don't have permission to merge contacts.**
- A merge whose keeper has already gone: **The contact to keep no longer exists.**
- Merging somebody who was already merged away does nothing and reports success, so a repeated click cannot do damage.
- A detail the server refuses to save: **Could not save.**

## Limits

- A merge cannot be undone. The record you did not keep is deleted, and no button anywhere puts the person back.
- A merge does not join two WhatsApp numbers into one. The keeper becomes reachable on both, and a reply goes out on the conversation it was written in.
- Creating a contact sends nothing. Nobody hears from you until you write to them.
- In the contacts list, **Merge** is offered only when neither ticked person is blocked. Unblock first.
- You cannot merge three at once. Merge two, then merge the result with the third.
- The app cannot start a merge from two people you picked. It only offers the duplicates it has already spotted.

## Best practices

- Open both records before you merge and check the phone numbers. Once it is done there is no going back.
- Keep the record with the longer history. Everything moves either way, but the keeper's own values win where both have one.
- Check the consent line on both records before merging, because a withdrawal on either one wins.
- Let contacts create themselves. Add somebody by hand only when you need to write to them first.

## Use cases

- Michael Torres gives you his number at an event: add him by hand, and send the approved template while the chat is open.
- The same customer wrote from two different numbers: tick both rows and merge, keeping the one with the order history.
- A typo in a name has been bothering the team: open the contact and fix it where it is.
- A number in your records has no dialling code: edit it, then let the duplicate suggestion point you at the record it should join.

## FAQ and troubleshooting

### Can I undo a merge?

No. The other record is deleted as part of the merge, and there is no restore anywhere in the product. A note of the merge stays on the keeper's **Activity** tab.

### What happens to the messages of the contact I did not keep?

They stay with their conversation, and the conversation moves to the keeper. Nothing is deleted except the duplicate contact record itself.

### The contact I kept had not agreed to marketing. Why is it now allowed?

A consent on either record carries over to the keeper, unless one of them holds a withdrawal — a withdrawal wins. Check the consent line after a merge.

### Why can I not message somebody I just added?

You can, but only with an approved template until they reply. They have never written to you, so there is no open window for free text.

### The number I typed already existed. Did I create a second copy?

No. You were taken to the existing person's conversation.

## Related

- [The contacts list](https://inchat.inseller.my/help/contacts/contacts-list-and-saved-views)
- [Everything you know about a contact](https://inchat.inseller.my/help/contacts/the-contact-panel-and-full-profile)
- [Import contacts from a file, and export them](https://inchat.inseller.my/help/contacts/import-and-export-contacts)
- [Tags and lifecycle stages](https://inchat.inseller.my/help/contacts/tags-and-lifecycle-stages)
- [Marketing consent, and blocking a contact](https://inchat.inseller.my/help/contacts/marketing-consent-and-blocking)

---

Source files: `src/components/contacts/NewContactButton.tsx`, `src/lib/contacts/create-contact.ts`, `src/components/contacts/ContactDetailFields.tsx`, `src/components/contacts/ContactProfileFields.tsx`, `src/components/contacts/ContactCustomFields.tsx`, `src/components/contacts/MergeContactsDialog.tsx`, `src/app/(app)/contacts/merge-actions.ts`, `src/lib/contacts/merge.ts`, `supabase/migrations/20260927121000_merge_contacts_repoints_stage_events.sql`, `src/lib/activity/load.ts`, `src/components/contacts/ContactsBulkTable.tsx`, `src/components/inbox/ContactSidebar.tsx`, `src/lib/i18n/messages/inbox-contact.ts`, `mobile/src/app/contact/[id].tsx`, `mobile/src/components/contact/DuplicateSuggestions.tsx`
