---
title: Customers
order: 6
updated: 2026-07-21
---

# Customers

The customer list holds every firm or individual you sell to. A customer record has to exist before you can raise an enquiry, generate a quotation, book an order, or send a delivery against them — the customer is the anchor that every sales document hangs off. Each record carries the customer's name, address, GST number, and two per-customer default term blocks (quotation terms and invoice terms) that pre-fill onto the documents you generate for them.

Everything on this page is re-checked on the server. Even if a field looks optional in the form, the API independently re-validates the payload, sanitises the rich-text terms for XSS, and refuses to delete a customer that is still referenced anywhere — so a forged or malformed request can't quietly corrupt the data or crash the enquiry pipeline.

## Open the customer list

1. Open *Data Entry* in the sidebar and click *Customers*.
2. The *Customers* page opens with a count badge next to the title (e.g. `20+` — the `+` means more rows exist beyond the ones loaded so far) and a one-line list of every customer, sorted alphabetically by name.

The whole page is gated by the *View Customers* permission (`database.viewCustomerList`). Without it the server returns `403` and the page cannot load its data. Every other action below (add, edit, delete, manage contacts) depends on this view permission first.

## Add a customer

Click *Add Customer* (top-right — only shown if you hold *Add Customer*, `database.addCustomer`) to open the add form. The form is split across three tabs. A small red dot appears on a tab heading if a required field on that tab is blocking the save.

Fill the tabs, then click *Add Customer* at the bottom. On success the customer is saved and the list refreshes.

### Basic Info tab

This tab holds the name and the full postal address.

#### Customer Name

- The firm or person's name (e.g. `Acme Corp`). Free text.
- **Required.** Both the form and the server reject a blank name. The name is trimmed of surrounding whitespace before it is stored.
- This is the only field the search box matches on, and it is what appears in every customer picker across the app — so keep it recognisable and avoid duplicates.

#### Address

All address fields live in an *Address* card and are laid out in a two-column grid. Every address field is **optional** — you can save a customer with no address at all — but the address is what prints on quotations, orders, and other documents, so fill what you have.

- *Plot / Unit No.* — building / plot / unit line (e.g. `A-102 / Plot 45`). Optional, stored trimmed, default empty.
- *Street / Area* — street or locality (e.g. `MG Road, Civil Lines`). Optional, stored trimmed, default empty.
- *City* — optional, stored trimmed, default empty.
- *State / UT* — a searchable dropdown of all Indian states and union territories. Type to filter the list, then pick one. The full state name is stored (not a code). Optional on the add form.
- *Country* — free text, **defaults to `India`**. Optional; you can change or clear it.
- *Postal Code* — free text (e.g. `110001`). Optional on the add form, stored trimmed.

> Note: the *Edit* form marks *State / UT* and *Postal Code* as required and will block the save until they are filled, whereas the *Add* form treats them as optional. If you add a customer with a blank state or postal code, plan to complete those two fields the next time you edit the record.

### Business & Tax tab

#### GST Number

- The customer's GST identification number (placeholder shows the shape `22AAAAA0000A1Z5`). Free text, stored trimmed.
- **Required** on the add form, and the server independently rejects an add with a missing GST number.
- There is **no server-side format/checksum validation** — the app stores whatever you type. Enter the real GSTIN carefully; a wrong number here flows straight onto tax documents. The GST number is also what surfaces in the customer hover-tooltip elsewhere in the app, so keep it accurate.

### Customizations tab

Two per-customer default term blocks. These are starting points that pre-fill onto the documents you generate for this customer; they do not change any document that was already sent.

#### Default Quotation Terms

- A **rich-text** editor (bold, lists, etc.). This is the terms-and-conditions block that seeds the *Terms* section when you generate a quotation for this customer.
- **Pre-filled from the firm-wide default.** When you open the add form, the app fetches the firm's default quotation terms (set under *Settings → Firm Customisation → Sales Communication → Quotation Personalisation → Default Terms & Conditions*) and drops them in so you can edit from the template instead of a blank box. If the firm has no default configured, the field starts empty. See [Document templates](/docs/settings/document-templates#default-terms--conditions).
- **Server fallback on save.** If you clear this field entirely and save, the server re-checks: an HTML-empty value (an empty rich-text doc such as `<p></p>`) is *replaced* with the firm's default quotation terms at save time. So a customer effectively always ends up with either your edited terms or the firm default — never truly nothing, as long as a firm default exists.
- The content is **XSS-sanitised** on the server before it is stored; any stripped script/attack attempt is recorded to the firm's security log.

#### Default Invoice Terms

- A plain multi-line text field (four rows) for the terms that pre-fill onto this customer's invoices.
- Optional. Stored trimmed and **XSS-sanitised** on the server the same way as the quotation terms. Unlike the quotation terms, there is no firm-default fallback for invoice terms — leave it blank and it stays blank.

## Find a customer

Use the *Search customers…* box above the list. Typing runs a search after a short pause (about a third of a second) and replaces the list with the matches; clearing the box restores the full scrolling list.

The search matches the **customer name only** (not GST, address, or terms) and is deliberately forgiving:

- It tolerates typos, missing spaces, and different word order — `alibaba holdings`, `Alibaba`, and `alibabaholdings` all find *Alibaba Holdings*.
- Common company filler words (`inc`, `llc`, `ltd`, `corp`, `co`, `company`, `group`, `holdings`, `enterprises`, `international`, `global`, `services`, `solutions`, `technologies`, `systems`, and similar) are treated as low-weight, so the distinctive part of the name drives the ranking.
- Results are ranked best-match first; an exact or starts-with match always outranks a loose subsequence match.

A search returns up to `30` matches at a time. If you don't see the customer, refine the term rather than scrolling.

## Edit a customer

If you hold *Edit Customer* (`database.editCustomer`), each row shows an *Edit* button. It opens the same three-tab form pre-loaded with the current values.

- The rich-text *Default Quotation Terms* editor seeds from the customer's existing saved terms (it also understands legacy plain-text terms and shows each line as its own paragraph).
- On save, the server requires a customer ID and a non-blank *Customer Name*, re-sanitises both term blocks, and writes the update. A missing or unknown ID returns `404`.
- Edits affect **future** documents only. A quotation, order, or delivery that was already generated keeps the name, address, GST, and terms that were current when it was made — see the questions below.

## Manage contact persons

A customer is the firm; the people you actually email (quotations, follow-ups) are its *contact persons*. Each row has a button in the *Contact Person* column:

- *Update Contacts* — shown if you can add or edit contact persons (`database.addCP` or `database.editCP`).
- *View Contacts* — shown if you can only view them.

The whole column only appears if you hold *View Contact Persons* (`database.viewCPList`). Clicking it opens that customer's contact-person screen. Full details are on [Customer contacts](/docs/records/customer-contacts).

## Delete a customer

If you hold *Delete Customer* (`database.deleteCustomer`), each row shows a *Delete* button. It opens a *Delete Customer* confirmation naming the customer; the action cannot be undone.

Deletion is guarded in two stages, both enforced on the server:

1. **Contact persons first.** If the customer still has any contact persons, the delete is refused and a message tells you exactly how many to remove first (e.g. *Please remove 3 linked contact persons before deleting this customer*). Delete or reassign those contacts, then try again. See [Customer contacts](/docs/records/customer-contacts).
2. **Other references.** If any other record still points at the customer — enquiries, enquiry drafts, orders, stock deliveries, sample deliveries, or delivery notes — the delete is blocked and a *Where-used* breakdown opens listing what references the customer and how many of each. Clear or reassign those records first. This is a hard block: the customer is only removed once nothing references it. See [Deleting records](/docs/records/deleting-records).

Only when both guards pass is the record permanently deleted.

## Common questions

### Which fields are actually required?

*Customer Name* and *GST Number* are the two the server always enforces on add. The form also flags them (a red dot on the tab if they're blank). The address fields are optional on the add form, though the edit form additionally requires *State / UT* and *Postal Code*. The two term blocks are optional — if you leave *Default Quotation Terms* empty, the firm's default quotation terms are filled in for you on save.

### Is the GST number checked for a valid format?

No. The app stores exactly what you type — there's no GSTIN checksum or pattern validation on the server. Enter it carefully, because it prints onto tax documents. The placeholder `22AAAAA0000A1Z5` only shows the expected shape.

### Where do the Default Quotation Terms come from, and what are they used for?

When you add a customer, the field is pre-filled from your firm-wide default (set under *Settings → Firm Customisation → Quotation Personalisation*). You can edit them per customer. When you later generate a quotation for this customer, these terms seed the quotation's *Terms* section. If you clear them, the server falls back to the firm default at save time. See [Document templates](/docs/settings/document-templates#default-terms--conditions) and [Generate a quotation](/docs/enquiry-bank/generate-quotation).

### What is the Default Invoice Terms field for?

It stores the terms that pre-fill onto this customer's invoices. It is optional and, unlike the quotation terms, has no firm-wide fallback — blank stays blank.

### What if a customer changes address or GST number?

Open the record with *Edit* and update the field. New documents you generate use the updated details; documents already generated keep the address, GST, and terms that were current when they went out. Nothing you edit here rewrites history.

### Why can't I see the Add, Edit, Delete, or Contacts buttons?

Each is gated by its own permission, all enforced on the server as well as hidden in the UI: *Add Customer* (`database.addCustomer`), *Edit Customer* (`database.editCustomer`), *Delete Customer* (`database.deleteCustomer`), and the contacts column (`database.viewCPList`, with *Update* vs *View* depending on `database.addCP` / `database.editCP`). All of them require *View Customers* (`database.viewCustomerList`) first. Ask a firm administrator to grant the ones you need.

### Can one person be a contact for two customers?

No. A contact person belongs to exactly one customer. If the same individual works with two customer firms, add a separate contact under each. See [Customer contacts](/docs/records/customer-contacts).

### The customer I'm searching for isn't showing up.

The search only matches the customer *name*, not the GST number or address. It's typo-tolerant and ignores common filler words, but if nothing matches, check the spelling of the distinctive part of the name (or scroll the full list with the search box cleared). It returns at most `30` matches per query.

### What happens to old enquiries and orders if I delete a customer?

You can't delete a customer that is still referenced. The server blocks the delete and shows you exactly which enquiries, orders, deliveries, or other records point at the customer, plus any contact persons that must go first. Clear or reassign those, then delete. This is what stops a deletion from orphaning documents and breaking the enquiry or order pipelines. See [Deleting records](/docs/records/deleting-records).

### How is this different from a supplier?

Customers are who you *sell* to; suppliers are who you *buy* from. They're separate lists with separate records. For the buying side, see [Suppliers](/docs/records/suppliers).
