User guide
Ticketing
Looking for what it does rather than how to use it? Read the Ticketing overview .
This guide covers the ticketing system end to end: raising work, working it, routing it through queues, holding it to an SLA, and escalating it when it outgrows the team that owns it.
Everything below is verified against the product. Where a capability exists in the API but has no screen behind it yet, it is marked API only — those rows are for implementers, not end users.
What it is
Ticketing is the record of work in Solidlio. A ticket carries a requester, an owner, a lifecycle status, an SLA clock, a conversation with per-audience visibility, and links to the assets and time that the work touched.
Three portals see the same ticket differently: customers raise and track their own requests, organization staff work their organization’s queue, and an MSP works across every client account it services.
Concepts
| Concept | What it is |
|---|---|
| Ticket | The unit of work. Has type, priority, impact, urgency, status, requester, assignee. |
| Queue | A container tickets are routed into. Owns membership, access mode, and auto-assignment. |
| SLA policy | Per-priority response and resolution targets in minutes. One policy is the org default. |
| Workflow | A named set of allowed status transitions. A ticket with no workflow allows every transition. |
| Comment | A message on a ticket, stamped with a visibility that decides who can read it. |
| Escalation | A handoff of a ticket to a servicing MSP or to the platform’s provider network. |
| Time entry | Billable or non-billable work logged against a ticket. |
| Relation | A typed link between two tickets — related, duplicate, blocked-by, causes, merged-into, parent. |
Ticket statuses
NEW, OPEN, IN_PROGRESS, WAITING_CUSTOMER, WAITING_VENDOR, ON_HOLD, RESOLVED, CLOSED, CANCELLED.
Ticket types
TICKET, INCIDENT, SERVICE_REQUEST, PROBLEM, TASK, CHANGE, ALERT, ONBOARDING, RECURRING, PROJECT.
Ticket sources
MANUAL, EMAIL, PORTAL, PHONE, CHAT, MONITORING, API, PLATFORM.
Comment visibility
Every comment carries one of four visibilities. This is the mechanism that lets an MSP, an organization, and an end customer share one ticket thread.
| Visibility | Who can read it |
|---|---|
PUBLIC | Everyone, including the end contact |
ORG_INTERNAL | Org staff, the servicing MSP, platform |
MSP_INTERNAL | The MSP and platform only |
ESCALATION | The escalation team and platform only |
Roles and permissions
The role hierarchy is platform administrator > MSP administrator > MSP technician > organization administrator > power user > CUSTOMER`.
Most ticket routes carry no explicit role floor. Access is decided by two mechanisms instead:
- Tenant scope. Ticket-owned resources use
ticketScope, which widens an MSP’s reach from its own account to the client accounts it services. Tenant configuration — queues, SLA policies, workflows, automations, templates, canned responses, views, business hours, recurring rules — stays onaccountScope(own account only), because those are the MSP’s own settings and not a client’s data. - Queue visibility. Tickets sitting in a
RESTRICTEDqueue the caller cannot access are invisible everywhere a ticket is the resource — lists, detail, comments, attachments, time entries, relations, stats, and the real-time feeds.
What a customer-portal caller may do
Customer-portal callers are held to their own requests and to an action allowlist.
- To
CANCELLEDfromNEW,OPEN,IN_PROGRESS,WAITING_CUSTOMER,WAITING_VENDOR, orON_HOLD - From
RESOLVEDtoOPEN(reopen) orCLOSED(accept)
Anything else returns 403 That action isn't available from the customer portal. Field edits and reassignment are staff-only.
Queue administration
Queue create, update, delete, routing rules, grants, shares, and manual routing all require organization administrator or above (requireMinRole("organization administrator")).
The admin bypass for restricted queues is a fixed set, not a rank test: platform administrator, MSP administrator, organization administrator. This is deliberate — MSP technician outranks organization administrator in the linear hierarchy, but technicians are exactly the population a restricted queue is meant to partition, so a rank comparison would make restriction meaningless.
Escalations
| Action | Who |
|---|---|
| Escalate a ticket | MSP or organization staff (not customers) |
| Accept / resolve / return | The receiving side (MSP or platform) |
| Assign, change priority | Platform admin, or the accepting party |
| Batch auto-escalation trigger | Platform admin only |
| Manage escalation providers | Platform admin; MSP staff may view |
Walkthroughs
A customer raises and tracks a request
- The customer opens Requests (
/user/requests) and clicks New. - They pick Incident (
/user/requests/new/incident) for something broken, or Service (/user/requests/new/service) for a standard request. - As they type a subject, self-help suggestions appear from the knowledge base, and a duplicate warning appears if a similar open request already exists.
- They submit.
- On the request detail page (
/user/requests/[id]) they can add public comments, upload attachments, and follow progress. - When the request is
RESOLVED, they can reopen it or accept and close it, and they can submit a satisfaction rating. Separately, staff can send them a single-use survey link by email from the ticket.
A technician works a ticket (MSP portal)
- Open All Tickets (
/msp/tickets). Filter by client, status, priority, assignee, or queue. Counts across the last 30 days sit above the list. - Open a ticket (
/msp/tickets/[id]). - Change the status from the dropdown in the header. It lists only the moves the ticket’s workflow permits from its current status; if a move requires a note, you are asked for one before it is applied.
- Reply with the composer. Choose the visibility — a public reply reaches the contact, an internal note stays with the MSP. A reply can carry a status change in the same action.
- Click Log Time to record duration, description, and whether the work is billable.
- Link the assets the work touched, and merge or relate duplicate tickets from the same screen.
- The AI copilot panel offers ticket analysis, drafted responses, similar resolved tickets, and the requester’s history.
An organization admin sets up a queue
Queue administration lives at Settings → Ticket Queues (/org/settings/queues).
- Create a queue and give it an assignment method:
ROUND_ROBIN,LOAD_BALANCED,LEAST_RECENT, orMANUAL. - Set the access mode.
EVERYONEmeans every user in the organization can see the queue’s tickets.RESTRICTEDmeans only members, explicit person grants, team grants, and the three admin roles. - Add members in the Members tab.
- Add person or team grants in the Access tab for people who need visibility without membership.
- In the Sharing tab, share the queue into a client organization — this is how an MSP gives a client visibility of the queue handling their work.
- The Shared with me section shows queues other accounts have shared in.
An MSP defines SLA policies
SLA policy administration lives at Settings → SLA & Hours (/msp/settings/sla).
- Create a policy, name it, and pick the organization it applies to.
- Set response and resolution targets in minutes for each priority —
LOW,MEDIUM,HIGH,URGENT,CRITICAL. - Save. Creating and updating policies requires the
slaManagementfeature atBASICor above; see §6. - On a ticket, the SLA panel shows the response and resolution clocks and lets staff pause and resume them.
- A background job checks for breaches every 60 seconds and raises notifications.
Escalating a ticket
- On a ticket, staff open the escalation control and choose a target — the servicing MSP, or the platform provider network.
- They give a reason and a priority.
- The receiving side sees it in Escalations (
/msp/escalationsor/org/escalations) and accepts it. - Both sides converse on the escalation with
ESCALATION-visibility comments, which the end contact never sees. - The receiver resolves the escalation with resolution notes, or returns it.
- The originating side can withdraw an escalation that has not been accepted.
An organization can also refuse escalation entirely. If its escalation mode is DISABLED, the attempt is rejected with Organization does not allow escalation.
Configuration
| Setting | Where | Effect if unset |
|---|---|---|
| Queue assignment method | /org/settings/queues | MANUAL — no auto-assignment |
| Queue access mode | /org/settings/queues | EVERYONE — all org users see the queue’s tickets |
| SLA policy (default) | /msp/settings/sla | No SLA clock is applied to new tickets |
| Workflow | Ticketing → Workflows | A ticket with no workflow permits every status transition |
| Escalation mode | Organization record | Manual escalation is permitted |
Plan tiers
Ticketing itself is not plan-gated. SLA policy management is. The slaManagement feature is a ladder: false < BASIC < ADVANCED.
BASICunlocks creating and updating SLA policies.ADVANCEDadditionally unlocks the business-hours and holiday calendar API.
The gate is block-new-only: reads and deletes are never gated, so a downgrade leaves existing SLA configuration viewable and removable. Platform admins and accounts with no resolved tier are never blocked.
| Tier group | Tier | slaManagement |
|---|---|---|
| MSP / IT partner | MSP_FREE | — |
MSP_STARTER | BASIC | |
MSP_GROWTH | ADVANCED | |
MSP_SCALE | ADVANCED | |
MSP_ENTERPRISE | ADVANCED | |
| End customer | CUSTOMER_FREE | — |
CUSTOMER_ESSENTIALS | — | |
CUSTOMER_PROFESSIONAL | BASIC | |
CUSTOMER_BUSINESS | ADVANCED | |
CUSTOMER_ENTERPRISE | ADVANCED |
A blocked call returns 403 with code FEATURE_NOT_ON_PLAN and a structured upgrade offer naming the tier that would unlock it.
Troubleshooting
Messages below are the literal strings the service returns.
| Message | Cause |
|---|---|
That action isn't available from the customer portal | A customer tried a field edit, a reassignment, or a status move outside the customer allowlist. |
You can only modify your own requests | A customer-portal caller targeted a ticket they neither requested nor created. |
Transition from X to Y is not allowed by the workflow | The ticket has a workflow and no transition is defined for that pair. |
Role "X" is required for this transition | The workflow transition carries a role guard the caller does not meet. |
Ticket is already in this status | The status in the request equals the current status. |
Cannot delete SLA policy that is in use | Tickets or contracts still reference the policy. The 400 carries ticketCount and contractCount. |
Cannot delete queue with assigned tickets | Move or close the queue’s tickets first. |
Cannot delete the default queue | Promote another queue to default first. |
Cannot delete workflow with assigned tickets | Tickets still reference the workflow. |
Cannot modify approved time entries | Unapprove the entry first. |
Cannot delete invoiced time entries | The entry is already on an invoice. |
Cannot merge a ticket into itself | Source and target ids match. |
Attachment data is empty or not valid base64 | The upload body was not base64, or was empty. |
Organization does not allow escalation | The organization’s escalation mode is DISABLED. |
Escalation already accepted / already resolved | The escalation has moved past that step. |
Not permitted to escalate tickets | Customer-portal callers cannot escalate. |
Survey has already been completed | The satisfaction token was already used. |
Survey has expired | Past expiresAt. |
403 FEATURE_NOT_ON_PLAN | SLA policy write below the required slaManagement tier. |
A ticket list looks empty but tickets exist. Check queue access. A RESTRICTED queue hides its tickets from non-members everywhere, and only platform administrator, MSP administrator, and organization administrator bypass it — MSP technician does not, despite ranking higher.
An MSP cannot see a client’s tickets. Ticket reads use ticketScope, which depends on the client account being serviced by the MSP’s account. Tenant configuration deliberately does not widen this way.
Limits and known behaviour
- A ticket with no workflow accepts every status transition. Workflow enforcement is opt-in per ticket; the engine returns valid for any move when
workflowIdis null. This is intentional backward compatibility, and it is why assigning a workflow is what makes the lifecycle real. - The creation entry in the timeline is derived, not stored. It is reconstructed from the ticket’s own
createdAtand creator, which is what makes it correct for tickets created outside the API — monitoring alerts and inbound email write ticket rows directly — and for every ticket that predates the activity table. - Attachments are capped at 16 MB decoded. The upload route accepts a 24 MB JSON body to allow for base64 overhead; the handler enforces the real limit. Attachments can be uploaded and downloaded but not deleted from the UI.
- MSP and org ticket detail pages refetch on action instead.
- It applies the same queue-visibility rule.
- A survey needs a requester email. Request feedback emails the invitation and reports whether it went out; on a ticket with no requester address, or if delivery fails, it says so and shows the link for manual sending. The link is valid for 7 days and works once.
- One survey per ticket. A second request returns
Satisfaction survey already sent for this ticket. - Business hours apply per organization, not per queue. An MSP sets one working week and holiday calendar for each client.