---
title: How the Helpdesk Works
description: The RackHelm support desk collects every customer conversation into one queue, whether it arrived from the client portal, from an email address you poll, or from the public contact form. This article explains where tickets come from, what the statuses…
url: "https://rackhelm.com/documentation/how-the-helpdesk-works/"
updated: "2026-09-24"
category: Support Desk
---

# How the Helpdesk Works

The RackHelm support desk collects every customer conversation into one queue, whether it arrived from the client portal, from an email address you poll, or from the public contact form. This article explains where tickets come from, what the statuses and priorities mean, and who can see what — read it before configuring departments or email routing.

## Before you start

> **Note:** Staff need the `view_tickets` permission to open **Support → All Tickets**. Replying needs `reply_tickets`; changing status, priority, department or assignee needs `assign_tickets`; closing needs `close_tickets`; deleting needs `delete_tickets`. The built-in **Support Agent** role is seeded with all of these except `delete_tickets`. See [Roles & Permissions](/docs/roles-and-permissions/).

![The All Tickets screen showing the ticket table with status, priority, department and assignee columns](/wp-content/uploads/rackhelm-docs/support-tickets-index-table.png)
Every ticket, whatever its source, lands in the same queue at **Support → All Tickets**.

## Where tickets come from

There are three ways a ticket is created, and they all produce the same kind of record.

1. **The client portal.** A signed-in customer opens **Support → Open Ticket** at `/tickets/create`, chooses a department and a priority, and writes the first message. The ticket opens immediately with status **Open**.
2. **Inbound email.** A scheduled job polls each mailbox you configure under **Support → Email Routing** and converts messages into tickets. A message whose subject contains an existing ticket reference is appended to that thread instead of starting a new one. See [Email routing and IMAP piping](/docs/email-routing-imap-piping/).
3. **The public contact form.** A visitor with no account submits `/contact`. Nothing is created until they click a signed link emailed to that address. See [Guest tickets and the contact form](/docs/guest-tickets-contact-form/).

## Ticket numbers

Every ticket gets a sequential number. The first ticket takes the value of the **Start number** setting; each later ticket takes the highest existing number plus one, counting tickets in the trash so a number is never reused.

What staff and customers see is the **ticket prefix** plus that number — for example `ORB-1042`. A fresh install seeds the prefix as `EXP-` and the start number as `1000`; change both in [Ticket settings](/docs/ticket-settings/) before you take your first ticket. Ticket URLs use the bare number, so `ORB-1042` lives at `/admin/tickets/1042`.

> **Warning:** The prefix is also how inbound email is threaded back onto an existing ticket — the importer looks for `#` followed by the prefix and the number in the subject line. Changing the prefix after tickets exist breaks threading for replies to older notification emails, because those carry the old reference.

## Statuses

A ticket holds exactly one of five statuses you can set, plus one internal state you never set by hand.

| Status | What it means |
| --- | --- |
| **Open** | The default for a new ticket. It needs attention from your team. |
| **Pending** | A free-form holding state. Nothing in RackHelm acts on it automatically — use it for whatever your team agrees it means. |
| **Awaiting reply** | You have answered and the ball is in the customer's court. This is the default status after a staff reply, and it is the only status the auto-close job looks at. |
| **On hold** | Parked — waiting on a third party, a supplier, or a scheduled window. Not auto-closed. |
| **Closed** | Finished. The customer is emailed a closure notice. Closed tickets are hidden from the queue unless you tick **Include closed**. |
| **Pending verification** | Internal, and legacy. Tickets in this state are filtered out of the staff queue, the board and the customer's ticket list. The current guest flow parks the whole submission rather than creating a ticket, so nothing writes this status any more — you will only see it on installs upgraded from an older build. |

### What "awaiting reply" actually triggers

The distinction matters because the **Auto Close Tickets** scheduled job only considers tickets whose status is **Awaiting reply** *and* whose most recent message was written by a staff member. With its built-in defaults it closes such a ticket after 7 days of inactivity, appends the message "This ticket has been automatically closed due to inactivity." to the thread, logs an `autoclosed` entry, and emails the customer. Anything sitting in **Open**, **Pending** or **On hold** is left alone forever.

> **Note:** The job is seeded disabled. Enable it under **Schedules → Auto Close Tickets** in the admin sidebar — `/admin/system-schedules`, which requires `manage_schedules` — if you want inactive threads tidied up. Its inactivity window and closure message are read from the schedule's stored options and are not editable from the schedule form, so it runs on the built-in defaults unless those options are set directly.

## Priorities

Priority is **Low**, **Medium** or **High**, and a new ticket defaults to **Medium**. Customers choose their own priority when opening a ticket from the portal; tickets created from inbound email take the priority set on the email route. Priority is presentational — it colours the badge and you can sort and bulk-edit on it, but nothing in RackHelm escalates or routes on it automatically.

## Who can see which tickets

Ticket visibility is scoped by department, not by permission alone. A staff member sees a ticket when **either**:

- the ticket's department is one they belong to (directly, or through a role assigned to that department), or
- the ticket is assigned to them personally.

This scoping applies to the list, the board, the individual ticket, bulk actions and the trash. A staff account in no department at all sees only tickets assigned directly to it.

> **Warning:** The only account that bypasses department scoping is **Super Admin**. The bypass is keyed on `tickets.view_all_departments`, which is not one of the permissions you can grant from the Roles screen, so no custom role can hold it. If a manager needs to see everything, put them in every department.

## The activity log

RackHelm writes an entry to the ticket's log whenever it is created, its status, priority, department or assignee changes, it is deleted or restored, a staff note is added, edited or deleted, a reply is posted, an attachment is dropped, or the auto-close job acts on it. The log is a permanent audit trail for the thread and is not editable.

## Reporting

Two ticket reports ship with RackHelm: **Ticket Analytics** (volume by department and by agent, plus per-agent performance over a timeframe) and **Ticket Review**. They are gated by `view_report_ticket_analytics` and `view_report_ticket_review`, both of which the Support Agent role holds by default.

## Troubleshooting

| Symptom | Cause and fix |
| --- | --- |
| An agent says the queue is empty, but tickets exist | They are not a member of any department and nothing is assigned to them. Add them under **Support → Departments → Edit**, or assign a role to the department. |
| Opening a ticket by URL returns "This ticket belongs to another department." | Expected. Ticket URLs use a sequential number, so this message is the department boundary doing its job. |
| Tickets appear with the subject `[UNVERIFIED SENDER] …` | Inbound mail that your mail server did not vouch for. See [Email routing and IMAP piping](/docs/email-routing-imap-piping/). |
| Ticket numbers jump | Numbering counts deleted tickets, so a gap means a ticket was moved to the trash. |
| No tickets are ever auto-closed | Either the **Auto Close Tickets** schedule is disabled, or the threads are not in **Awaiting reply** with a staff message last. |
