The Next Ticket Queue is pull-based ticket assignment. Instead of Horizon pushing a ticket at a technician the moment it arrives, tickets sit in a queue and technicians claim the next one when they actually have capacity to work it.
It exists for high-volume work where proactive assignment does more harm than good. Alert tickets are the usual example: assigning two hundred of them to a three-person team means nobody works any of them. A queue lets the team pull work at the rate they can absorb it.
The queue shows up in three places, depending on who you are.
| Who | Where | What you get |
|---|---|---|
| Admin | Admin Panel → Components → Assignment → Queues | Create and configure queues: type, claiming teams, claim order, eject behaviour, and the queue's waiting tickets |
| Dispatcher | Dispatch Panel → Queue Board | Every active queue with its depth, longest wait, and whether anyone can claim from it. Drill into a queue to hand off or eject individual tickets |
| Technician | Agent Panel → My Dashboard | The queues you are eligible to claim from, each with its current depth and a Claim button |
A few related settings live elsewhere:
If a technician sees "No queues available" on their dashboard, that is the claiming-team rules doing their job, not an error. Check the queue's Claiming Teams and the eligibility conditions covered below.
Every queue is one type or the other, decided at creation. The difference is where its contents come from.
| Push queue | Filter queue | |
|---|---|---|
| Contents are | Tickets that were explicitly put into the queue and are still waiting | The tickets that match a saved ticket filter right now, resolved live every time the queue is read |
| Tickets arrive by | An assignment policy using the Next Ticket Queue method, a routing rule targeting the queue, a dispatcher adding one by hand, or the CLI | Nothing puts them there. A ticket is in the queue because it matches the filter |
| Tickets leave when | Claimed, ejected, or the ticket closes | They stop matching the filter, or the ticket closes |
| Claim order | Arrival order (FIFO) or a ticket date field | A ticket date field only. FIFO is rejected when you save |
| Depth | Exact | Approximate, briefly cached |
FIFO is unavailable on a filter queue because arrival order means the moment a ticket was put into the queue, and a filter-matched ticket was never put anywhere. It started matching. There is no honest arrival time to sort by, so Horizon refuses the configuration rather than inventing one.
A filter queue's membership is whatever matches the filter, minus closed tickets, and nothing else. In particular:
Two technicians going for the same ticket is handled at claim time by locking, not by hiding tickets from the list.
A user may claim from a queue if either of the following is true:
The second half means you usually do not have to list a team twice. If an assignment policy sends a team's tickets into a queue, that team can claim from it without being added explicitly. The field's helper text says so on screen: "Teams already routed here by an assignment policy keep their access without being listed."
Either way, the user still has to pass every one of these:
Routing rules contribute nothing here. A routing rule has no team attached to it, so a queue fed only by routing rules needs its Claiming Teams set explicitly or nobody will be able to claim from it.
An empty membership means nobody, never everybody. A queue with no claiming teams and no policy pointing at it will fill up and hand nothing out. The Queue Board flags this rather than letting you find out from the backlog.
Two strategies are available, set on the queue under Selection Strategy.
| Strategy | Behaviour | Available on |
|---|---|---|
| FIFO | Oldest waiting ticket first, by the time it entered the queue | Push queues only |
| Date Field | Ordered by a date/time field on the ticket, in the direction you choose | Both types |
Date Field ordering is what you want for anything deadline-driven. Pick the field under Order By Field (it lists the raw helpdesk field names) and the direction under Order Direction, where ascending hands out the earliest date first.
Values are read live from the ticket every time someone claims, so a due date changed in the helpdesk five seconds ago affects the very next claim. Tickets with no value in that field sort last in both directions rather than being dropped from the queue.
Two configuration mistakes will stop a Date Field queue dead, both reported on the Queue Board:
There is a third case worth knowing if you run more than one helpdesk integration: date field names are provider-specific, so a field key that resolves on one provider may have no counterpart on the other. Horizon refuses to order the queue at all in that case, rather than silently sorting one provider's tickets to the bottom.
A claim is not a single database read. In order:
Two details that matter operationally:
Every queue has a claim mode, which decides what happens between a technician pressing Claim and the ticket becoming theirs.
Where to find it: Admin Panel → Components → Assignment → Queues → open a queue → Queue tab → Claim Mode
| Mode | Behaviour |
|---|---|
| Blind - assign immediately | The claim runs at once. The technician finds out which ticket they took from the success notification. This is the default, and the behaviour of every queue before offer mode existed. |
| Offer - show the ticket first | The queue resolves the ticket the technician would be handed and shows it to them. They accept it or decline it with a reason. Nothing is assigned until they accept. |
Claim mode is set per queue, not per account — a front-line queue can stay blind and fast while a specialist queue asks the technician to look first. Unlike queue type, it can be changed at any time and strands nothing.
Pressing Claim opens the offer, showing the ticket title, number, priority, and how long it has been waiting, followed by company, contact, due date, type, subtype and status. The ticket number carries two actions: copy it, or open the ticket in the helpdesk.
The offer is not a reservation. The ticket stays claimable by everyone else while the modal is open. Two outcomes:
Closing the modal with X records nothing and leaves the ticket untouched.
The queue's depth badge stays global rather than per-technician, so a technician who has declined everyts real depth and finds out on the press — notified as Nothing left for you here, never as an empty queue. This is deliberate: a queue with work in it should not look empty to anyone.
Where to find it: Dispatch Panel → Queue Board → open a queue
| Surface | What it shows |
|---|---|
| Declined column | How many technicians have declined that ticket. A dash means none. |
| View declines row action | Who declined, when, and the reason each of them gave. |
| Clear declines | Removes every decline on that ticket, putting it back in front of the technicians who passed on it. |
Clear declines is the intervention lever for a ticket everybody has refused — usually a sign the ticket needs rewriting, reassigning, or escalating rather than re-offering unchanged. Read the reasons before clearing them.
The queue's item table in the Admin Panel shows the same Declined count, but not the reasons behind it. The reasons live on the Queue Board only — open the ticket's View declines there to read them. The Queue Board is available to everyone, not just dispatchers.
| Reason | When |
|---|---|
| Claimed | A technician claimed it, or a dispatcher handed it off |
| Ticket closed | The ticket closed in the helpdesk. Applies to every queue |
| Assigned externally | Someone assigned the ticket directly in the helpdesk. Push queues only, and only if the queue has Eject when assigned in the helpdesk enabled |
| Escalated | The ticket was queued into a different queue |
| Routed elsewhere | A routing rule moved it to a different queue target |
| Removed manually | An admin or dispatcher ejected it by hand. Push queues only |
| Stopped matching | Filter queues only. The ticket no longer matches the saved filter |
Off by default. Turn it on when a queue should release a ticket the moment a human assigns it directly in ConnectWise, Autotask, or Halo, on the grounds that someone has clearly taken ownership outside Horizon.
Horizon distinguishes those assignments from its own. A ticket assigned by a queue claim or by a routing rule stays put; only an assignee Horizon did not ask for triggers the eject. The setting is unavailable on a filter queue, because membership there is the filter and a ticket leaves by no longer matching it.
Dispatch Panel → Queue Board
The Queue Board is the dispatcher's view of every active queue. It answers two questions the admin screens do not: which queue is backing up, and whether anyone can actually claim from it.
| Column | What it shows |
|---|---|
| Queue Name | The queue |
| Type | Push or Filter |
| Pending | Waiting tickets on a push queue, live match count on a filter queue |
| Claimed Today | Claims within your day |
| Strategy | The claim order, including the field and direction on a Date Field queue |
| Longest Wait | The oldest waiting ticket's age on a push queue, flagged once it crosses your staleness threshold. Reads n/a on a filter queue |
| Status | Whether any agent can claim from this queue, and if not, why |
The Status column is the important one. A queue can be configured into a state where the pending count climbs steadily and every single claim fails. Without the column that renders as a healthy queue with a big number, which is the exact opposite of the truth. It flags an incomplete or unresolvable date field, a filter that cannot be loaded, an ordering that is invalid for the queue type, an unsupported multi-integration setup, and the case where the queue's membership resolves to nobody at all.
Two display conventions worth knowing:
Drilling into a queue gives you its contents and two levers:
A hand-off is recorded as a claim, not as an eject, so the ticket still counts as queue throughput in your volume and wait-time reporting. It is recorded against the technician who received the ticket, with the dispatcher who performed it noted separately.
Four queue moments can trigger a helpdesk action automatically:
Configure them per queue on the queue's Post-Commit Actions tab, or account-wide under Admin Panel → Components → Assignment → Defaults in the Ticket Queue Outcome Actions section. Each picker offers your active ticket-scoped Helpdesk Action presets.
An empty dropdown means "inherit account default", not "do nothing". Clearing a field on a queue is a real operation: it hands that moment back to the account-wide default. There is no per-queue way to say "fire nothing even though the account has a default". If you need that, remove the default and configure the other queues explicitly.
Nothing is copied onto a queue when you create it. Inheritance is resolved every time an event fires, so an unconfigured queue keeps tracking the account default as that default changes.
One exception to be aware of: an eject caused by the ticket closing runs no action. Your helpdesk will either reject a write to a closed ticket or reopen it, and neither is what you wanted.
Post-commit actions matter more than usual on a filter queue. A claimed ticket keeps matching its filter until something changes it, so the action that mutates the ticket (a status change, a note, a field write) is normally what removes it from the queue.
These are deliberate, not defects: