Ticket Panel Configuration
This page provides a comprehensive reference for all ticket panel configuration options available through the Dungeon Hub Dashboard.
General Settings
name
Type: String (required)
Description: Internal identifier for the ticket panel. Used in channel naming templates via {panel.name} and for internal reference.
Example: "support", "carry-orders", "bug-reports"
displayName
Type: String (optional)
Description: User-visible name displayed on the ticket creation button. If not set, the name field is used instead.
Example: "Support Tickets", "Order a Carry"
emoji
Type: String (optional)
Description: Emoji displayed on the ticket creation button. Supports Unicode emoji (e.g., "🎫") and Discord custom emoji format (e.g., "<:custom:123456789>").
Example: "🎫", "📝", "<:ticket:987654321>"
requiresLinking
Type: Boolean (default: false)
Description: When enabled, users must have a linked Minecraft account (via /link) before they can create a ticket. Useful for carry service tickets where verification is required.
Example: true for carry tickets, false for general support
Ticket Logic
closeable
Type: Boolean (default: false)
Description: Determines whether tickets can be closed. When false, tickets can only be deleted (permanent removal). When true, tickets can be moved to a Closed state and potentially reopened later.
Example: true for support tickets, false for one-time reports
closeConfirmation
Type: Boolean (default: false)
Description: When enabled, closing a ticket requires confirmation via a button interaction. Prevents accidental closures.
Example: true for important tickets, false for quick workflows
claimable
Type: Boolean (default: false)
Description: Enables the ticket claiming system. When true, support staff can click a "Claim" button to take ownership of a ticket, updating the channel name and permissions.
Example: true for busy support channels to assign responsibility
ticketMessage
Type: JSON String (optional)
Description: The message sent to the ticket channel immediately after creation. Supports Discord message JSON format with content, embeds, and buttons fields. Placeholders are supported (see Ticket Placeholders).
Default:
Example with embed:
Channel Naming Templates
All channel naming templates support placeholders. See Ticket Placeholders for a complete list.
openChannelName
Type: String (optional)
Description: Template for naming the channel when a ticket is first created (state: Open). If not set, Discord generates a default name.
Default: "{panel.name}-{ticket.count}"
Example: "ticket-{ticket.count}", "{user.name}-support", "carry-{ticket.form.1}"
claimedChannelName
Type: String (optional)
Description: Template for renaming the channel when a support staff member claims the ticket. If not set, the channel name remains unchanged when claimed.
Example: "{panel.name}-{ticket.count}-claimed", "{claimer.name}-{user.name}"
closedChannelName
Type: String (optional)
Description: Template for renaming the channel when a ticket is closed (state: Closed). If not set, the channel name remains unchanged when closed.
Example: "closed-{panel.name}-{ticket.count}", "archived-{ticket.count}"
Transcript Configuration
Transcripts capture the complete message history of a ticket in HTML format and upload it to a CDN.
transcriptChannel
Type: Discord Channel ID (optional)
Description: The channel where transcript messages are posted when closeTranscriptTarget or deleteTranscriptTarget is set to TranscriptChannel or Both. This is a Discord snowflake ID (64-bit integer).
Example: 1234567890123456789
closeTranscriptTarget
Type: Enum (default: None)
Description: Controls where transcripts are sent when a ticket is closed.
Valid values:
None- No transcript generated on closeUser- Transcript sent via DM to the ticket creator onlyTranscriptChannel- Transcript posted intranscriptChannelonlyBoth- Transcript sent to both user DM and transcript channel
deleteTranscriptTarget
Type: Enum (default: None)
Description: Controls where transcripts are sent when a ticket is deleted.
Valid values:
None- No transcript generated on deleteUser- Transcript sent via DM to the ticket creator onlyTranscriptChannel- Transcript posted intranscriptChannelonlyBoth- Transcript sent to both user DM and transcript channel
userTranscriptDm
Type: JSON (optional)
Description: Configuration for the DM message sent to users when a transcript is delivered. This field accepts embeds that will be sent to the user. Supports placeholders including {transcript.url}.
Default: ["transcript"]
Format options:
Array of predefined embed types (strings):
"transcript"- Uses the built-in transcript embed with ticket information
Single embed object (JSON object with Discord embed fields):
{ "title": "Ticket Closed", "description": "View transcript: {transcript.url}", "color": 3447003 }Array of embed objects:
[ { "title": "Ticket Closed", "description": "Your {panel.name} ticket has been closed.", "color": 5763719 }, { "title": "Transcript", "description": "View the full conversation: {transcript.url}", "color": 3447003 } ]
Examples:
Default behavior - sends a built-in embed with ticket details and transcript link.
Custom embed with placeholders.
Sends the default transcript message, but attaches another custom embed asking the user to review the service.
Access Control
supportRoles
Type: Comma-separated Role IDs (optional)
Description: Discord role IDs for support staff who can access all tickets. Members with these roles can view, respond to, claim, close, and delete tickets. Each ID is a Discord snowflake (64-bit integer).
Format: Comma-separated list
Example: 1234567890123456789 (single role), 111111111,222222222 (multiple roles)
additionalRoles
Type: Comma-separated Role IDs (optional)
Description: Additional Discord role IDs that should have access to tickets. Similar to supportRoles but semantically separate for organizational purposes (e.g., moderators vs. administrators). Each ID is a Discord snowflake (64-bit integer).
Format: Comma-separated list
openCategories
Type: Comma-separated Category IDs (optional)
Description: Discord category IDs where open tickets should be placed. If multiple categories are provided, the bot selects one (typically the least full category). Each ID is a Discord snowflake (64-bit integer).
Format: Comma-separated list
Example: 1234567890123456789
closedCategories
Type: Comma-separated Category IDs (optional)
Description: Discord category IDs where closed tickets should be moved. If not set, closed tickets remain in their current category. Each ID is a Discord snowflake (64-bit integer).
Format: Comma-separated list
Permission Structure
Ticket channel permissions are controlled by five permission candidates:
Candidate | Description | Applied When |
|---|---|---|
SupportTeam | Members with | Always applied, except when ticket is claimed (then only TicketClaimer has support permissions) |
AdditionalRoles | Members with | Always applied |
TicketCreator | The user who created the ticket | Applied when ticket state is |
TicketClaimer | The staff member who claimed the ticket | Applied when ticket is claimed; removed on unclaim |
Everyone | The | Always applied (VIEW_CHANNEL denied by default) |
Permission Flags (currently hardcoded, not configurable via dashboard):
@everyonerole: Denied VIEW_CHANNEL (flag"1024")All authorized users: Allowed VIEW_CHANNEL, SEND_MESSAGES, READ_MESSAGE_HISTORY (flag
"68608")
Permission Changes by State:
Creating → Open: Creator gains access, support roles applied
Open → Closed: Creator loses access, support roles maintain access
Closed → Open: Creator regains access
Any → Deleted: Channel deleted (all permissions removed)
Carry System Integration
relatedCarryTier
Type: Carry Tier ID String (optional)
Description: Links the ticket panel to a specific carry tier. When set, the following features are enabled:
The /log command becomes available within tickets, allowing staff to log completed carries directly from the ticket
Carry tier data is accessible for validation and display
The tier name can be referenced via
{carry-tier.name}placeholder
Example: "abc123-tier-id" (obtained from the dashboard carry tier list)
Use case: Enable this for ticket panels dedicated to carry service orders
relatedCarryDifficulty
Type: Carry Difficulty ID String (optional, requires relatedCarryTier)
Description: Further specifies which difficulty within the carry tier this ticket panel represents. When set:
Visible carry price embeds are automatically displayed in tickets, showing the current pricing for this specific difficulty
The difficulty name can be referenced via
{carry-difficulty.name}placeholderHelps organize multiple ticket panels for the same carry tier but different difficulties (e.g., "Normal Carries", "Master Carries")
Example: "def456-difficulty-id"
Use case: Create separate ticket panels for different carry difficulties (e.g., F7 Normal vs. F7 Master)
Custom Forms
Forms are displayed as Discord modals when users click the ticket creation button. Up to 5 form questions are supported per ticket panel.
formQuestions
Type: JSON Array (optional)
Description: Array of form question objects that users must complete before a ticket is created. Each question has a type and data field.
Question Types:
1. Predefined
Built-in form questions provided by the bot.
Available predefined questions:
ign-display- Displays the user's linked Minecraft IGN (read-only)carry-difficulty- Dropdown to select from available difficulties for the linkedrelatedCarryTiercarry-amount- Text input for the number of carries requested
Example:
2. TextInput
Custom text input fields (short text or paragraph).
Data structure:
Example:
3. StringSelect
Dropdown selection from predefined options.
Data structure:
Example:
4. TextDisplay
Information text displayed to the user (no input required).
Data structure:
Example:
Complete Form Example
Accessing Form Responses
Form responses can be referenced in messages and channel names using placeholders:
{ticket.form.1}- Response to the first form question{ticket.form.2}- Response to the second form question{ticket.form.3}through{ticket.form.5}- Responses to subsequent questions
Default Configuration Values
When creating a new ticket panel, the following defaults are applied:
Validation & Constraints
JSON Fields:
ticketMessage,userTranscriptDm, andformQuestionsmust be valid JSON. The dashboard validates JSON syntax before saving.ID Fields: Role IDs, category IDs, and channel IDs must be valid Discord snowflake IDs (64-bit integers).
Form Limits: Maximum 5 form questions per ticket panel.
Enum Values:
closeTranscriptTargetanddeleteTranscriptTargetmust be one of:None,User,TranscriptChannel,Both.
See Also
Ticket System - Feature overview and ticket lifecycle
Ticket Placeholders - Complete placeholder reference for templates
Server Properties - Configure server-wide settings like
TRANSCRIPTS_CHANNEL