Ticket Lab Docs

Getting started

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

  1. 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. The same screen signs you in, so after Add you land on the dashboard for the server you just added, and the bot adds you to the Buildable Labs community, where support and updates live. You also get a short DM with the next step.

  2. 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.

  3. 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.

  4. 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.

The dashboard server list
  1. 1Manage opens that server’s workspace.
  2. 2Refresh re-reads your servers from Discord.
  3. 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.

The dashboard workspace on the Configuration page
  1. 1Go back returns to the server list.
  2. 2Search settings jumps to any row on any page.
  3. 3Pages are grouped: Setup, Messaging, Automation, Activity, Lab.
  4. 4The server you are editing, always visible.
  5. 5A card — its rows save together with the button at the bottom.

The pages

GroupPageWhat lives there
SetupConfigurationRoles, categories, lifecycle switches, limits, naming, logging, advanced, backups.
Ticket typesLive inside Panels: what members pick, each type’s own role, category, open message and form.
PanelsThe message members open tickets from. Style, mode, intro, banner, live preview.
MessagingMessagesFourteen messages the bot sends, with embeds and variables.
ButtonsLabel, emoji, colour and role rules for every ticket button.
Join & leave ProWelcome and goodbye messages in your panel style, with a DM, member count and account age.
AutomationAutomations ProInactivity, missing owner, opening hours, DMs, roles on events, claiming rules.
Custom commandsYour own /cc commands and text triggers.
AutoModSeven protection packs installed as native Discord AutoMod rules.
ActivityTicketsOpen and closed tickets, with Close, Reopen, Transcript and Delete from the browser.
TranscriptsEvery archived ticket, readable in the browser.
Statistics ProOpened vs closed, response times, by type, by staff.
LabApplicationsIn development. Staff applications with the same panel DNA.
Pro WorkspacePlan status, the bot’s custom identity and the watermark switch for this server.
BillingPlans, 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

RowMeaning
Staff roleThe support team. Sees every ticket, gets every ticket permission and is pinged on open.
More staff rolesAdditional roles with the same powers as the staff role.
Observer rolesCan read tickets but cannot send. Good for trainees and auditors.
Dashboard rolesMay use this dashboard without Manage Server.
Blacklisted rolesCannot open tickets or use ticket buttons.
Bypass rolesExempt 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

SwitchDefaultWhat it does
Two-step ticketsOnClose puts the ticket in a closed state with Reopen / Delete / Transcript. Off: Close deletes right away, saving a transcript first.
Confirm before closingOnClose asks “are you sure?” first.
Pin the ticket messageOffThe welcome message is pinned when a ticket opens.
Claim buttonOnStaff can claim tickets so everyone sees who is on it. Claiming rules live under Automations.
DM transcriptsOnA copy of every transcript goes to whoever opened the ticket.
Ping staff on openOnMention 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.

TemplateDefaultNote
Open tickets{count}-{type}Try {count}-{ticket.user.name} or {type}-{ticket.user.name}.
When closedclosed-{count}Skipped quietly if Discord rate-limits renames (two per ten minutes per channel).
When claimedemptyLeave empty to keep the name. Reverts on unclaim.
Number padding44 → 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 key Pro — 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

Where: Dashboard → Panels → pick a panel → Ticket types on this panel. Types belong to a panel; move one from its Panel field.

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.

A ticket type expanded on the Ticket types page
  1. 1How many of the 25 types you use.
  2. 2Emoji — unicode or a custom <:name:id>.
  3. 3Which panel lists this type.
  4. 4Remove a type. Existing tickets are unaffected.

Fields

FieldWhat it does
NameShown on the panel and as {type.name}. Up to 80 characters.
EmojiAny unicode emoji, or a custom server emoji as <:name:id> (animated: <a:name:id>). Get the code by typing \:emojiname: in Discord. Decorative symbols and plain text are not emoji: the dashboard refuses them, and /setup keeps the type but drops the chip.
DescriptionThe grey line under the name in the dropdown. Up to 100 characters.
Staff roleThis type’s team. Empty = the server staff role.
CategoryWhere this type’s tickets open. Empty = the server category.
Ticket modeChannel or private thread. Empty = the server default.
PanelWhich panel shows this type. Extra panels are Pro.
Ticket messageOverrides 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.

A form modal in Discord before a ticket opens
  1. 1The form title (up to 45 characters).
  2. 2A required paragraph question.
  3. 3An optional short question.
  4. 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).

Applications

Staff applications that live where your tickets already do. Members answer in a form inside Discord — no DMs to miss, nothing to leave the server for — and every submission lands in a review channel with Accept and Deny. A decision applies roles and DMs the applicant. Pro

How it fits together

  1. You build a form: a name, your questions, where submissions land, and which roles a decision grants or removes.
  2. You post the apply panel — one button per form.
  3. A member presses a button and answers in a modal. Discord shows 5 questions per page, so longer forms run across pages.
  4. The submission posts as a review card. Staff press Accept or Deny.
  5. Roles are applied, the applicant gets a DM, and the card is stamped with who decided and when.
The Applications page on the dashboard, with the form list and the form editor
  1. 1Three pages: Forms, Submissions and the Panel.
  2. 2Every form you have. The dot shows whether it is open.
  3. 3New form starts another one.
  4. 4The form you picked opens here.
  5. 5Review channel — where this form’s cards are posted.

Building a form

Name is what members see on the panel button. The key is generated from it once and cannot change later — it is baked into the button, so a rename keeps the old key. Description is the one line under the name.

Open for applications is the switch: off hides the form from the panel and refuses new submissions, without deleting anything. Use it to close intake for a week instead of rebuilding the form later.

Questions

Up to 20 questions. Each one has a label, an optional placeholder, and a length range in characters — Discord allows up to 1000 per answer. Mark a question required or leave it optional, and choose short or paragraph.

Discord modals hold five inputs, so a form with more than five questions is split into pages automatically and the applicant presses Continue between them. The editor tells you how many pages a form currently has. An unfinished form is dropped after 20 minutes.

Roles

  • Required roles — the member must hold them to apply.
  • Blocked roles — holding one stops them applying.
  • Accepted roles / Denied roles — granted when the decision is made.
  • Removal roles — taken away on accept or on deny. Use this to strip an “Applicant” role once they are through.
  • Ping roles — mentioned on every new submission, so your team sees it.

Ticket Lab can only manage roles below its own in the role list. If a grant silently does nothing, that is almost always why.

Rules

Cooldown is how long after a decision the same person may apply again; 0 means no cooldown. One open application per person stops a second submission while one is still pending.

The agreement is a short confirmation shown before the form is submitted. What they agreed to is stored alongside the answers, so you have a record.

Reviewing

Every submission posts a card in the form’s review channel with the answers and your ping roles. Accept decides immediately; Deny opens a box for an optional note, which is included in the applicant’s DM. Only staff can press either button — the same staff roles your tickets use.

Once decided, the card is stamped with the outcome, the reviewer and the time, and the buttons come off. A decision cannot be taken back from the card, and the same submission can never be decided twice.

The Submissions page with its outcome filters
  1. 1Filter by outcome — pending, accepted, denied, or all.
  2. 2Or narrow to a single form.

The Submissions page is the same decision, from the dashboard: newest first, filterable, and deciding here does exactly what the buttons do — roles, DM, and the card updates in Discord.

The apply panel

One panel per server. Tick the forms that should get a button and post it. Disabled forms are skipped, and past ten forms the buttons become a dropdown.

The apply panel editor
  1. 1Title and intro. {server} becomes the server name.
  2. 2The channel the panel is posted in.
  3. 3Post panel publishes it — and edits the existing message when it can.

Posting bakes the current forms into the message. After you edit a form, post again to refresh it; Ticket Lab edits the same message rather than leaving a second panel behind.

If something looks wrong

  • No review card appeared. The submission is never lost — it is stored and shows on the Submissions page. Check the form has a review channel, and that Ticket Lab can see it and post embeds there.
  • A role was not granted. Ticket Lab’s own role must sit above the role it is handing out.
  • The applicant got no DM. They have DMs from server members turned off. The decision still stands.
  • The button says the form timed out. A part-finished form expires after 20 minutes; press apply again.
  • Applications is locked. It needs Pro or Max on that server.

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>.

The Panels editor
  1. 1Your panels. The default one is always there.
  2. 2Style: Ticket Lab, Classic embed or Plain text.
  3. 3Dropdown or one button per type.
  4. 4Banner on or off.
  5. 5Your own banner URL. Empty = the cosmic banner.
  6. 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.

A Ticket Lab panel in Discord with a custom banner
  1. 1A custom banner from a URL.
  2. 2The intro — markdown and variables work.
  3. 3One line per type, with its emoji (custom emoji work too).
  4. 4The dropdown members open tickets from.
The panel dropdown open in Discord
  1. 1A type with a custom server emoji.
  2. 2A type with a unicode emoji and its description.

Posting and updating

  1. Edit and save

    Change anything in the editor and press Save panel. The live preview on the right shows exactly what Discord will get.

  2. 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.

The Messages editor
  1. 1The fourteen messages.
  2. 2{ } opens the variable picker and inserts at the cursor.
  3. 3Add embed — up to ten per message.
  4. 4A live preview with sample values.
  5. 5Reset to default when you want the built-in text back.

The messages

MessageWhen it is sent
Ticket messagePosted inside every new ticket, with the Claim and Close buttons.
Close confirmationAsked when someone presses Close (Confirm before closing on).
ClosedPosted when a ticket enters the closed state, with Reopen / Delete / Transcript.
ReopenedPosted when a closed ticket is reopened.
DeletedPosted right before the channel is deleted.
Claimed / UnclaimedPosted when staff claims the ticket or releases the claim.
TranscriptPosted with the transcript in the ticket and the log channel.
TransferredPosted when a ticket moves to another type.
DM on open / DM on closeSent to the opener when their ticket opens, and when it closes (with the transcript).
Outside hoursShown when someone opens a ticket outside the schedule Pro.
Inactivity warningPosted 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.

GroupVariables
Server{server.name} {server.id} {server.icon}
Ticket{ticket} {ticket.id} {channel.name} {channel.id} {count} {type} {type.name} {panel.name} {reason}
Ticket owner{ticket.user} {ticket.user.name} {ticket.user.id} {ticket.user.nickname} {ticket.user.tag} {ticket.user.icon}
Who acted{user} {user.name} {user.id} {user.nickname} {user.tag} {claim.user} {claim.user.name}
Form answers{form.1} … {form.5}
Time{time} {time.created} {time.closed} {time.claimed} {time.created.age} {time.closed.age}
Roblox Pro{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.

ModifierExampleResult
?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

ButtonWhereDefault
ClaimTicket messageGrey. Staff only.
CloseTicket messageRed. Staff and the ticket owner.
Confirm / CancelClose confirmationRed / grey.
ReopenClosed messageGreen. Staff.
DeleteClosed messageRed. Staff.
TranscriptClosed messageGrey. 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.

A freshly opened ticket in Discord
  1. 1Channel named from the template — 0008-audit-support.
  2. 2The opener and the staff role are pinged.
  3. 3Form answers shown as fields.
  4. 4Claim — staff take ownership.
  5. 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.

Close reasons. /close reason: and $close <reason> attach a reason to the close. It shows in the closed message, in the DM to whoever opened the ticket (with the transcript when one is sent), in the log line, and as {close.reason} in your templates. Turn on Require a close reason under Configuration → Lifecycle and the Close button asks for one in a small form before closing; submitting the form counts as the confirmation.

A ticket in the closed state
  1. 1Renamed to closed-0008.
  2. 2Reopen — back to open, opener regains Send.
  3. 3Delete — saves a transcript, deletes the channel after five seconds.
  4. 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.

The Transcripts page
  1. 1Ticket name, type, message count, when, and how long it was open.
  2. 2Open — the hosted HTML transcript, same link the opener got.
  3. 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.

Join & leave Pro

A welcome when a member arrives and a goodbye when they go — dressed like your panels, in their own channel, with their own wording. Part of Pro.

The Join & leave page on a Pro server
  1. 1Post a welcome — the switch for the whole welcome.
  2. 2Channel — where it lands; the goodbye has its own.
  3. 3Message — leave it empty for our line, or write yours with variables.
  4. 4Send a test — saves what is on screen and posts the real thing, built around you.
  5. 5Pro — on a Free server the page shows the plans instead.

Welcome

Switch on Post a welcome, pick a channel, keep the built-in line or write your own. Bots never trigger it. In the Ticket Lab style the welcome carries your banner (the panel banner by default, or a custom https image), the member’s avatar, your text, a facts line and the Ticket Lab footer.

Message, embed, or both

Under each message box sits the same embed builder the Messages page uses: author (name, link, icon), title and title link, description with Markdown and variables, colour, up to 25 fields, a large image, a thumbnail, a footer with icon, and a timestamp. Add one or more embeds and switch the Style to Classic embed or Plain text; keep text in the box above as well and both go out together — the classic “mention on top, embed underneath”. A preview under the builder shows exactly what posts. The Ticket Lab style is a Components V2 card, so it keeps your text and the Look settings below instead of custom embeds.

The welcome embed builder with its live preview
  1. 1Title — variables work, e.g. Welcome to {server}.
  2. 2Description — Markdown, channel links and variables.
  3. 3Colour — the stripe.
  4. 4Images and Footer — thumbnail, large image, footer text and icon, timestamp.
  5. 5Preview — the mention from the text box on top, the embed underneath, exactly as Discord shows it.
  6. 6Send a test — posts it for real, built around you.

And here is that exact build arriving in Discord — the mention on top, the embed underneath:

The welcome embed as posted in Discord
  1. 1The text box’s {user} — the one ping a template can produce.
  2. 2Title with {server} rendered.
  3. 3Thumbnail — your logo, or the member’s avatar.
  4. 4Image — your own, or the Ticket Lab banner.
  5. 5Footer with {memberCount} rendered.

Goodbye

Same controls, its own channel and its own message. A goodbye never carries the banner — it stays quiet on purpose.

Welcome DM

Optionally send the new member a direct message as well. Skipped silently when their DMs are closed. A good place for “open a ticket if you need a hand”.

Look

  • Style — Ticket Lab (the house look, same component system as the panels), Classic embed, or Plain text.
  • Title — an optional heading per event, variables included. Accent colour — the stripe on the card or embed. Thumbnail — the member’s avatar, your server icon, a custom image, or none.
  • Banner — on or off, with an optional image URL (https, PNG/JPG/GIF; 2:1 works best).
  • Member count — “Member #1,204” on the welcome, “1,204 members now” on the goodbye.
  • Account age — “Account 3 days old” on the welcome, “Was here 2 months” on the goodbye. A brand-new account stands out at a glance.

Variables

On top of the usual set from Messages & variables, member events add their own:

VariableRenders as
{user}A mention of the member — the only ping a template can produce. @everyone and role pings never fire from here.
{username}Their name, no mention.
{avatar}Their avatar’s image URL — handy in an embed’s author icon or thumbnail field.
{server}Your server’s name.
{memberCount}The member count after this event, e.g. 1,204.
{joinedAt}The join date as a Discord timestamp; {joinedAt.age} is how long they stayed.
{account.age}How old the account is, e.g. 3 days; {account.created} is the date.

Good to know

  • Pro only. On a Free server the settings still save, nothing posts, and Send a test tells you so.
  • Raid-safe. At most twelve posts per minute per event type; a join raid is logged, not broadcast.
  • Permissions. The bot needs View Channel, Send Messages, Embed Links and Attach Files in the chosen channel. If something is missing, the owner gets one nudge, not a flood.
  • Server Members intent. Join and leave events only reach the bot with Discord’s Server Members intent. If it is ever off, the page shows a banner and the posts simply pause — nothing is lost.
  • /joinleave shows the current state with a link straight to this page.

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.

The Automations page on a Pro server
  1. 1After — hours of owner silence before anything happens (0 = off).
  2. 2Then — warn, close or delete.
  3. 3Missing user — what happens when the owner leaves.
  4. 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.

The Claim button itself is switched on and off under Configuration → Lifecycle.

Custom commands

Your own commands, answered by the bot. Each works as /cc <name> everywhere, and can also match plain messages where the bot can read them.

The Custom commands editor
  1. 1New command.
  2. 2Trigger type: strict, wildcard or regex.
  3. 3The trigger text a message must match.
  4. 4Flags: case sensitive, delete the trigger, admins only, DM the user, DM the ticket owner.
  5. 5The response — text, markdown, variables, embeds.

Triggers

TypeExample triggerMatches
Strict!rulesExactly that text.
Wildcardhow do I * my ticket* matches anything.
Regex^order (?<id>\d+)$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

PackBlocks
ScamFree-Nitro, fake giveaway and wallet-drainer phrasing and domains.
InvitesDiscord invite links from other servers.
LinksLink shorteners and known malicious hosts.
ExplicitSlurs and sexual content, using Discord’s own keyword presets.
MentionsMention spam above a sane threshold.
SpamDiscord’s spam detection preset.
ProfilesMember 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.

Alerts

Every pack also posts Discord’s own AutoMod alert when it blocks something: who, in which channel, the matched keyword and the blocked text, with a jump link. Alerts go to your AutoMod alert channel; if you have not set one, the ticket log channel is used, then the transcript channel. The bot must be able to see and post in that channel, otherwise the alert is left off. Your staff role is exempt from every pack.

Blocked members see “Blocked by Ticket Lab AutoMod. Think this is a mistake? Open a ticket and tell the team.” — so a false positive turns into a ticket, not a lost member.

Updates

When we improve a pack’s patterns, the change is pushed into the rules already installed on your server, not just new installs. Rules you edited by hand under Server Settings → AutoMod are refreshed too, so keep custom additions in your own rules rather than inside a Ticket Lab one.

Statistics Pro

How your support is doing, over the last 7, 30 or 90 days.

Numbers

KPIMeaning
OpenedTickets opened in the period.
ClosedTickets closed in the period.
Open nowCurrently open, across all types.
First replyAverage time from open to the first staff message.
Ticket lengthAverage 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.

What Pro adds

Plans

Pro per server
€4.99 / month
or €39 / year (−35%)
  • Everything above, billed per server — add more servers to one plan any time
  • 7-day free trial on Pro, card required, one per person; not on Max or on a server that already had a plan
Max per server
€9.99 / month
or €79 / year (−35%)
  • Everything in Pro
  • Billed per server, same as Pro
  • One invoice for all of them
  • Priority support in the community
The Billing page
  1. 1This server’s plan status.
  2. 2Monthly / Yearly toggle.
  3. 3The price for the interval you picked.
  4. 4Get Pro / Get Max opens Stripe Checkout.

Billing

  1. 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.

  2. 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.

  3. 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. Servers on this plan lists the servers a subscription covers: tick more to add them, untick to remove. Each server is billed; the total updates as you tick, and adding one charges only the difference for the rest of the period (removing one credits it). At least one server stays on a plan — cancel the plan if you want none.

Several servers, one invoice. You don’t need a separate plan per server: subscribe once, then add your other servers under Servers on this plan.

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.

Watermark

Every panel, ticket embed and DM the bot sends ends with Ticketing by Buildable Labs — buildablelabs.dev. On a Pro server, Pro Workspace → Watermark has a switch: turn on Use my own footer, type up to 80 characters (your server name, a slogan, a link) and save. Tickets and DMs use it straight away; panels are posted messages, so re-post yours from Panels to refresh the line. Switch it off and the Buildable Labs line comes back. If the plan lapses the line reverts on its own.

Running /setup on a Pro server also shows the plan in the config editor — the title reads Ticket Lab config editor · Pro with the renewal date.

The Pro Workspace page on a Free server
  1. 1Plan status for this server.
  2. 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

CommandWhoWhat it does
/helpEveryoneWhat Ticket Lab is and where everything lives.
/setupAdminFirst run: the five-step wizard. After that: the config editor.
/ticketpanel [panel]AdminPost the default panel here, or a named extra panel.
/automodAdminInstall protection packs as native AutoMod rules.
/joinleaveAdminWhere join & leave stands on this server, with a link to the page. Pro
/un-setupAdminErase all Ticket Lab configuration for this server. Asks twice.

Inside a ticket

CommandWhoWhat it does
/closeStaff, ownerClose this ticket.
/reopenStaffReopen this closed ticket.
/deleteStaffDelete this ticket (saves a transcript first).
/transcriptStaffSave a transcript now.
/claim [user]StaffClaim it, or claim it for another team member.
/unclaimStaffRelease the claim.
/rename nameStaffRename the channel.
/add targetStaffGive a user or role access to this ticket.
/remove targetStaffTake that access away.
/transfer type [reason]StaffMove the ticket to another type — new team, new category.

Anywhere

CommandWhoWhat it does
/new type [user] [reason]StaffOpen a ticket, for yourself or on behalf of someone.
/tickets [user]StaffList open tickets, or only one member’s.
/cc name [args]EveryoneRun 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: the dashboard refuses anything that is not an emoji, and a type added through /setup with an invalid emoji simply shows without one. A panel never fails to post because of an emoji.

The bot cannot create channels

Ticket Lab checks its own permissions before every ticket and every panel post, and the reply names exactly what is missing and where (for example “missing Manage Channels in the category Tickets”). /setup shows the same warning on the hub and on the category step. Fix it under the category’s permissions for the bot’s role, or re-invite with the standard link to restore the defaults. The category also needs room (50 channels); add overflow categories if you run hot.

Discord only lets a bot grant, inside a ticket, permissions it holds itself. If your category denies the bot Attach Files or Manage Messages, tickets still open — staff and the opener simply do not get that permission in the ticket until you grant it to the bot.

Transcripts are not showing up in the transcript channel

The bot needs View Channel, Send Messages, Embed Links and Attach Files in that channel. Since 7 September the close, delete and transcript replies say so when a transcript could not be posted (“Transcript not saved to the transcript channel: missing Attach Files in #transcripts”), and /setup shows the same warning on the transcript step. The opener still receives their DM copy either way. If the channel was deleted, pick a new one.

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.