KW Knowledge base

CRM Overview

Introduction to the CRM module: contacts, customers, deals, and how they connect to tickets and projects.

Mitch Wigham
Updated 24 June 2026 · 7 views

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 ADMIN or MANAGER role. AGENT can read all contacts and update the ones they own, but cannot delete.

Still need help?

Log a support ticket and the team will pick it up from this page.