Skip to content
Knowledge ERP Docs

API Reference ↗
CRM

Customers

The shared customer directory — company or person name, addresses, payment terms, and price list — that every customer-facing module (Sales, Inventory, Appointments, Rentals) draws from.

A customer is the anchor record that ties together everything you do for a particular person or organization: invoices, sales orders, quotes, loan agreements, rental agreements, appointments, and unit checkouts all point back to one customer record. Because the customer directory is shared infrastructure, any account with Sales, Inventory, Appointments, or Rentals active can create and manage customers — you don't need the full Sales module just to loan equipment or schedule an appointment.

The customer record holds who — name, contact details, addresses, billing defaults. The activity, tasks, notes, and opportunities that belong to a customer are covered on the Notes, Tasks & Activities and Opportunities & Pipeline pages.

Creating a customer #

New customers are created from Sales → Customers → New Customer (or from the customer picker in any other module's form). The required fields are minimal by design — you can always fill in the rest later.

  • Company Name — the business, charity, school or care home you're dealing with. Leave it blank for a private individual.
  • First Name, Middle Name and Last Name — the person. First Name is optional when you've filled in a Company Name, and required when you haven't; Middle Name and Last Name are always optional.

You need a Company Name or a First Name — one or the other, not both. Fill in both when you deal with a named person at a business, which is the common case for a trade customer.

Which name does the app show? One derived display name appears everywhere a customer is listed, picked, printed or emailed — the customer list, invoice and quote PDFs, the customer portal header, every dropdown. It is the Company Name when there is one, and the first and last name together otherwise. It's derived, so you never type it: change the company name or a name part and every one of those surfaces follows.

The middle name is deliberately not part of it. A middle name is stored, searched and synced on its own, and a customer who has one still appears as Dana Whitfield on the list, in every picker and on every document — so filling one in for one customer does not make them read differently from everybody beside them. Where you want to see it, it is on the customer's own record page, in the Middle Name column on the customer list once you switch that column on, and in middle_name over the API.

Where a customer arrives as a single name instead — a store order import, or an API call sending only name — that name is kept as the display name and split on the first space to fill First and Last Name, so the customer still reads correctly on the customer list and record page.

  • Email — primary contact email, validated on save.
  • Phone — primary phone number.
  • Website — URL (validated).
  • Notes — free-text internal notes, not customer-visible.
  • Payment Terms — default terms applied to new invoices: Due on Receipt, Net 15, Net 30, Net 60, or Net 90. If left blank, invoices don't inherit a due date automatically.
  • Price List — an optional price list that overrides the default Product price when this customer is invoiced or quoted. Only active price lists appear in the picker.
  • Billing Address — street, city, state, postal code, country. Pre-fills on new invoices and quotes for this customer.
  • Shipping Address — separate shipping destination; defaults to the billing address on orders when left blank. If you never ship to customers, turn off Account Settings → Customers → Show a shipping address on customers to remove it from the customer form and record page. An address already entered is kept, and shows again if you turn the setting back on.
  • Segments — assign the customer to one or more manual customer segments (dynamic segments are managed by their own rules). The + beside the field creates a new manual segment without leaving the customer, and adds this customer to it when you save. The button only appears if you have permission to create segments.
  • Custom fields — any custom fields defined on the Customer entity appear at the bottom of the form. See Custom Fields.

One Name box instead of First and Last #

If your organization knows people by one name, Account Settings → Customers → Customer name can be switched to One Name field. The customer form and record page then show a single Name in place of First, Middle and Last Name, and the customer list drops those three columns.

What you type is still stored as a first and last name: the first word becomes the first name and the rest the last name, so Diana Rose Rice is saved as Diana and Rose Rice. Switching back to First and last name shows the same customers split that way, and nothing is lost. A middle name already recorded is kept, but it can't be seen or changed in this mode.

Company Name stays on the form. You need a Name or a Company Name. A customer filed only under a company shows a blank Name, and saving it leaves it as a company. To turn such a record into a person, type the Name and clear the Company Name.

Importing customers from a spreadsheet #

Sales → Customers → Import CSV brings an existing customer list in from a file. Upload it, check the column mapping the app guesses from your headers, and start the import. Download example CSV file in the same dialog gives you a file with the right headers.

A row is matched to a customer you already have by its Customer number, then by Email, ignoring capital letters and accents. A matched row updates that customer; any other row adds one. A new customer needs a Company name, a First name or a Name, and any custom field that must be filled in to save. Name is for a list that keeps a person's name in one column: it is split on the first space into first and last name. A row with a First name or a Last name ignores Name entirely. A customer filed under a company does not take its name from Name. A blank cell leaves that field as it is.

An import never sets or changes an existing customer's email. The email is the customer's portal sign-in, so the import leaves it alone. That includes giving an email to a customer who has none. The rest of the row still imports, and the notification at the end says how many customers kept their email. A new customer takes the email in the file.

A row is refused, with the reason in the failed-rows download, when:

  • its customer number or email is on an earlier row of the same file, or it matches the same customer as an earlier row, say by email where the earlier row used the customer number (each customer can appear once);
  • two of your customers already share its email, so it can't tell which one it is (add a Customer number column);
  • it adds a customer with a number another record already uses;
  • a custom field value doesn't fit the field: a choice that isn't one of its options, a date that isn't a date, a Yes/No field that isn't Yes or No, or a user who isn't one of your users (give their email) or is a service account (unless the customer already has that one).

Each row needs the permission for what it does: adding a customer, or changing one. A row you may not write is refused, and the rest of the file imports.

QuickBooks and segments. The import doesn't send each customer to QuickBooks as it goes, and doesn't fire webhooks for them. When it finishes, it puts customers in their dynamic segments once. Tick Push to QuickBooks afterwards to send the customers it added or changed, along with any others changed while it ran; that only happens when QuickBooks is connected and set to send Customers.

A single import takes up to 20,000 rows. The result arrives as a notification in the bell menu when the run finishes.

The customer list #

The customer list (Sales → Customers) shows each customer's display name — the company for a company, the person otherwise — followed by first name, last name, email, phone, and city/state, so a company's named contact stays visible next to the company it belongs to. Middle Name is available from the column toggle and is off to begin with, because most businesses never fill it in and an empty column between First and Last is only width; switch it on and Export CSV carries it too, since the export is the list as you have it. In an account that uses one Name box, the first, middle and last name columns are not shown.

Use the search bar to filter by name — which is the company name for a company — or by first, middle or last name. It searches the middle name whether or not that column is showing. Email is a column here but not something this search box matches; the API's search filter does match it, and matches company name directly. The Trashed filter reveals soft-deleted customers so you can restore them if needed.

To jump straight to one customer from anywhere in the app, use the global search box at the top of the page instead: it matches name, company name, first, middle and last name, email, and phone, and also returns that customer's orders, invoices, returns, rentals, and loans. See Finding Records.

Choosing a customer on a form #

The Customer box on a quote, sales order, invoice, credit memo, rental agreement or appointment, and the Borrower box on a loan agreement, is a search. Type part of the customer's name, email address or phone number and pick from what comes back. Nothing is listed until you type. The same search is used for the recipient on Scan Checkout.

  • What a result shows. The name, followed by the phone number and email address on file, if your role lets you view customers. Otherwise you see the name only.
  • Phone numbers and email addresses are still searched for everyone who can use the form. Somebody who is not allowed to view customers can type a number or an address and see which customer's name comes back. On a loan agreement the same is true of a contact's phone number or email address and a staff member's email address. Keep that in mind when deciding who may create quotes, orders, invoices, credit memos, rentals, loans or appointments.
  • Checking who you picked. With a customer chosen, an eye button beside the box opens that customer's details, the same ones as on the Customer page, so you can check you have the right person without leaving the form. It appears only if your role lets you view that customer. On a loan agreement it is there when the borrower is a customer, and not for a contact or a staff member.
  • Customer not on the list yet? On the quote and booking forms, and on a loan agreement whose borrower is a customer, press + soon after a search that found nobody and the new customer form opens with what you typed filled in: an email address goes in Email, a phone number in Phone, and a name in First name (the first word) and Last name (the rest). Where the new customer form shows one Name box instead, in an account that uses one, the name goes there whole. It is nothing you need to type again, and you can change any of it. A search that found somebody fills nothing in.
  • What the + asks for. On a quote, the full new customer form. On a loan agreement, on a booking, and in Attach Customer on an appointment, a shorter one: the name (one Name box, or First name and Last name, as your account is set up), email, phone, address, city, state, postal code, a Customer number, and your customer custom fields. A custom field marked Required to save must be filled in before the customer is added. Leave Customer number blank and one is made for you; a number already used by another record is refused. Anything else, such as a company name or a shipping address, is added later on the customer's own page.
  • Up to 50 matches. A short search may match more people than that; type more of the name, email or number.
  • Deleted customers are not offered. A record whose customer was deleted later still shows that customer, marked (deleted), and can still be saved.

Other customer dropdowns — on recurring invoices, opportunities, customer returns and rental rates, for example — still list every customer and match on the name only. Attach Customer on an appointment and Send a survey search by name and email address, but not phone number.

Customer page tabs #

Open a customer to see its full profile and the related data attached to it:

  • Details — all fields from the form, displayed read-only with an Edit button.
  • Contacts — named individuals at the company (see Contacts below).
  • Opportunities — open and closed deals from the pipeline.
  • Checked Out Units — inventory units currently or previously checked out to this customer, across all unit types, including units out on their loans and rentals. The Agreement column says what each unit went out on — a loan, a rental or a sales order, with its number.
  • Change History — a full audit trail of every edit, who made it, and when.

The statement #

A dedicated Statement page (the Statement button in the page header from the customer view) is the document you send when you are chasing payment.

Set the period at the top: an As at date, and optionally a From date — leave From blank for the customer's whole account. The four figures then foot exactly:

Opening Balance + Invoiced − Paid = Balance Due

  • Opening Balance — what was owed the day before the period began. Zero when there is no From date.
  • Invoiced — billed inside the period.
  • Paid — collected inside the period. Money that arrived after the As at date has not arrived yet, which is what lets you reproduce a month-end statement later and get the same answer.
  • Balance Due — owed at the end of the period, and the sum of the balances in the invoice list beneath it.

Below the invoices, the balance is aged into the same buckets as the Invoice Aging report — current, 1–30, 31–60, 61–90, 90+ — as at the statement date. That is the row a chase call is made from.

Three buttons in the header take the statement out of the app:

  • Email Statement — sends it to the customer, branded as your business, with the PDF attached. The covering note quotes the same balance the attachment shows. Disabled, with the reason, if the customer has no email address or you do not have permission to send documents.
  • Download PDF — the same document as a file, saved to your computer.
  • Print — opens the statement in a new tab with your browser's print dialogue over it, so it goes to the printer without a trip through your Downloads folder. If the dialogue does not appear — some browsers will not open it for you — the Print button on that tab opens it, and so does Ctrl+P (Cmd+P on a Mac). Download PDF on the same tab saves the file.

Save Filter and Load Filter keep a period you use often, the same way the reports do.

Open sales orders are still listed, under Open orders — not yet invoiced, below the figures. They are neither owed nor invoiced, so they are kept clear of the totals and are not on the statement the customer receives.

Contacts #

Each customer can have any number of contacts — the actual people you deal with. Contacts are managed on the Contacts tab of the customer page (or via the API at /api/v1/customer-contacts).

A contact record holds:

  • Name — required.
  • Title — job title or role.
  • Email and Phone.
  • Notes — free-text; not customer-visible.

Contacts can be the Checked Out To party for an inventory unit checkout, so you can track exactly which person at a company has a piece of equipment. The Checkouts action on each contact row in the table opens a modal listing every unit that person has or had checked out.

Deleting a contact soft-deletes the record; its checkout history is retained and stays associated with the customer for reporting.

How customers connect to other modules #

The customer record is intentionally lightweight — it stores contact information and billing defaults, then everything else links to it:

  • Invoices & Payments — each invoice belongs to a customer and inherits its billing address and payment terms.
  • Sales Orders — orders are created for a customer and can be filtered to open orders on the Statement page.
  • Quotes — each quote is tied to a customer and optionally a specific contact.
  • Opportunities — each opportunity belongs to a customer and a pipeline stage.
  • Loan Agreements — free equipment loans record the customer they were issued to.
  • Rental Agreements — paid rentals link to a customer for billing.
  • Appointments — scheduled appointments are booked against a customer record.

Doing it from the API #

# List customers (paginated at 50, supports ?search= filter)
curl "https://your-domain.com/api/v1/customers" \
  -H "Authorization: Bearer $TOKEN"

# Create a company customer
curl -X POST "https://your-domain.com/api/v1/customers" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"company_name": "Acme Corp", "email": "billing@acme.example", "payment_terms": "net_30"}'

# Create an individual
curl -X POST "https://your-domain.com/api/v1/customers" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"first_name": "Dana", "last_name": "Whitfield"}'

# Create an individual with a middle name (middle_name is always optional)
curl -X POST "https://your-domain.com/api/v1/customers" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"first_name": "Dana", "middle_name": "Ruth", "last_name": "Whitfield"}'

# Create a customer with a custom field, keyed by the field's key
curl -X POST "https://your-domain.com/api/v1/customers" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"company_name": "Acme Corp", "custom_fields": {"po_number": "PO-1"}}'

# List contacts for a specific customer
curl "https://your-domain.com/api/v1/customer-contacts?customer_id={customer_id}" \
  -H "Authorization: Bearer $TOKEN"

# Add a contact
curl -X POST "https://your-domain.com/api/v1/customer-contacts" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"customer_id": "{customer_id}", "name": "Jane Smith", "title": "Accounts Payable", "email": "jane@acme.example"}'

At least one of company_name, first_name or name is required on create. name is the read-mostly display name: it comes back on every response and is the company name when there is one, otherwise the person's first and last name. middle_name is optional on every request and is not folded into name. Sending name alone still works and is what older integrations do. On an update, name alone does not change the first or last name. To rename a person, send first_name and last_name. A customer with a company name keeps the company as its display name. The customer_id field in contact requests takes the customer's id. The payment_terms field accepts due_on_receipt, net_15, net_30, net_60, or net_90. custom_fields holds the customer's custom field values, keyed by each field's key, on every response that returns a customer and on create and update. A field set as required to save must be filled when you create a customer, and in any update that sends custom_fields. An update that sends custom_fields replaces all of them, so include the ones to keep; an update that leaves it out keeps them as they are. The customer.* webhooks do not include custom field values. DELETE on a customer or contact is a soft delete — all associated transactions are retained.