What Is the CRM?
The CRM (Customer Relationship Management) module is the central record for every person and company your organisation works with. It ties together contacts, companies, deals, tickets, assets, projects, and call history into a single unified view.
Key Concepts
Contacts
A contact is an individual person — an employee at a customer company, a vendor representative, a contractor, etc. Contacts have:
- Name, email, phone, job title.
- A kind (Customer, Contractor, Vendor, Partner, Other).
- A status (e.g. Prospect, Active, Churned — free text, configurable).
- An optional link to a Customer (company).
- Notes, linked deals, activities, and a full ticket history.
Customers
A customer (also called a company or portal customer) represents a business entity you support or sell to. Customers have:
- Company name, primary domain, logo.
- A list of associated Contacts who work there.
- Linked Support Contracts, Assets, RMM Devices, Tickets, and Projects.
- SLA Policy overrides (premium support).
- Billing Settings for automated monthly bills.
Deals
A deal tracks a sales opportunity. Each deal has:
- A stage (Lead, Qualified, Proposal, Negotiation, Won, Lost).
- A monetary value and expected close date.
- A linked contact and owner.
- Notes and activities.
Activities
Activities are records of interactions: calls, emails, meetings, tasks. They link to contacts or deals and appear in the activity feed. Activities can have a due date and completed date.
Navigation
From the left sidebar, click the CRM icon to open the module. The default view is the Contacts list. Switch between Contacts, Customers, and Deals using the tabs at the top of the page.
Search & Filtering
The search bar in the CRM searches across contact names, emails, company names, and deal titles. Use the filter chips to narrow by kind, status, or owner.
API Access (for external integrations)
CRM records are first-class API objects — useful for syncing the contact list into a marketing tool, pushing deal updates from a sales platform, or building a custom contact directory.
All endpoints require an authenticated session (Bearer JWT in authorization). CRM data is tenant-scoped — you only see contacts and customers for organisations you are a member of.
Log in
curl -s -X POST https://portal.kwgroup.org.uk/api/auth/login \
-H 'content-type: application/json' \
-d '{"email":"you@example.com","password":"...","mfaCode":"123456"}' \
> /tmp/login.json
TOKEN=$(jq -r .accessToken /tmp/login.json)
The accessToken is valid for 15 minutes; refresh via /api/auth/refresh or the refreshToken cookie.
List contacts
# All contacts in the org.
curl -s -H "authorization: Bearer $TOKEN" \
https://portal.kwgroup.org.uk/api/crm/contacts
# Filtered — customer-kind contacts, active status only.
curl -s -H "authorization: Bearer $TOKEN" \
"https://portal.kwgroup.org.uk/api/crm/contacts?kind=CUSTOMER&status=Active"
# Search by name or email.
curl -s -H "authorization: Bearer $TOKEN" \
"https://portal.kwgroup.org.uk/api/crm/contacts?q=jane.doe@acme.com"
Get a single contact
curl -s -H "authorization: Bearer $TOKEN" \
https://portal.kwgroup.org.uk/api/crm/contacts/<id>
Returns the contact, their linked customer, all open deals, recent activity (calls, emails, meetings, tasks), notes, and ticket history.
Create a contact
curl -s -X POST -H "authorization: Bearer $TOKEN" \
-H 'content-type: application/json' \
-d '{
"firstName": "Jane",
"lastName": "Doe",
"email": "jane.doe@acmecorp.com",
"phone": "+44 20 7946 0000",
"jobTitle": "IT Manager",
"kind": "CUSTOMER",
"status": "Active",
"customerId": "<customerId>"
}' \
https://portal.kwgroup.org.uk/api/crm/contacts
If customerId is omitted, you can pass a customerName instead and the API will create the customer record on the fly. To opt the contact out of marketing emails, set "marketingOptOut": true in the payload.
Update a contact
curl -s -X PATCH -H "authorization: Bearer $TOKEN" \
-H 'content-type: application/json' \
-d '{"jobTitle": "Head of IT", "status": "Active"}' \
https://portal.kwgroup.org.uk/api/crm/contacts/<id>
List customers (companies)
curl -s -H "authorization: Bearer $TOKEN" \
https://portal.kwgroup.org.uk/api/crm/customers
Returns each customer's name, primary domain, logo, open ticket count, contract status, and a one-line billing summary. The endpoint supports the same q, kind, and pagination params as contacts.
Export contacts as CSV
Append &format=csv to the list URL:
curl -s -H "authorization: Bearer $TOKEN" \
"https://portal.kwgroup.org.uk/api/crm/contacts?format=csv" \
-o contacts-2026-06-04.csv
The CRM API is read + write. Writes (POST, PATCH, DELETE) require
ADMINorMANAGERrole.AGENTcan read all contacts and update the ones they own, but cannot delete.