What Is a Ticket?
A ticket represents a unit of work — a support request, an incident report, a change request, or a project task. Every ticket has a unique reference (e.g. INC-3F2A1C), a status, a priority, and optionally an assigned agent.
Creating a New Ticket
From the Helpdesk Module
- Click Helpdesk in the left navigation.
- Click the + New Ticket button (top-right).
- Fill in the form:
- Title — a concise description of the issue.
- Description — full detail, steps to reproduce, screenshots.
- Type — choose Incident, Service Request, Change, Project, or a custom type your admin has configured.
- Priority — Low, Medium, High, or Urgent.
- Customer — the company the ticket is for.
- Contact — the individual person raising the request (links to CRM).
- Assignee — the agent responsible. Leave blank to put it in the unassigned queue.
- Contract — optionally link to a support contract for automatic time tracking.
- Click Create Ticket.
Via Email Intake
If your admin has configured IMAP email intake, tickets are created automatically when an email arrives at the support inbox. The from-address is matched to existing contacts; a new contact is created if no match is found. The email body becomes the ticket description.
Ticket Reference Numbers
Each ticket gets a unique ID based on its type prefix:
INC-XXXXXX— IncidentCHG-XXXXXX— ChangePRJ-XXXXXX— ProjectREQ-XXXXXX— Service RequestTSK-XXXXXX— Task
The 6-character suffix is derived from the ticket's UUID. Both the prefix+suffix and the full UUID can be used to look up a ticket.
Editing a Ticket
Open the ticket by clicking its title in any list view. The detail page shows all fields in the right-hand panel. Click any editable field to change it inline — changes are saved automatically.
Key editable fields on the detail page:
- Status — the workflow state (e.g. Open, In Progress, Awaiting Customer, Resolved, Closed).
- Priority — Low / Medium / High / Urgent.
- Assignee — reassign to another agent.
- Type — change the ticket type (status options update accordingly).
- Tags — free-form labels for filtering.
- Linked Assets — pin specific devices or assets from the RMM to this ticket.
- Linked Project — associate the ticket with a project.
- SLA deadlines — shown as countdown timers; governed by SLA policy.
Merging Tickets
If two tickets cover the same issue, open the lower-priority one and click Actions → Merge into…. Select the surviving ticket. The merged ticket is closed and a link is shown to the surviving thread.
Deleting vs Closing Tickets
Tickets are never hard-deleted. To end a ticket's lifecycle, set its status to Closed (or use the Resolve button which sets it to Resolved first). Closed tickets remain searchable and auditable.
API Access (for external integrations)
Tickets are first-class API objects, so you can create, update, query, and close them from external systems — a status page integration that opens a ticket per incident, a monitoring alert bridge, a chat-bot that creates tickets from Slack, etc.
All endpoints require an authenticated session (Bearer JWT in authorization). Ticket operations are tenant-scoped — the API only sees tickets in organisations the authenticated user is a member of.
Log in (one-time)
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"}' \
-c /tmp/cookies.txt > /tmp/login.json
TOKEN=$(jq -r .accessToken /tmp/login.json)
The accessToken is valid for 15 minutes; refresh with the refreshToken cookie or call /api/auth/refresh.
List tickets
# All open tickets assigned to me.
curl -s -H "authorization: Bearer $TOKEN" \
"https://portal.kwgroup.org.uk/api/helpdesk/tickets?filter=mine&status=OPEN"
# All tickets for a specific customer, newest first.
curl -s -H "authorization: Bearer $TOKEN" \
"https://portal.kwgroup.org.uk/api/helpdesk/tickets?customerId=<id>&sort=-createdAt"
# Search by keyword (matches title + description).
curl -s -H "authorization: Bearer $TOKEN" \
"https://portal.kwgroup.org.uk/api/helpdesk/tickets?q=outage"
Create a ticket
curl -s -X POST -H "authorization: Bearer $TOKEN" \
-H 'content-type: application/json' \
-d '{
"title": "Email server down",
"description": "Inbound SMTP rejected since 09:00 UTC.",
"typeId": "<ticketTypeId>",
"priority": "HIGH",
"customerId": "<customerId>",
"contactId": "<contactId>"
}' \
https://portal.kwgroup.org.uk/api/helpdesk/tickets
The response includes the new ticket's reference (e.g. INC-3F2A1C) and full URL. The same payload also accepts assigneeId, contractId, tags (array), and customFields (record).
Update a ticket
curl -s -X PATCH -H "authorization: Bearer $TOKEN" \
-H 'content-type: application/json' \
-d '{"status": "IN_PROGRESS", "assigneeId": "<userId>"}' \
https://portal.kwgroup.org.uk/api/helpdesk/tickets/<id>
The write is atomic — the API re-asserts the tenant scope on the update (not just on the read) so you cannot accidentally mutate another tenant's ticket.
Add a comment
curl -s -X POST -H "authorization: Bearer $TOKEN" \
-H 'content-type: application/json' \
-d '{"body": "Restarted SMTP service, monitoring for recurrence.", "internal": false}' \
https://portal.kwgroup.org.uk/api/helpdesk/tickets/<id>/comments
Set "internal": true to add a private note (only visible to agents, not the customer).
Log time on a ticket
curl -s -X POST -H "authorization: Bearer $TOKEN" \
-H 'content-type: application/json' \
-d '{"minutes": 45, "date": "2026-06-04", "description": "Diagnosed SMTP issue", "billable": true}' \
https://portal.kwgroup.org.uk/api/helpdesk/tickets/<id>/time
Resolve / close a ticket
# Resolve (sets status to Resolved, marks SLA as met if applicable).
curl -s -X POST -H "authorization: Bearer $TOKEN" \
-H 'content-type: application/json' \
-d '{"resolution": "Root cause was a misconfigured SPF record; fixed and verified."}' \
https://portal.kwgroup.org.uk/api/helpdesk/tickets/<id>/resolve
# Close (terminal — sets status to Closed).
curl -s -X POST -H "authorization: Bearer $TOKEN" \
https://portal.kwgroup.org.uk/api/helpdesk/tickets/<id>/close
The portal middleware also exposes a public ticket-creation endpoint at
https://support.kwgroup.uk/support(no auth needed) for customer-facing intake forms.