Ticket System

This page explains how Ticketo's ticket system works end-to-end — from creation to closure.


Overview

A ticket in Ticketo is a private Discord channel (or thread) created for a user to communicate with your server's support staff. Tickets track the full conversation, can be claimed by individual staff members, and produce transcripts when closed.


Ticket Creation

There are several ways to create a ticket:

1. Panel Button (Most Common)

Users click a button or select an option on a ticket panel — an embed message posted in a channel by an administrator.

Each button/option can be configured with:

  • A ticket category (determines the Discord category channel)

  • Custom questions (shown as a modal before creation)

  • Required roles (only users with specific roles see the button)

  • Custom opening messages

  • Thread or channel mode

2. Slash Command

  • /createticket — Staff can create a ticket on behalf of another user

    • Options: user (required), type (optional category), reason (optional)

3. Context Menu

  • Right-click a message → Create Ticket — Creates a ticket referencing that message

  • Right-click a user → Create Ticket — Staff can create a ticket for a user (staff only)


What Happens During Creation

When a ticket is created, Ticketo performs these steps in order:

  1. Rate limit check — 5-second cooldown per user per guild

  2. Blocklist check — Rejects users/roles on the blocklist

  3. Communication check — Rejects users who are timed out

  4. Quota check — Enforces maxActiveTickets (guild-wide) and maxActiveTicketsPerUser

  5. Topic prompt — If the category has requireTopic enabled and no topic was provided, a modal appears

  6. Questions modal — If the panel has custom questions, a modal appears for the user to fill in

  7. Ticket number — A sequential number is assigned (continuous across categories, or per-user depending on settings)

  8. Channel/thread creation — A private channel or thread is created in the configured Discord category

  9. Permissions — The ticket creator and support staff roles are granted access; everyone else is denied

  10. Opening message — An embed is posted with ticket info, answers to questions, and action buttons (Claim, Close)

  11. Staff thread (optional) — If createStaffThread is enabled, a private thread is created for staff discussion

  12. Support role ping (optional) — If pingSupportRoles is enabled, support roles are mentioned

  13. Database record — The ticket is saved with all metadata


Ticket Channels vs. Threads

Ticketo supports two ticket styles:

Style
Description
When to Use

Channel

Creates a private text channel in a Discord category

Default; best for longer support interactions

Thread

Creates a private thread in the current channel

Good for quick questions; less channel clutter

The ticket style can be set:

  • Per-guild via the manualTicketStyle setting

  • Per-panel via the panel's ticketStyle property

  • Per-button via the button's useThread override

Thread Ticket Behavior

When a thread ticket closes:

  • archiveThreadTickets: "archive" — The thread is archived (can be reopened)

  • archiveThreadTickets: "delete" — The thread is deleted (default)


Ticket States

A ticket progresses through these states:

State

open

claimedById

closedAt

Description

Open

true

null

null

Active ticket, any staff can view

Claimed

true

User ID

null

Active ticket, assigned to specific staff

Closed

false

Timestamp

Resolved; channel deleted or archived


Claiming

Claiming assigns a ticket to a specific staff member, optionally restricting access to only that person.

How to Claim

  • Click the Claim button on the ticket's opening message

  • Use the /claim slash command in the ticket channel

Claiming Modes

Mode
Behavior

disabled

Claiming is not available

no-changes

Ticket is marked as claimed but no permission changes occur

readonly

Needs verification — Behavior not fully confirmed

private

Other support roles lose access; only the claimer and creator can view

Unclaiming

  • Click the Unclaim button (replaces Claim after claiming)

  • Use the /release slash command

  • Unclaiming restores access for all support roles

Claim Notifications

If pingTicketAuthorOnClaim is enabled, the ticket creator is pinged when a staff member claims their ticket.


Closing

Close Flow

Closing a ticket can follow one of three paths depending on settings:

Flow A — Confirmation Prompt (default when confirmClosePrompt is true):

Flow B — Reason Required (when closeRequiresReason is true):

Flow C — Direct Close (when confirmClosePrompt is false):

Who Can Close

  • The ticket creator can always close their own ticket

  • Staff members (support roles) can close any ticket

  • If closeRequiresSupportRole is enabled, only support role holders can close

Close Request

The /closerequest command allows anyone in a ticket to request closure. This posts a message asking staff or the creator to confirm.

What Happens on Close

  1. Archive threads (if applicable)

  2. Fetch and save pinned messages

  3. Update the database record:

    • openfalse

    • closedAt → current timestamp

    • closedById → the user who closed

    • closedReason → encrypted reason text

    • messageCount → number of archived messages

  4. Generate a transcript snapshot (if archive is enabled)

  5. Delete or archive the channel/thread

  6. Send a DM to the ticket creator with:

    • Ticket number and dates

    • Close reason

    • Feedback rating (if submitted)

    • Link to transcript (if archived)

  7. Log the close event to log channels

  8. Invalidate caches


Feedback

If enableFeedback is enabled (globally or per-category), the ticket creator is shown a feedback modal after closing:

  • Rating — 1 to 5 stars

  • Comment — Optional free-text comment (encrypted at rest)

Feedback is stored in the Feedback table and viewable on the dashboard's Feedback page.

Feedback is only collected from the ticket creator, not from staff.


Auto-Close & Stale Tickets

Ticketo can automatically close inactive tickets to keep your server clean.

Configuration

  • autoClose — Close tickets after this many milliseconds of inactivity

  • staleAfter — Mark tickets as stale (show a warning) after this duration

How It Works

The bot runs a background check every 15 minutes:

  1. Warning Phase — If a ticket has been idle longer than the threshold, a warning embed is posted: "This ticket will be closed soon due to inactivity."

  2. Grace Period — The grace period is 25% of the threshold (minimum 15 minutes, maximum 4 hours)

  3. Mid-Grace Reminder — Halfway through the grace period, a "closing soon" message is sent

  4. Auto-Close — When the grace period expires, the ticket is automatically closed

Reactivation

If anyone sends a message in the ticket during the warning or grace period, the auto-close is cancelled and the ticket returns to its normal active state.

Auto-Close on Leave

If autocloseLeave is enabled, tickets are automatically closed when the creator leaves the Discord server.


Escalation

Staff or ticket members can escalate a ticket to a specific role.

How to Escalate

This:

  1. Posts a public message in the ticket channel mentioning the target role

  2. Includes the optional reason

  3. Logs the escalation to the log channel (if configured)

Escalation does not change the ticket's status or assigned staff — it simply notifies the target role.


Priority

Staff can assign a priority level to a ticket:

Available priorities:

  • HIGH

  • MEDIUM

  • LOW

Priority is stored on the ticket record and can be used for filtering in the dashboard.

This command is rate-limited to 2 changes per 10 minutes to prevent abuse.


Adding and Removing Members

Add to Ticket

Grants the specified user or role access to view and send messages in the ticket channel.

Remove from Ticket

Revokes access from the specified user or role.

Only the ticket creator or staff can add/remove members.


Renaming Tickets

Changes the Discord channel name of the ticket. Limited to 1-100 characters.

This command is rate-limited due to Discord's channel rename rate limits.


Staff Threads

If createStaffThread is enabled in settings, each new ticket automatically creates a private thread alongside the ticket channel. This thread is visible only to staff and is used for internal discussion about the ticket.

Use /thread to manually create a staff thread in any ticket.


Ticket References

Tickets can reference:

  • Another ticket — For follow-ups or related issues

  • A specific message — When created from the message context menu

Referenced content is displayed in the ticket's opening message.

Last updated