KW Knowledge base

Creating & Managing Tickets

Step-by-step guide to creating tickets, filling in fields, managing priorities, and understanding ticket references.

Mitch Wigham
Updated 24 June 2026 · 5 views

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

  1. Click Helpdesk in the left navigation.
  2. Click the + New Ticket button (top-right).
  3. 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.
  4. 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 — Incident
  • CHG-XXXXXX — Change
  • PRJ-XXXXXX — Project
  • REQ-XXXXXX — Service Request
  • TSK-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.

Still need help?

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