Clients
What it is
The customer master — every counterparty you quote and invoice, their pricing tier, payment terms and contact details. Clicking a row expands it into a full editing panel in place.
Who can open it
Any signed-in staff account that is active. Two gates, both in proxy.ts: account status, then
the sales.clients feature grant while FEATURE_GRANULAR_RBAC is on, with the owner bypassing.
Before you start
Two kinds of row will not be in the list at first glance:
- Sub-clients are hidden by default. A customer billed under a parent's statement is not shown as its own row. When any exist, a Show N sub-clients button appears next to the filters; the parent's expanded panel also lists them. The Total Clients tile counts what is shown, so it moves when you toggle that button.
- Customers shared in from another of your companies are marked with a shared badge and are read-only. Their actions column reads Read-only instead of the usual menu. They also ignore the entity filter — a shared row belongs to the context you are working in, not to the entity you filtered to.
Every control on the page
Header:
| Control | What it does |
|---|---|
| Filters | ⚠️ Applies nothing. Saved Views inside it does work and restores both the search and the entity filter. |
| Columns | Name, Tier, Contact, Email, Phone, Status, Payment Terms, Markup Tier, KYC Status, Last Order. Remembered; Reset restores the default six. |
| ⋯ More | Export CSV, Print, Archive selected, Bulk-tag — only Print works. The table has its own working CSV export. |
| + Add Client | Opens the New Client form. |
Four tiles (once at least one customer exists): Total Clients, Gold Tier, Platinum, Avg Pay Terms (the average of everyone's payment terms, counting 30 days where none is set).
Filter row:
| Control | What it does |
|---|---|
| 🔍 Search clients or contacts… | Matches the company name and the contact name. |
| All Entities | Restrict to one of your companies. Shared-in rows stay visible regardless. |
| N clients | How many the table is showing. |
| Show / Hide N sub-clients | Only present when sub-clients exist. |
Tick rows and the bulk bar offers 🗑 Delete.
Per row: 📄 Statement opens the customer's statement of account; 🔗 Portal copies their portal link to the clipboard and is only shown when they have one; the row menu is Edit / Delete, replaced by Read-only on a shared-in customer.
Clicking a row expands it into the edit panel — the same fields as the New Client form — with ✓ Save Changes at the bottom.
New Client form — Entity and Company Name are required. Also contact name, email, phone, WhatsApp, GSTIN, state, pincode, address, currency (defaulted from the entity), payment terms, markup tier and the parent client for a sub-client.
Partly built
- ⋯ More → Export CSV, Archive selected and Bulk-tag do nothing. Use the table's own export.
- The Filters panel applies nothing — the search box and the entity dropdown are the real filters.
- On a completely empty list, the offered Import Clients (CSV) and Connect Address Book buttons link nowhere. Add Client on that same empty state works.
What it writes
| Action | What it writes |
|---|---|
| Save Client / ✓ Save Changes | Creates or updates the clients row, including the parent link for a sub-client. |
| 🗑 Delete (row or bulk) | Deletes the customer records. Asks first. |
| 🔗 Portal | Copies to the clipboard; writes nothing. |
| 📄 Statement | Navigates; writes nothing. |
When it goes wrong
A customer you know exists is missing. Check three things in order: the search box, the entity dropdown, and whether it is a sub-client — those are hidden until you press Show N sub-clients.
A customer's row has no Edit or Delete. It is shared in from another company and is read-only there. Edit it from the company that owns it.
Save is greyed out. The company name is empty; it is required.
There is no 🔗 Portal button. That customer has no portal token yet.
The Total Clients tile disagrees with the number of rows. The tile counts what is currently shown, which changes when you show or hide sub-clients.
⋯ More → Export CSV did nothing. Use the export on the table itself.
Related screens
- Suppliers — the same pattern for vendors.
- Address Book — contacts, as distinct from billing customers.
- Invoices — where payment terms decide what counts as overdue.