How it works
Setup
1. Sign in and add the bot
Signing in reads who you are and which servers you hold Manage Server in. That is Discord's own permission, read live on every load, so the list is exactly what you can already administer — and someone demoted this morning loses access this afternoon rather than whenever a cache expires.
2. Create a panel
A panel is a ticket type. It owns the message people see, the button they press, the form they fill in, the category tickets land in, and who can handle them. A server can have as many as it likes, and one posted message can carry up to 25 of them.
3. Post it
Run /panel in the channel you want it in. Posting again updates the
existing message in place rather than leaving a trail of dead panels.
4. Name your support team
Under Roles and access. Almost every other screen refers back to this list, so it is worth doing before anything else is tuned.
Ticket lifecycle
created → opened → closed → re-opened → deleted, with claimed and unclaimed running alongside as a separate axis.
Closed and deleted are deliberately different things. Closing denies the opener view of the channel, renames it and moves it to the closed category — the history is intact and it can be re-opened. Deleting removes the channel. The ticket record survives deletion on purpose: statistics, the audit trail and any transcript already taken all reference it, and removing the row along with the channel would silently rewrite last month's numbers.
Variables
Usable in any message, embed, channel name or custom command. Chain modifiers with a pipe:
{owner.username|upper|max:12}.
An unknown variable renders as nothing, never as its own name. A typo
that printed {owner.usrname} into a live support channel would look like the
bot is broken; printing nothing looks like a field that was not filled in. Substitution
is also single-pass, so a value that itself contains braces is not re-scanned — which is
what stops someone typing a role ping into a ticket reason and having it expand.
Permissions
Discord shows an invite's permissions as a list with no explanation, and never reviews what an app asks for. The only gate is an admin pressing Authorize. So here is the whole list with a reason for each.
Commands
| Command | Does | Who |
|---|---|---|
/ticket [reason] | Opens a ticket | Anyone not blacklisted |
/claim | Takes ownership of the ticket | Support team |
/close [reason] | Closes it, keeping the history | Support team, or the opener |
/panel [name] | Posts a panel into this channel | Manage Server |
/ping | Confirms the bot is awake | Anyone |
When it goes wrong
A slash command does not appear
Global commands take up to an hour to propagate, which looks exactly like a bug and has cost people entire afternoons. Register to a single server while testing and it appears instantly.
"I do not have permission to create channels here"
The bot's role is missing Manage Channels, or a category overwrite is denying it. A server admin can edit the bot's auto-created role, but only within their own role hierarchy — they cannot grant what they do not hold themselves.
The bot's banner keeps disappearing
Discord's developer portal never loads an existing banner back into its upload control, so every Save on that page submits the field empty and deletes it — including saves for something else entirely. Set the banner from the dashboard, which sends only the fields you actually named.
Sign-in returns "invalid_state"
The sign-in did not start on this page, or it sat unfinished for more than fifteen minutes. Start it again from the dashboard. On your own application, it also means the redirect URL registered in the portal does not match exactly — a trailing slash is a different URL to Discord.