---
title: Customer contacts
order: 7
updated: 2026-07-12
---

# Customer contacts

A customer is a firm; a *contact person* is an individual who works at that firm. The system never emails a customer record directly — customers carry no email address of their own. Instead, quotations, order acknowledgments, delivery receipts, and follow-up reminders are all addressed to a specific contact person you pick at send time. So every customer you actually correspond with should have at least one contact person on file, with a valid email.

Contact persons live on their own screen, nested under the parent customer. This page covers opening that screen, the full add/edit form (both tabs and every field), searching, and what happens when you try to delete a contact that other records still point at.

## Before you start

- The customer record must already exist. See [Customers](/docs/records/customers).
- You need the *View Contact Persons* permission (`database.viewCPList`) just to open the screen, and *Add Contact Person* (`database.addCP`), *Edit Contact Person* (`database.editCP`), or *Delete Contact Person* (`database.deleteCP`) for the matching actions. All four default to **off** for a new role, and each one depends on *View Customers* (`database.viewCustomerList`) being granted first — contact persons inherit their parent customer's visibility. See [Users and permissions](/docs/settings/users-and-permissions).
- Have the person's first name, last name, and email ready. A phone number, post, and salutation are optional when you first add them (but see the [edit gotcha](#why-cant-i-save-my-edit-it-says-a-field-is-missing) below).

## Open the contacts screen

1. Open *Data Entry* in the sidebar and click *Customers*.
2. Find the customer in the list and click its *Update Contacts* button. If you hold neither *Add* nor *Edit* permission for contact persons, the same button instead reads *View Contacts* and the screen opens read-only.

The *Contact Persons* screen opens with *Customer Name: <the customer>* shown above the list. The *< Back* button at the top-left returns you to the customer list.

Everything on this screen works identically in the web app and the Tauri desktop app — there are no desktop-only or web-only controls here.

## The contacts list

The table shows the contacts already on file for this customer, four columns wide:

- *Name* — the salutation (if any) plus first and last name, e.g. `Mr. Alex Doe`.
- *Phone* — the primary phone number.
- *Email* — the primary email. Click it to copy it to your clipboard (a tooltip confirms the copy).
- *Post* — the person's job title / designation.

If there are no contacts yet, the table reads `No Contact Persons yet. Add one to get started.`

*Edit* and *Delete* buttons appear at the end of each row **only if** you hold the matching permission — a viewer with read-only access sees neither.

### Sorting and paging

The list is sorted alphabetically by first name, then last name, case-insensitively (so `alex` and `Alex` sort together). It loads `20` contacts at a time and pulls in the next `20` automatically as you scroll to the bottom — there are no page buttons.

## Find a contact

Use the *Search contact persons…* box above the list. Typing runs a fuzzy search (after a short pause of about a third of a second) that is **scoped to this customer only** and matches against the **first and last name** — it does not search by email, phone, or post. The search is forgiving: it tolerates different spacing and punctuation and ranks closer matches first, so a partial or slightly misspelled name still surfaces the right person. Clear the box to return to the full, scrollable list.

## Add a contact

Click *+ Add Contact Person* (visible only with *Add* permission). The *Add Contact Person* modal opens with two tabs: *Basic Info* and *Additional Details*. Fill what you need, then press *+ Add Contact Person* at the bottom to save. The button reads *Saving…* while the request is in flight.

### Basic Info tab

#### Salutation

An optional courtesy title shown in front of the name. Choose from `None` (the default), `Mr.`, `Mrs.`, `Ms.`, or `Dr.`. The server re-checks the value against that exact list and rejects anything else, so a forged salutation can't be stored.

#### First Name

**Required.** The form refuses to save an empty first name (`First name is required`). This is also the field the on-screen list sorts and searches on. It is trimmed of surrounding spaces when stored.

#### Last Name

**Required** in the add form (`Last name is required`). Trimmed when stored. (The underlying record technically allows an empty last name — that only matters for older data; the form always asks for one.)

#### Email

**Required** and must be a syntactically valid address (`Invalid email address`), e.g. `alex.doe@example.com`. It is lower-cased and trimmed when stored, so `Alex.Doe@Example.com` and `alex.doe@example.com` become the same value. This is the address quotations and other documents go to when this person is the chosen recipient.

#### Phone Number

Optional. As you type, the field keeps only the digits — spaces, dashes, brackets, and `+` are stripped automatically — and re-displays them in groups of four for readability (`1900 9009 0090`). Only the bare digits are stored. The input caps at `14` characters including the display spaces, which works out to about `12` digits.

#### Post / Job Title

Optional free text, e.g. `Sales Manager`. Trimmed when stored. Purely descriptive — it appears in the *Post* column and helps you tell two contacts apart.

### Additional Details tab

These two fields are entirely optional and are for a fallback point of contact. They are not used as automatic email recipients — documents go to the primary *Email* — but they keep a backup on record.

#### Secondary Email

Optional. If you fill it in, it must be a valid email address (or left blank). Lower-cased and trimmed when stored.

#### Secondary Phone Number

Optional. Uses the same digits-only entry and four-digit grouping as the primary phone, capped at about `12` digits.

### What the server checks on save

Even though the form validates as you type, the backend re-verifies everything independently (it assumes any request could be forged):

- You must hold *Add Contact Person* permission, or the save is rejected outright.
- The email must be a valid address; the salutation must be one of the five allowed values.
- The customer the contact is being attached to must actually exist — the server looks the customer up before saving and returns `Invalid company ID: No customer found with the provided ID.` if it doesn't. This is what stops a bad or forged customer reference from creating an orphaned contact.

On success the modal closes, a *Contact person added successfully!* toast appears, and the list reloads from the top. The new contact is immediately available anywhere the system asks you to choose a contact for this customer.

## Edit a contact

Click the *Edit* (pencil) button on a row to open the *Edit Contact Person* modal. It has the same two tabs and the same fields as the add form, pre-filled with the current values. Change what you need and press *+ Update Contact Person* (it reads *Saving…* while saving).

Two behaviours are specific to editing:

- **No-op guard.** If you press save without actually changing anything, the app shows a *No changes detected.* warning and does nothing.
- **Stricter required fields.** Unlike adding, saving an edit requires the first name, last name, email, **phone number, and post all to be filled in.** If any of them is blank the server refuses the update with a *Missing required fields* error. See the [common question](#why-cant-i-save-my-edit-it-says-a-field-is-missing) below — this catches people who added a contact without a phone or post and later try to edit some other detail.

On success the modal closes, a *Contact person updated successfully!* toast appears, and the list reloads.

## Remove a contact

Click the *Delete* (trash) button on a row (visible only with *Delete* permission). A *Delete Contact Person* confirmation asks *Are you sure you want to delete <name>? This action cannot be undone.* — press *Delete* to proceed or *Cancel* to back out.

### When the delete is blocked

A contact person can only be deleted if nothing else references it. If the contact is still used by other records — enquiries, orders, purchase-related documents, and so on — the delete is **blocked** and a references screen opens instead, titled *Unable to delete — references found*. It explains that *<name> is referenced by the records below. Please remove or reassign them before deleting.* and shows one **tab per kind of record** that points at this contact (each tab's label carries a count, e.g. `Enquiries (3)`). Each row has an *Open* (external-link) button that jumps you straight to that record so you can reassign it to a different contact. Once every reference is cleared, *Close* the screen and try the delete again.

Deleting a contact person never touches the parent customer record — only the contact itself is removed.

## Common questions

### Can the same person be a contact for two customers?

No. Each contact person belongs to exactly one customer record. If the same individual works with two customer firms in your books, add a separate contact under each customer.

### Which contact gets the quotation or receipt?

You choose the contact when you generate the document. Make sure the right person — with a current email — is selected before you send. See [Generate a quotation](/docs/enquiry-bank/generate-quotation).

### Do I have to fill in a phone number and post?

Not when you first add the contact — only first name, last name, and email are required to create one. But note that **editing** an existing contact requires the phone and post to be present, so it's worth filling them in up front.

### Why can't I save my edit — it says a field is missing?

The edit form requires the first name, last name, email, phone number, **and** post to all be filled in. If the contact was originally added without a phone or a post, the edit will be rejected until you supply those too. Add the missing value and save again.

### I typed my phone number with a `+` and spaces — where did they go?

The phone fields keep only the digits and re-format them in groups of four for display. The stored value is just the digits; any `+`, spaces, dashes, or brackets you type are dropped. Enter the number as digits only.

### Why don't I see the Add / Edit / Delete buttons?

Each action is permission-gated. *Add Contact Person*, *Edit Contact Person*, and *Delete Contact Person* are separate permissions (all off by default), and you need *View Contact Persons* just to open the screen. If you only have view access, the customer row's button reads *View Contacts* and the screen is read-only. Ask a firm administrator to adjust your role — see [Users and permissions](/docs/settings/users-and-permissions).

### What's the difference between the primary and secondary email?

The primary *Email* is the address documents are actually sent to when this contact is chosen as the recipient. The *Secondary Email* on the *Additional Details* tab is just a backup kept on record — it is not used as an automatic recipient.

### How is this different from supplier contacts?

It's the same idea on the procurement side: suppliers are firms and their contacts are the individuals RFQs, purchase orders, and vendor follow-ups are addressed to. See [Supplier contacts](/docs/records/supplier-contacts).

### What happens to enquiries if I delete a contact?

You can't delete a contact that enquiries (or other records) still reference — the delete is blocked and the app lists every referencing record so you can reassign them first. For the general rules on why records refuse to delete, see [Deleting records](/docs/records/deleting-records).
