Skip to main content
A full walkthrough of the Tickets module, building a two-category support system.
In a hurry? !ticket setup does all of this with menus and buttons in one panel: the channel, the support roles, the log channel, the text and the ticket types. The steps below show what each part does by hand.
1

Create a category channel and a panel channel

Make a Discord channel category (e.g. “Tickets”) where ticket channels will be created, and a text channel (e.g. #support) where the panel message will live.
2

Post the panel

This returns a panel_id, you’ll need it for every category you attach.
liam types !ticket panel create #support with a title, a text and the button style; Petto posts the card Need help? and answers that panel 1 was posted and how to add categories

In Discord: the panel posted in #support, with no buttons until it has categories.

3

Add your first category

key (support here) is how you’ll refer to this category in every other command, parent is the channel category new ticket channels get created under.
The panel now has a General Support button; liam typed !ticket category add 1 support with the Tickets channel category and @Staff, and Petto answers that category support was added to panel 1

In Discord: the first category: the panel gets its button.

4

Add a second category

A button-style panel supports up to 5 categories, switch style to select when you create the panel if you need more (up to 25, as a dropdown instead of buttons).
The panel now has the General Support and Billing buttons; liam typed !ticket category add 1 billing with @Finance, and Petto answers that category billing was added to panel 1

In Discord: the second category, next to the first one.

5

Add extra roles, if one isn't enough

support-role controls who can see/manage the category’s tickets, ping-role controls who gets pinged when one opens, they don’t have to match.
liam adds @Trainee as a support role and @on-call as a ping role of support, and Petto confirms each one

In Discord: one more support role and a ping role for support.

6

Set a naming pattern (optional)

Supports {number}, {username}, {userid} and {category}, defaults to ticket-{number}. See ticket placeholders.
liam types !ticket category edit support --naming ticket-{number} and Petto answers that category support was updated

In Discord: the naming pattern of support.

7

Try it yourself

Click your own panel. Once inside, !ticket claim to take ownership, !ticket close "Testing" to close it and generate a transcript link.
Under the panel Petto answers only to liam: Ticket opened: #ticket-0001

In Discord: liam presses General Support on his own panel.

In #ticket-0001 the welcome card pings @on-call; liam types !ticket claim and Petto posts Ticket claimed, then !ticket close Testing and Petto posts Ticket 0001 closed with Reopen, Delete and View Transcript

In Discord: inside the test ticket: the welcome pings @on-call, then claim and close.

liam posts the panel in #support: Need help?, Pick a category below, and the General Support and Billing buttons

In Discord: the panel of this guide with its two categories.

Using a saved embed for the panel or welcome message

Instead of plain title/description, !ticket panel create takes the name of a saved embed with --embed_template, and !ticket category add (and edit) takes one for the welcome message with --welcome_embed, see Embeds for how to build one first.
liam types !ticket panel create #support --embed_template support-panel and Petto posts the embed Support of Petto Land and answers that panel 1 was posted

In Discord: a panel made from a saved embed.

Ask questions before a ticket opens (optional)

A category can use a form: a pop-up the member fills in when they press the button, so the first message already has the details. Besides short answers it can have choices, checkboxes, a member, role or channel picker and a file upload where members attach pictures (a screenshot of the problem, for example). The answers, with the pictures drawn, are posted in the new ticket and kept in the transcript.

Common mistakes

Petto answers “A category with key billing already exists.” Petto answers “A category with key billing already exists.” Petto answers “A category with key billing already exists.” Petto answers “A category with key billing already exists.” Petto answers “A category with key billing already exists.” key must be unique per server, not just per panel. Pick something specific like billing-eu instead of reusing billing across two panels.
liam types !ticket category add 1 billing again and Petto answers that a category with key billing already exists

In Discord: the key billing is taken.

You need at least one category added to the panel before it shows any interactive elements, an empty panel is just the title/description.
The card Need help? with its text and nothing under it

In Discord: a panel with no categories yet.

That’s max_open, defaults to 1 per category. Raise it with !ticket category edit if your server wants members to have multiple tickets open at once.
Under the panel Petto answers only to the member that they already have 1 open ticket in this category (limit 1)

In Discord: a member with an open ticket presses the button again.