Tickets
Multi-type panels, channel-per-ticket runtime, Discord-styled web transcripts
The ticket system turns a Discord server into a full helpdesk: panels with buttons or dropdown open different ticket types, every ticket gets its own channel, staff works with internal notes, tags, priorities and claims, and on close you get a web transcript that looks like the Discord client.
Overview
Enable the module in the Tickets tab, create at least one type, build a panel, and publish it to a channel. Once a user clicks a panel button, the bot opens a private channel under the chosen category and pings your staff role.
Step-by-step setup
Step 1: Enable the module
Open Dashboard → Tickets → Settings and toggle 'Enable ticket system'. While the module is off, the bot replies to panel clicks with an error message.
Step 2: Create at least one type
In the 'Types' tab you define what kind of ticket can be opened. Required:
- Name + emoji (shown on the panel button)
- Discord category for channel creation
- At least one staff role allowed to see + handle tickets
- Welcome embed (posted inside the ticket on open)
Step 3: Build a panel
In the 'Panels' tab you choose a display type (buttons or dropdown), provide title + description, and assign types. Buttons allow up to 25 entries per panel; dropdown allows up to 25 options.
Step 4: Publish the panel
Click 'Publish' and choose the target channel. The bot posts the embed with interactive buttons or dropdown. When you edit and re-publish, the existing message is updated.
Panels
A panel is a Discord message that lets users open tickets. Per panel you configure:
- Display type — buttons (up to 25) or dropdown (up to 25 options)
- Embed content — title, description, color, optional image
- Assigned types — each type becomes a button or dropdown entry
Ticket types
Each type defines how an individual ticket behaves. Important settings:
| Setting | Meaning |
|---|---|
Discord category | Under which category the channel is created. At 50 channels the bot spawns an overflow category. |
Staff roles | Who can see and respond to the ticket. At least one role required. |
Max open per user | How many tickets of this type a user can have open at once. Default: 1. |
Cooldown (sec) | Minimum pause between two tickets of the same type from the same user. |
Opener can self-close | When on, the opener sees a 'Close' button in the ticket. Otherwise staff only. |
DM on close | After close, send the web transcript link to the opener via DM. |
Grace period (hours) | How long the archived channel stays visible before deletion. Default: 24. |
Pre-open fields
Per type you can define modal fields users must fill in before opening. Inputs are posted as an embed in the ticket header. Available field types:
- Short text — single line, max 100 chars (e.g. name, in-game ID)
- Long text — multi-line, max 4000 chars (e.g. description)
- Select — single choice from predefined options
- Multi-select — multiple choices
- Number — numeric input with optional min/max
Channel-per-ticket runtime
On open, the bot creates a new channel with permission overrides: only opener + staff roles see the channel, everyone else doesn't. The header shows an embed with pre-open fields, and buttons for claim, close, tags, priority.
Claim, priority, tags
Staff can claim a ticket by button — the claimer is shown in the header and audited in mod-log. Priority (Low/Normal/High/Urgent) is colour-coded in the embed. Tags are coloured labels you define server-wide and attach per ticket (e.g. 'Bug', 'GDPR', 'VIP').
SLA timers
Configurable per type. When an SLA target is missed, the bot escalates to the mod-log with a hint and a link to the ticket.
- First-response SLA — time between open and first staff reply
- Resolution SLA — time between open and close
- Pauses — SLA pauses while waiting on opener reply (configurable)
Auto-close on inactivity
When a ticket has been inactive for the configured hours, it auto-archives. The bot warns 24h beforehand; the opener can reset the deadline with the re-open button.
Web transcripts
On close the bot mints a 90-day token and posts a link to the mod-log (and optionally as DM to the opener). The link opens a web page that renders the ticket Discord-style: avatars, username colors, embeds with color bar, reply arrows, attachments as images/videos/file cards. URL pattern:
tera-one.de/:locale/t/:tokenExample: tera-one.de/en/t/Q5x9k3R2pL_aB7vN…
| Token scope | Audience | Lifetime |
|---|---|---|
staff | Any staff member (link is shareable) | 90 days |
opener | The opener personally | 90 days |
public | Manually issued for outsiders | Configurable |
Settings: storage & transcripts
The 'Settings' tab has two privacy toggles. Both are on by default.
- Store messages — When on, all messages in open tickets are stored in the database. Required for transcripts and analytics.
- Generate transcripts — When on, closing creates a transcript link and posts it to mod-log + DM.
Blacklist & anti-spam
A heuristic blocks spam openers who create several tickets in a short time without substance. The blacklist has a hit counter and an expiry (manual or automatic). Staff can edit and delete entries in the 'Blacklist' tab.
Custom-bot compatibility
If your server has a custom bot configured, all ticket operations — channel creation, embed posts, mod-log posts, opener DMs — go through its token. Your branding, your rate-limit slot.
Troubleshooting
- Panel click shows 'Ticket system is disabled'
- Enable the module in the 'Settings' tab. This is separate from the module toggle in general server settings.
- 'You've already reached the maximum number of open tickets' even though none are open
- Check in the Live tab whether a ticket is in status 'archived' — the counter only respects 'open' tickets, not archived ones. If an archived ticket still blocks the counter, report it — that's a bug.
- Publishing fails / panel doesn't appear in channel
- Check the bot permissions in the target channel: 'Send Messages', 'Embed Links', 'Use External Emojis' are required. For custom-bot setups: verify the custom bot has access to the target channel.
- Transcript link doesn't appear in mod-log
- 1) Set the mod-log channel in the audit-log module — the ticket mod-log uses that configuration. 2) Verify 'Generate transcripts' is on in the Settings tab. 3) 'Store messages' must also be on.
- Attachments missing in the web viewer
- Attachments are mirrored on close — if the mirror fails (bot offline during close, Discord link expired), the viewer falls back to the original link. If that link has also expired, the attachment is lost.
FAQ
- How many open tickets per server are possible?
- Up to 500. Discord limits categories to 50 channels — the bot auto-spawns overflow categories.
- Does this work with a custom bot?
- Yes. Once you've registered your server's custom bot via token, it takes over all ticket operations.
- Can tickets be closed without a reason?
- Yes. The reason field accepts 0–500 chars. With an empty input the reason is stored as 'no reason given' in the audit log.
- What happens if the opener deletes their account?
- The auth hook places a tombstone marker on the user record. Tickets remain readable for server-owner accountability; the username is anonymized to '[deleted]'.
- Can I edit a panel or type after going live?
- Yes. Panels, types and tags can be edited any time. When you update a panel, the existing Discord message is patched.
- Does this module cost anything?
- No. Completely free — all features, no limits, no premium tier.