-
-
Notifications
You must be signed in to change notification settings - Fork 27
Team Assignment and Escalation
Planned / in active development. Nothing on this page has shipped yet. Started after discussion #125. Last updated: 2026-09-10.
Legend: β done Β Β·Β π§ in progress / next Β Β·Β β¬ not started Β Β·Β π€ not decided
Discussion #125, raised by Kraleemil, in two parts.
The first asked for structural 1st line / 2nd line escalation β a dedicated Escalate button that changes the ticket's state rather than just its assignee, SLA timers that shift once it crosses the threshold, technical fields that become mandatory, and a De-escalate that bounces it back to the service desk.
The follow-up asked for something narrower and, on reflection, more useful:
I thought about maybe having the possibility to assign a task to a team, it could be when escalating a ticket. Eg. the helpdesk team doesn't know who in infrastructure does x and y. And then infrastructure can dispatch the ticket from the team queue to a person.
That second one turned out to be the real gap, and it makes most of the first one fall out for free.
Worth stating plainly, because it explains the shape of the work.
- A ticket can be assigned to a person, and to a department. It cannot be assigned to a team β there is no team column on
ticketsat all. -
Teams already exist and already do two jobs: they group analysts, and
department_teamscontrols which departments a team can see. - There is no tier, line or escalation concept anywhere in the schema. The only thing called "escalation" is SLA breach notification.
- Teams are opt-in. A fresh install has none.
So today, escalating means changing who a ticket is assigned to β which is exactly what the discussion says is too thin.
One new nullable column on tickets, pointing at the teams you already have.
Team and analyst are both optional, and independent. All four combinations mean something:
| Team | Analyst | Means |
|---|---|---|
| β | β | Nobody has touched it |
| β | Dave | Dave picked it up directly |
| Infrastructure | β | Escalated, sitting in their queue |
| Infrastructure | Dave | Infrastructure owns it, Dave is doing it |
The rules that keep the two honest:
- Assigning a person never sets or clears the team, and vice versa. No side-effect writes.
- Clearing the person leaves the team behind, so a ticket falls back into the queue rather than into the void when somebody goes on holiday.
- Team assignment is routing, not permission. It does not change who can see a ticket β that stays with the existing department/team visibility. Escalating a ticket must never hide it from someone who could see it a moment ago.
Four ways to set it, all going through the same code so the audit row, the notification and any workflow rule behave identically whichever you use:
- The reading pane β a Team field beside the analyst.
- The right-click menu β a Team submenu beside Assign to, so you can escalate straight from the list without opening the ticket. It carries a None entry to take a ticket back out of a queue, and only appears if your install actually has teams.
- In bulk β select a morning's worth and hand them over in one go. Bell notifications are suppressed for a bulk change, so a team does not get fifty rows in its bell.
- From a workflow β the Create a ticket action can name a team, so a rule can raise a follow-up straight into Infrastructure's queue rather than onto one named person who may be on leave.
Every member of the team gets it on the bell panel.
Three useful behaviours come from the existing notification rules rather than anything new:
- You are never told about your own escalation, even if you are in the receiving team.
- A ticket bouncing between teams produces one entry that updates, not one per hop.
- A bulk reassignment does not spam everybody β bulk changes are suppressed and counted.
It appears in Preferences β Notifications like every other type, so anyone can turn it off.
The folder panel already switches between Department and Analyst. Team becomes a third option, remembered per person like the other two.
"Unassigned" needs no new meaning: it already changes with the grouping β no department in one view, nobody working it in the other. In team view it means no team yet.
A button that hands the ticket to another team, optionally takes the current person off it, records the move in the ticket's history and notifies the receiving team. De-escalate is the same in reverse.
Deliberately not a new state machine β see below.
A fresh install has no teams, so that is the default rather than an edge case. With no teams defined, none of this appears: no team picker on a ticket, no third folder option. Nothing to switch off, nothing new to learn, nothing changes.
The same rule the company switcher already follows β it renders nothing at all until a second company exists.
Asked for in the original post, and the most expensive part.
SLA targets currently hang off priority and nothing else β response minutes, resolution minutes and a working-hours calendar, all on the priority record. Making them vary by team or tier means adding a second dimension to the SLA engine, which affects breach calculation, the warning notifications and the reporting built on top.
That deserves its own design rather than riding along at the end of this one. It is a real request and it is not being dismissed β it is being separated.
Also from the original post. It depends on a per-team or per-tier field policy that does not exist yet, and it is worth seeing how teams get used in practice first.
The original post describes 1st line and 2nd line as a state the ticket is in, distinct from who has it.
The current thinking is that a separate tier axis would be a fourth thing overlapping department, team and status β and that in practice most service desks express the tier as the team. Service Desk and Escalation Team, or Service Desk and Infrastructure, already carry that meaning. Escalating is handing it to the next team along.
This is also what most ITSM tools do: assignment groups, with movement between them called escalation.
If that turns out to be too thin once teams are in use, a tier is easy to add on top. Adding it first, and finding teams already said the same thing, would be much harder to undo.
Also raised in the follow-up: "a default recipient/team of tasks, like when x form is filled out then set recipient/team to y based on z."
Forms already carry their own What happens next actions, so adding "assign to team Y" becomes a small addition once a ticket can belong to a team. Sequenced after, not dropped.
The follow-up says "assign a task to a team". This work covers tickets first. Tasks have their own assignee and their own Involved list, and deserve the same treatment β but doing tickets first keeps the first version small enough to get right.
- Discussion #125 β the original request
- Tickets Β· Multi-Tenancy β Staff cross-company access
- Release notes β where this will appear once it ships
FreeITSM β an open-source IT Service Management platform Β· github.com/edmozley/freeitsm Β· MIT licence
- Installation
- β° Scheduled tasks (cron jobs)
- Architecture
- π§ͺ Developer tests
- AI Providers
- Internationalisation (i18n)
- Timezones & Time Handling
- π Date & Time Formats
- Theming & Dark Mode
- ποΈ Recent β getting back to what you were doing
- β¨οΈ Command palette (βK)
- π Searching inside tickets
- π Attached documents
-
MobileβFriendly
- β³ π« Mobile: Tickets
- β³ π» Mobile: Assets
- β³ π Mobile: Calendar
- β³ π Mobile: Knowledge
- β³ π¦ Mobile: Service Status
- β³ πΌ Mobile: Watchtower
- β³ π§© Mobile: Problem Management
- β³ π Mobile: Change Management
- β³ πΏ Mobile: Software
- β³ β Mobile: Tasks
- β³ π Mobile: Forms
- β³ π Mobile: Contracts
- β³ π Mobile: Domains
- β³ π Mobile: People
- β³ π Mobile: LMS
- β³ πΊοΈ Mobile: CMDB
- β³ πΊοΈ Mobile: Network Mapper
- β³ π§ Mobile: Process Mapper
- β³ βοΈ Mobile: Workflow
- β³ π₯οΈ Mobile: System
- β³ π Mobile: Reporting
- β³ π Mobile: System Wiki
- β³ π Mobile: Self-Service Portal
- β³ π§° Mobile: Techniques & Tricks
-
Security
- Layer 1 β which modules you can enter
- β³ π§© Module Access Control
- β³ π οΈ Module Access β Developer Guide
- Layer 2 β what you can administer
- β³ π Roles & Permissions
- β³ π οΈ Roles β Developer Guide
- β³ π€ Why capabilities are constants
- Layer 3 β the System module
- β³ π Admin Access Control
- Hardening
- β³ π Security review response 2026-08
- β³ π‘οΈ Security hardening 2026-08
- β³ π οΈ Security hardening 2026-08 β Developer Guide
- β³ π‘οΈ Round three β plain English
- β³ π οΈ Round three β Developer Guide
- β³ π‘οΈ CSRF protection (S4) β Developer Guide
- Single Sign-On (SSO)
- ποΈ LDAP & Active Directory
- π CardDAV contact sync
- Browser Extension
- API Reference
-
π REST API β how it works
- β³ π« REST API: Tickets
- β³ π» REST API: Assets
- β³ π΄ REST API: Problems
- β³ π REST API: Changes
- β³ π REST API: Knowledge
- β³ β REST API: Tasks
- β³ ποΈ REST API: CMDB
- β³ π REST API: Contracts
- β³ ποΈ REST API: Calendar
- β³ πΏ REST API: Software
- β³ π REST API: Domains
- β³ π¦ REST API: Service Status
- β³ βοΈ REST API: Morning Checks
- β³ π REST API: Forms
- β³ βοΈ REST API: Workflow
- β³ π·οΈ REST API: Cost centres
- β³ πΊοΈ REST API: Network Mapper
- β³ π§ Using the API docs page
- β³ π OpenAPI specification
- β³ β OpenAPI: kept correct
- β³ π οΈ Maintaining the catalogue
- Watchtower
-
Tickets
- β³ π Rota copy and paste β Developer Deep Dive
- β³ β Checklists & SOPs
- β³ βοΈ Mandatory fields
- β³ π·οΈ Ticket categories
- β³ π₯ Assigning tickets to a team, and escalation
- β³ π’ One board across every company
- β³ Mailbox Authentication
- β³ π€ Email send log
- β³ Basic IMAP mailboxes
- β³ Email rendering & images
- β³ SLA Management
- β³ WhatsApp channel
-
β³
βοΈ Telegram channel - β³ β CSAT company scope and filters β Developer Guide
- β³ π₯ Microsoft Teams channel
- β³ π¨οΈ Mattermost channel
- β³ π¬ Web chat channel
- β³ π£ Slack channel
- β³ π Linking tickets
- β³ β Record previews
- β³ π Ticket notes: internal or shared
- β³ ποΈ Canned responses
- β³ βοΈ Limiting replies to particular senders
- β³ π¨ Telling the analyst a ticket is theirs
- β³ βοΈ Email signatures
- β³ π The public web address
- β³ π’ Ticket numbering
- β³ π Raising a ticket for someone else
- β³ π Merging tickets
- β³ π Confidential tickets
- β³ π₯ Portal managers
- β³ π Who has seen a ticket
- β³ π Reading long tickets
- β³ β Splitting tickets
- β³ β Selecting several tickets
- β³ ποΈ The folder pane
- β³ π½ Just my tickets, or no closed ones
- β³ π οΈ Snoozing tickets β Developer Guide
- β³ π₯ Collision detection
- β³ β±οΈ Time tracking
- β³ π Scheduled work in your own calendar
- Problem Management
- Tasks
-
Assets
- β³ π’ Moving an asset between companies
- β³ π Shared asset locations
- β³ π§βπΌ Assigning assets to analysts
- β³ π Warranty and lease alerts
- β³ π Saved table views
- β³ π¨οΈ Recording anything, and importing it
- β³ π·οΈ QR asset labels
- β³ π Who holds what, and handover documents
- β³ π₯οΈ The inventory agent (PowerShell)
- β³ ποΈ Proxmox VE servers
- β³ βοΈ VMware Cloud Director servers
- β³ π Linking equipment to tickets
- β³ βοΈ Follow-up tasks on a ticket
- Knowledge
- Change Management
- Calendar
- Morning Checks
- Reporting
- Software
-
Forms
- β³ π¨ The form designer β Developer Guide
- β³ π Layout & the grid β Developer Guide
- β³ ποΈ Collections β grouping submissions
- β³ π Submissions as PDFs
- β³ β‘ What happens next β a form's own actions
- β³ π οΈ Sections & conditional logic β Developer Guide
- β³ π οΈ Lookup fields β Developer Guide
- β³ π‘οΈ Catalogue request approvals
- People
- Domains
- Contracts
- Service Status
- π Notifications
- π¨ War Room
- Self-Service Portal
- LMS
- Process Mapper
- CMDB
- Network Mapper
- Workflows
- Issue trackers (Jira, Azure DevOps)
- System
-
Overview
- β³ π Progress tracker
- β³ Concepts & vocabulary
- β³ Email routing & mailboxes
- β³ Settings: global vs per-company
- β³ Users & self-service
- β³ Staff cross-company access
- β³ π’ One board across every company
- β³ Worked examples
- β³ Pitfalls & gotchas
- β³ Scope: what it's for
- β³ π οΈ Developer Guide (make a module multi-company)
- β³ ποΈ Case study: CMDB (a linked graph)
- β³ π§ͺ Test harness (prove it's isolated)
- What this is
-
π Bugs resolved
- β³ π’ Chat tickets ignored your ticket numbering
- β³ π Dates shown as a dash, or in server time
- β³ π Assets β Users showed people from other companies
- β³ π Restricted analysts could read other modules' data
- β³ πΌοΈ Replies with a picture in the thread failed to send
- β³ π Reply attachments never reached the customer
- β³ π οΈ Outbound email attachments β Developer Guide
- β³ π A global SSO provider was missing from the portal
- β³ π Behind a proxy, the SSO redirect said http
- β³ βοΈ The portal tagline moved when you saved it
- β³ π¨ The portal settings screen forgot what you saved
- β³ π‘οΈ The approvals inbox said "Error" and nothing else
- β³ π A table's answers were missing from the PDF
- β³ β A single-select column let you tick every option
- β³ π The portal ignored a form's field widths
- β³ π The tasks board stopped taking clicks
- β³ ποΈ #121 The index list is out of date after upgrading
- β³ π #133 The calendar subscription was empty
- β³ π #131 Tasks always reopened on the board
- β³ π₯ #129 Every page returned HTTP 500 after upgrading
- β³ π³ #127 A PHP warning above the System page
- β³ π #126 Notes stamped with the server's clock
- β³ π Storing every date in UTC
- β³ πͺ The portal was down for everyone signed in
- β³ βοΈ #120 Workflow notes could never be written
- β³ βοΈ #123 Three errors when running Database Verification
- β³ π #122 The description box was a stub in the corner
- β³ π£ Demo data deleted real accounts
- β³ π #117 Sign-in redirected to the wrong address
- β³ π¨ #108 The priority dot was invisible
- β³ β±οΈ #116 Time logged from the right-click menu
- β³ π #114 API keys refused by our own guard
- β³ ποΈ #110 Assigning a task told nobody
- β³ πͺ #107 Signed out while still working
- β³ π #103 "Share with Requester" reached nobody
- β³ π #102 Search found nothing for hyphens
- β³ πͺ #101 Source code editor opened behind
- β³ βοΈ #88 Subtasks could not be ticked off
- β³ π» #84 Asset deep link selected nothing
- β³ π« #79 A new ticket arrived with no status
- β³ π§ #79 A ticket from email did not say so
- β³ π #78 Bell opened to nothing
- β³ π¬ #77 Mail only collected from Inbox
- β³ π #74 The default password could not be changed
- β³ π¦ #70 Renaming an impact level
- β³ π€ #67 App-only mailboxes could not send
- β³ π #45 Verify only ever worked for Microsoft
- β³ π #45 IMAP reported as not authenticated
- β³ βοΈ An email template stopped escaping itself
- β³ π The portal dashboard showed the wrong time
- β³ π’ The folder said 99 and the list showed 96