Ticket Lab is a support-ticket bot for Discord by Buildable Labs. Members pick a ticket type on a panel, a private channel opens for them, your team handles it, and a transcript is saved when it closes. Five minutes from invite to first ticket.
Set it up in four steps
Invite the bot
Use ticketlab.buildablelabs.dev/invite. It asks for exactly what tickets need: manage channels, view and send messages, manage messages, embed links, attach files, read history and mention roles. It does not ask for Manage Roles or Administrator.
Run /setup
A five-step wizard in Discord: staff role → ticket category → transcript channel → your first ticket type → post the panel. Every choice saves the moment you click it. Running /setup again later opens the config editor instead of the wizard.
Open the dashboard
Sign in with Discord at /dashboard and pick your server. Everything the wizard did is there, plus everything it didn’t ask about. You need Manage Server on the server, or a role listed under Dashboard roles.
Post the panel
Type /ticketpanel in the channel where members should open tickets. Edit the panel later under Panels and post it again — panels bake at post time, so a repost is how changes reach Discord.
1Manage opens that server’s workspace.
2Refresh re-reads your servers from Discord.
3Servers without the bot show an Invite instead.
What you get for free
Ticket Lab’s free tier is deliberately generous. The things other ticket bots charge for — DM transcripts, per-type routing, forms, custom messages, custom commands, threads, backups — are free here, with no ticket limit and no panel watermark you can’t change.
Nothing here needs Message Content. Slash commands, buttons and dropdowns carry everything. The optional $ text commands are the only feature that reads messages, and they are off unless you turn them on.
Dashboard tour
The dashboard is a settings app for your server. A sidebar on the left, one page per topic, and cards of settings that save together. It reads and writes the same configuration /setup does, live for the next ticket.
1Go back returns to the server list.
2Search settings jumps to any row on any page.
3Pages are grouped: Setup, Messaging, Automation, Activity, Lab.
4The server you are editing, always visible.
5A card — its rows save together with the button at the bottom.
Plans, prices, your subscriptions, invoices and cards.
How saving works
Each card has its own Save button. Rows inside it save together; other cards are untouched.
Ticket types and panels save per item — Save type, Save panel.
Changes apply to the next ticket. Open tickets keep the settings they were created with, except messages and buttons, which render live.
Panels are the exception: edits reach Discord only when you post the panel again.
Who can use it
Anyone with Manage Server on that Discord server, plus anyone holding a role you list under Configuration → Dashboard roles. The dashboard signs you in with Discord and only ever shows servers you are actually in.
Locked pages. Pro pages stay visible on Free servers behind a frosted card so you can see what they do. Nothing on the dashboard moves behind a paywall without notice.
Configuration
The server-wide settings. Ticket types can override some of them (staff role, category, mode); everything else applies to every ticket.
Roles & access
Row
Meaning
Staff role
The support team. Sees every ticket, gets every ticket permission and is pinged on open.
More staff roles
Additional roles with the same powers as the staff role.
Observer roles
Can read tickets but cannot send. Good for trainees and auditors.
Dashboard roles
May use this dashboard without Manage Server.
Blacklisted roles
Cannot open tickets or use ticket buttons.
Bypass roles
Exempt from limits and the schedule.
Categories
Ticket category is where new tickets are created. Closed category is where they move when closed (two-step mode). Overflow categories take over when the main one hits Discord’s 50-channel cap — list a few and Ticket Lab fills them in order. Transcript channel receives the transcript when a ticket closes.
Lifecycle
Switch
Default
What it does
Two-step tickets
On
Close puts the ticket in a closed state with Reopen / Delete / Transcript. Off: Close deletes right away, saving a transcript first.
Confirm before closing
On
Close asks “are you sure?” first.
Pin the ticket message
Off
The welcome message is pinned when a ticket opens.
Claim button
On
Staff can claim tickets so everyone sees who is on it. Claiming rules live under Automations.
DM transcripts
On
A copy of every transcript goes to whoever opened the ticket.
Ping staff on open
On
Mention the staff role when a ticket opens.
Limits
Four counters, all 0 = no limit: open tickets per member (across all types), open per server, closed tickets kept per member, closed kept per server. Bypass roles ignore them.
Naming
Templates for channel names. Variables render first, then the name is lowercased and cleaned for Discord.
Template
Default
Note
Open tickets
{count}-{type}
Try {count}-{ticket.user.name} or {type}-{ticket.user.name}.
When closed
closed-{count}
Skipped quietly if Discord rate-limits renames (two per ten minutes per channel).
When claimed
empty
Leave empty to keep the name. Reverts on unclaim.
Number padding
4
4 → 0001. Set 0 for plain numbers.
Logging
One line per event into the Log channel — open, claim, unclaim, close, reopen, delete, transcript, transfer, rename, add and remove. Toggle each event on or off. Leave the channel empty to log into the transcript channel.
Advanced
Command prefix — for text commands like $close. Default $.
Transcript format — HTML (rich, readable in the browser) or plain text.
Ticket mode — Channels (one channel per ticket) or Private threads under a Thread parent channel. Types can override this.
Bloxlink API keyPro — unlocks the {roblox.*} variables and the optional Roblox embed on tickets.
Backup & restore
A key or a JSON file carries the whole setup — configuration, types, panels and custom commands. Never tickets or transcripts. Generate key gives you a 16-character key valid for 30 days; Download JSON gives you a file you keep. Restore from either on any server the bot is in, choosing which sections to bring over.
Ticket types & forms
A type is what a member picks on the panel — “Support”, “Bug report”, “Partnership”. Each has its own emoji, description, team, category and optional form. Up to 25 per server.
1How many of the 25 types you use.
2Emoji — unicode or a custom <:name:id>.
3Which panel lists this type.
4Remove a type. Existing tickets are unaffected.
Fields
Field
What it does
Name
Shown on the panel and as {type.name}. Up to 80 characters.
Emoji
Any unicode emoji, or a custom server emoji as <:name:id> (animated: <a:name:id>). Get the code by typing \:emojiname: in Discord.
Description
The grey line under the name in the dropdown. Up to 100 characters.
Staff role
This type’s team. Empty = the server staff role.
Category
Where this type’s tickets open. Empty = the server category.
Ticket mode
Channel or private thread. Empty = the server default.
Panel
Which panel shows this type. Extra panels are Pro.
Ticket message
Overrides the server ticket message for this type only. Markdown and variables work.
Forms
Up to five questions asked in a Discord modal before the ticket opens. Each question has a label, a placeholder, required or optional, short or paragraph, and a min/max length (Discord allows up to 1,000 characters). Answers land in the ticket as {form.1} … {form.5} and, with Show answers in the ticket message on, appear as fields on the welcome embed.
1The form title (up to 45 characters).
2A required paragraph question.
3An optional short question.
4Submit opens the ticket with the answers.
Repost the panel after changing types. Panels bake at post time. Names, emoji and descriptions on an already-posted panel update only when you run /ticketpanel again (or press the post button on the panel preview).
Panels
The panel is the message members open tickets from. One panel per audience: the default panel is what /ticketpanel posts; extra panels post with /ticketpanel <name>.
1Your panels. The default one is always there.
2Style: Ticket Lab, Classic embed or Plain text.
3Dropdown or one button per type.
4Banner on or off.
5Your own banner URL. Empty = the cosmic banner.
6New panel — extra panels are Pro.
Styles
Ticket Lab — the signature look: banner on top, intro, a line per type with its emoji, then the dropdown or buttons. Built on Discord’s newest components.
Classic embed — a regular embed with title, colour and description, or up to ten custom embeds you build yourself. Banner becomes the embed image.
Plain text — just the intro and the controls. For minimalists.
Dropdown or buttons
Dropdown lists every type on the panel in one select menu with emoji and description — best when you have more than three types. Buttons gives each type its own button, up to five per row; set the row width under Buttons per row.
Banner image
Every panel ships with Ticket Lab’s cosmic banner. To use your own, paste a direct https link to a PNG, JPG, GIF or WebP under Banner image URL. Upload the image to Discord (any channel), copy the link, paste it. A 2:1 image looks best. Turn Banner image off to have no banner at all.
1A custom banner from a URL.
2The intro — markdown and variables work.
3One line per type, with its emoji (custom emoji work too).
4The dropdown members open tickets from.
1A type with a custom server emoji.
2A type with a unicode emoji and its description.
Posting and updating
Edit and save
Change anything in the editor and press Save panel. The live preview on the right shows exactly what Discord will get.
Post it
Run /ticketpanel in the channel (or /ticketpanel name for an extra panel). The old panel message keeps working, so delete it when you are done.
Extra panels are Pro. The default panel — every style, both modes, custom banner, custom embeds — is free and stays free. Pro adds more panels for more audiences: a staff-only panel, a partner panel, a VIP lane.
Messages & variables
Every message the bot sends during a ticket is editable. Leave one empty to keep the built-in text. Markdown, embeds and variables all work everywhere.
1The fourteen messages.
2{ } opens the variable picker and inserts at the cursor.
3Add embed — up to ten per message.
4A live preview with sample values.
5Reset to default when you want the built-in text back.
The messages
Message
When it is sent
Ticket message
Posted inside every new ticket, with the Claim and Close buttons.
Close confirmation
Asked when someone presses Close (Confirm before closing on).
Closed
Posted when a ticket enters the closed state, with Reopen / Delete / Transcript.
Reopened
Posted when a closed ticket is reopened.
Deleted
Posted right before the channel is deleted.
Claimed / Unclaimed
Posted when staff claims the ticket or releases the claim.
Transcript
Posted with the transcript in the ticket and the log channel.
Transferred
Posted when a ticket moves to another type.
DM on open / DM on close
Sent to the opener when their ticket opens, and when it closes (with the transcript).
Outside hours
Shown when someone opens a ticket outside the schedule Pro.
Inactivity warning
Posted when the opener goes quiet and the inactivity action is “warn” Pro.
Variables
Write them in curly braces anywhere text goes — messages, embeds, channel names, custom commands. The names are compatible with Ticket Tool, so existing templates paste straight in.
{roblox.name}{roblox.id}{roblox.url}{roblox.age}{roblox.verified} — needs a Bloxlink key.
Other
{@Role Name} mentions a role by name · {random} · {argument.1} and {regex.NAME} in custom commands
Modifiers
Add a modifier after a ? to transform a value.
Modifier
Example
Result
?uc / ?lc
{ticket.user.name?uc}
UPPERCASE / lowercase
?pl=N
{count?pl=5}
Pad with zeros to N digits → 00042
?fb=text
{reason?fb=no reason}
Fallback when the value is empty
?ml=N
{form.1?ml=200}
Cut to at most N characters
?pr=N
{form.2?pr=20}
Keep only the first N characters (prefix)
?clean
{ticket.user.name?clean}
Strip everything Discord channel names reject
?rlist=a|b
{random?rlist=🍎|🍊|🍇}
Pick one from the list
?rmin=N ?rmax=N
{random?rmin=1&rmax=6}
Random number in a range
Buttons
Seven buttons appear during a ticket. Each one has a label, an emoji, a colour, and role rules for who may press it.
The seven buttons
Button
Where
Default
Claim
Ticket message
Grey. Staff only.
Close
Ticket message
Red. Staff and the ticket owner.
Confirm / Cancel
Close confirmation
Red / grey.
Reopen
Closed message
Green. Staff.
Delete
Closed message
Red. Staff.
Transcript
Closed message
Grey. Staff.
Per button
Show this button — hide a button entirely (hide Claim if you do not use claiming).
Label and Emoji — up to 80 characters; unicode or custom emoji.
Style — Blurple, Grey, Green or Red (Discord’s primary, secondary, success, danger).
Allowed roles — only these roles may press it. Empty = the defaults above.
Disabled roles — these roles may never press it, even if they are staff.
Changes render live: the next time the bot sends a message with that button, it uses the new label and colour. Buttons on old messages update when a ticket changes state.
Ticket lifecycle
Open → (claim) → close → closed state → reopen or delete. Every step works from a button, a slash command, a text command and the dashboard, and they all agree on the state.
Opening
A member picks a type on the panel. If the type has a form, the modal appears first. Ticket Lab checks the blacklist, the limits and the schedule, then creates the channel (or private thread) under the right category, names it from the naming template, gives the opener and the team access, and posts the ticket message with a ping to the staff role.
1Channel named from the template — 0008-audit-support.
2The opener and the staff role are pinged.
3Form answers shown as fields.
4Claim — staff take ownership.
5Close — with confirmation if enabled.
Claiming
Staff press Claim (or /claim). The ticket shows who is on it, the channel can be renamed with the When claimed template, and — under Automations → Claiming — you can lock actions to the claimer, hide the ticket from other staff, move it to a category or allow takeovers. Unclaim reverts all of it.
Closing
With Two-step tickets on (the default), Close moves the ticket into a closed state: the channel is renamed with the When closed template, moved to the closed category, the opener loses Send, a transcript is saved, and staff get three buttons.
1Renamed to closed-0008.
2Reopen — back to open, opener regains Send.
3Delete — saves a transcript, deletes the channel after five seconds.
4Transcript — save one right now without changing state.
With Two-step off, Close saves a transcript and deletes the channel straight away.
Threads instead of channels
Set Ticket mode to private threads (server-wide or per type) and tickets open as private threads under the Thread parent channel. Same buttons, same commands, same transcripts — with none of the channel-count pressure.
From the dashboard
The Tickets page lists open and closed tickets with who opened them, their type and age. Each row has Close, Reopen, Transcript and Delete, so the team can tidy up without opening Discord. Actions are logged to the log channel like any other.
Transcripts
Every closed ticket is archived — readable in the browser, forever, free. The opener gets the same link by DM.
1Ticket name, type, message count, when, and how long it was open.
2Open — the hosted HTML transcript, same link the opener got.
3View — read it inline without leaving the dashboard.
Where transcripts go
Hosted at ticketlab.buildablelabs.dev/t/<token> — a private, unguessable link. Anyone with the link can read it; nobody can list them.
Transcript channel — the Transcript message plus a .txt attachment (Discord shows HTML as raw code, so the attachment is text on purpose) and the hosted link.
Opener’s DMs — with DM transcripts on, the same link and file. Skipped quietly if their DMs are closed.
Dashboard — the Transcripts page, with Open and View.
Format
HTML (default) renders messages, embeds, attachments and reactions in a Discord-like page. Plain text is a simple log. Switch under Configuration → Advanced. Transcripts keep the name the ticket had when it was opened.
On demand
Press Transcript on a closed ticket, run /transcript in any ticket, or use the Tickets page. Each saves a fresh snapshot without changing the ticket’s state.
Automations Pro
Things the bot does on its own — inactivity, missing owners, opening hours, roles on events and claiming rules. The bot working while your staff sleep.
1After — hours of owner silence before anything happens (0 = off).
2Then — warn, close or delete.
3Missing user — what happens when the owner leaves.
4The Pro tag. On Free servers the page shows the same settings behind a frosted lock card with See plans.
Inactivity
When the ticket owner goes quiet. Set After in hours (up to 720; 0 = off), then choose what happens: Warn once and close after another equal wait, Close the ticket, or Delete it. Staff silence never counts. Bypass roles are exempt. The warning text is the Inactivity warning message. The sweep runs every five minutes.
Missing user
When the ticket owner leaves the server: leave the ticket open, close it, or delete it.
Schedule
Opening hours. Pick a timezone, paint the hour grid (presets: Always open, Weekdays 9–17, Every day 8–22, Clear), and decide what happens outside hours: refuse with the Outside-hours message, or open anyway with a notice. Bypass roles skip the schedule.
Direct messages
DM transcripts (the same switch as Configuration), plus the DM on open and DM on close messages. Skipped quietly when the member’s DMs are closed.
Roles on events
Add or remove roles when a ticket is opened, closed or claimed — for example a “Has open ticket” role, or a “Customer” role after the first close. This is the one feature that needs the bot to have Manage Roles, and its role must sit above the roles it hands out.
Claiming
Only the claimer can unclaim.
Claiming locks actions — only the claimer and the ticket owner may close, reopen, delete or transcript.
Claims can be taken over — claiming an already-claimed ticket takes it over instead of failing.
Hide from other staff while claimed — others keep View but lose Send until unclaimed.
Move on claim — move the ticket to a category when claimed.
A regular expression. Named groups become {regex.id}.
Arguments after the trigger are split by the Args separator (default ,) into {argument.1}, {argument.2}… Inside a ticket, ticket variables like {ticket.user} work too.
Testing
The Test box at the bottom of the editor takes a message “the way a member would type it” and shows whether it matches and what the bot would answer — before you save.
Text triggers need message access./cc name always works. Matching plain messages requires the text-command mode, which reads message content — off by default. Slash usage needs nothing extra.
AutoMod
Seven protection packs installed as native Discord AutoMod rules. They run inside Discord, not inside the bot — protection your server owns, not a bot you have to trust.
The packs
Pack
Blocks
Scam
Free-Nitro, fake giveaway and wallet-drainer phrasing and domains.
Invites
Discord invite links from other servers.
Links
Link shorteners and known malicious hosts.
Explicit
Slurs and sexual content, using Discord’s own keyword presets.
Mentions
Mention spam above a sane threshold.
Spam
Discord’s spam detection preset.
Profiles
Member profile names that match the scam patterns.
Installing
Toggle packs on the AutoMod page or run /automod. Installing rules needs the bot to have Manage Server, which the standard invite does not include — re-invite with /invite?automod=1 once. Rules appear under Server Settings → AutoMod like any other, and you can edit or delete them there; removing the bot keeps them.
Statistics Pro
How your support is doing, over the last 7, 30 or 90 days.
Numbers
KPI
Meaning
Opened
Tickets opened in the period.
Closed
Tickets closed in the period.
Open now
Currently open, across all types.
First reply
Average time from open to the first staff message.
Ticket length
Average time from open to close.
Charts
Opened vs closed — a line per day.
By type — which types carry the load.
By staff — claimed and closed per team member.
Statistics are computed from Ticket Lab’s own ticket log, so they are complete from the day the bot joined — no message scanning involved.
Pro Workspace & Billing
Pro is per server, in euros, tax included. Cancel any time and keep it until the paid period ends. The free tier never loses features.
Founding price €2.99 / month, locked forever, for the first 50 servers
Max 3 servers
€9.99 / month
or €79 / year (−35%)
Everything in Pro
Up to three servers, swap any time
One invoice for all of them
Priority support in the community
1This server’s plan status.
2Monthly / Yearly toggle.
3The Founding price while it lasts.
4Get Pro / Get Max opens Stripe Checkout.
Billing
Pick a plan
On the server you want to upgrade, open Billing and press Get Pro or Get Max. Checkout is Stripe’s — cards, Apple Pay, Google Pay, SEPA where available. VAT is included in the price; add a VAT ID at checkout for a business invoice.
Pro turns on
Within seconds of payment the server is Pro: locked pages unlock, extra panels post, the bot identity applies. You land back on the Pro Workspace.
Manage it
Your subscriptions lists every plan you pay for. Cancel keeps Pro until the period ends and shows the date; Resume undoes a cancel before then. Manage billing opens the Stripe portal for invoices, receipts and cards. On Max, Servers picks which three servers are covered — swap whenever you like.
If a payment fails, Stripe retries and Ticket Lab DMs you. The server keeps Pro for a 7-day grace period; after that it returns to Free until the invoice is paid. Nothing is deleted — your settings wait for you.
Bot identity
On a Pro server, the bot wears your server’s identity: a nickname, an avatar and a banner that show only in that server. Set them under Pro Workspace → Bot identity (PNG, JPG, GIF or WebP, up to 512 KB each). It is the same bot — a different face per paying server. If the plan lapses the identity reverts to Ticket Lab’s own.
1Plan status for this server.
2On Free, See plans. On Pro, the identity editor sits here.
Commands reference
Nineteen slash commands. Admin commands need Manage Server; ticket commands work inside a ticket for staff (and some for the ticket owner).
Setup
Command
Who
What it does
/help
Everyone
What Ticket Lab is and where everything lives.
/setup
Admin
First run: the five-step wizard. After that: the config editor.
/ticketpanel [panel]
Admin
Post the default panel here, or a named extra panel.
/automod
Admin
Install protection packs as native AutoMod rules.
/un-setup
Admin
Erase all Ticket Lab configuration for this server. Asks twice.
Inside a ticket
Command
Who
What it does
/close
Staff, owner
Close this ticket.
/reopen
Staff
Reopen this closed ticket.
/delete
Staff
Delete this ticket (saves a transcript first).
/transcript
Staff
Save a transcript now.
/claim [user]
Staff
Claim it, or claim it for another team member.
/unclaim
Staff
Release the claim.
/rename name
Staff
Rename the channel.
/add target
Staff
Give a user or role access to this ticket.
/remove target
Staff
Take that access away.
/transfer type [reason]
Staff
Move the ticket to another type — new team, new category.
Anywhere
Command
Who
What it does
/new type [user] [reason]
Staff
Open a ticket, for yourself or on behalf of someone.
/tickets [user]
Staff
List open tickets, or only one member’s.
/cc name [args]
Everyone
Run a custom command. Autocompletes names.
Text commands
For teams that prefer typing: $close, $open, $reopen, $delete, $transcript, $claim, $unclaim, $rename, $add, $remove, $transfer, $new, $tickets, $ca (close all) and $closerequest. The prefix is yours to change under Configuration → Advanced. Text commands read message content, so they are off unless enabled for the bot.
FAQ & support
Short answers to the questions we get most. Everything else: the support server.
The panel did not update
Panels bake when posted. After editing types, the intro, the banner or the style, run /ticketpanel again and delete the old message.
A custom emoji shows as text
Use the full code <:name:id> (type \:name: in Discord to get it) and make sure the emoji belongs to a server the bot is in. Ticket Lab validates emoji on save and refuses anything that is not an emoji.
The bot cannot create channels
Check that its role has Manage Channels and can View the ticket category, and that the category has room (50 channels). Add overflow categories if you run hot. Re-inviting with the standard link restores the default permissions.
Roles on events do nothing
That feature needs Manage Roles, which the standard invite leaves out on purpose. Grant it to the bot’s role and move that role above the roles it should hand out.
The opener did not get a DM
Their DMs are closed for this server, or they blocked the bot. Ticket Lab skips DMs quietly and never fails a close because of it.
Closing did not rename the channel
Discord allows two channel renames per ten minutes. When rate-limited, Ticket Lab skips the rename and carries on; the ticket is still closed.
Who can see the dashboard?
Members with Manage Server, and any roles under Configuration → Dashboard roles. The dashboard only lists servers you are in, and every request is checked server-side against your Discord membership.
Data and privacy
Ticket Lab stores your configuration, ticket metadata and transcripts, and nothing else. Transcripts are yours: delete them from the dashboard any time. Billing is handled by Stripe; Ticket Lab never sees card numbers. /un-setup erases the server’s configuration.
Support
Join the Buildable Labs community on Discord — discord.gg/HSJQyGbnwa. The people who build Ticket Lab are in there. Pro and Max servers get priority.