CollabOS / Docs

Community & Discord

Tickets

What you can accomplish

Set up a member-facing support panel that opens private Discord ticket channels, routes requests to support roles, and keeps ticket history in CollabOS. Configure and publish separately: saving settings or a category emoji does not update a posted panel.

Requirements

  • Select the correct workspace and connect its Discord server. Community & Discord access, including Everything, must be active.
  • Use a workspace OWNER or ADMIN account to change ticket settings, manage categories and deploy the panel. OWNER, ADMIN, LEAD and MANAGER can review and manage tickets in the dashboard.
  • Give the bot View Channel, Send Messages and Embed Links in the panel and ticket channels, plus Read Message History for message updates and transcripts. It also needs Manage Channels for creating, moving, renaming and deleting channels, and must be able to update channel permission overwrites.
  • Choose Discord support roles and an existing Discord category for open tickets. Create these in Discord first if they do not appear in the dashboard. An archive category is optional.

Step 1: Prepare the panel message

  1. Open Discord > Messages in the selected workspace.
  2. Choose New and set Template type to Ticket Panel.
  3. Enter a template name and the member-facing message or embed explaining when to open a ticket. Save it.
  4. Use Preview to check the copy. Ticket buttons and dropdowns are generated by the Tickets feature from enabled categories; generic Message Builder controls are not ticket-creation actions.

Read: Message Builder and saved templates.

Step 2: Configure ticket settings

  1. Open Discord > Tickets, select Settings, and expand Ticket setup.
  2. Enable the ticket system and choose the saved Panel template. The enable/disable toggle saves immediately; wait for its saving state to finish. Use Save settings for the other configuration fields.
  3. Set Panel channel to the Discord text channel where members should find support.
  4. Choose Open ticket category. Optionally choose Closed ticket archive for closed channels.
  5. Under Default support roles, select the Discord roles whose members should see and manage new tickets. Review these roles carefully because they grant access to private support conversations.
  6. Set Max open / member and Cooldown minutes. These control how many active tickets a member can hold and how soon they can open another.
  7. Decide whether to enable Store transcript on close and set Transcript message limit. This captures a bounded text history when tickets close; it is not a continuous message backup.

A category-specific parent overrides Open ticket category. If category-specific staff roles have already been configured, those override the default support roles. Use Settings > Category workflows to configure each category’s support roles and workflow overrides. Empty category support roles inherit the workspace team.

Step 3: Customize the private ticket experience

  1. Edit Ticket welcome message to explain what the requester should provide, such as a description and screenshots.
  2. Set Ticket channel name, for example support-{username}, and Ticket channel topic, for example Private support ticket · Ticket #{ticketNumber}.
  3. Use the supported placeholders: {ticketNumber}, {userMention}, {username}, {serverName} and {categoryName}. These single-brace placeholders belong to ticket welcome/name/topic settings; Message Builder variables use double braces instead.
  4. Keep names short and recognizable. Discord channel names are normalized and limited to 100 characters; topics allow up to 1,024 characters and the configured welcome message allows 2,000. New tickets display the substituted welcome text inside a violet-accent embed with a neutral gray Close button beneath it. Text, line breaks, mentions and emojis are preserved without a duplicate plain-text welcome. After substitutions, text exceeding Discord’s 4,096-character embed-description limit is rejected without truncation.
  5. Click Save settings and wait for confirmation. These settings affect ticket creation; they do not rewrite existing ticket conversations or automatically edit the public panel.

Step 4: Add ticket categories and optional emojis

  1. Expand Ticket categories. Enter a Name such as General Support or Partnerships.
  2. Add a Description. In a multi-category panel, the dropdown shows it within Discord's option length limit.
  3. Optionally set Emoji (optional). Use a Unicode emoji or a supported custom Discord emoji such as <:support:123456789012345678> or <a:support:123456789012345678>. The custom emoji must be available for the bot to use in Discord.
  4. Optionally choose a Discord parent category to route this ticket type to a different place. Leave it unset to use Open ticket category.
  5. Review the category preview and click Add category. Create at least one enabled category; a panel supports up to 25.
  6. To change an existing category emoji, edit its Emoji (optional) field and click Save emoji. Clear the field and save for text-only presentation.

One enabled category creates an Open category-name button. Multiple categories create a Choose a ticket category dropdown. The saved emoji appears on the corresponding entry button or dropdown option. Close, Reopen and other ticket-management controls are not customized by this setting.

Step 5: Deploy the member-facing panel

  1. Return to Ticket setup and confirm the saved Panel template, Panel channel, enabled state and support roles.
  2. Click Save settings if you changed configuration. Add category and Save emoji save category changes independently.
  3. Click Deploy panel for the first publication. CollabOS posts the panel and stores its Discord channel and message IDs.
  4. Open that channel in Discord and check the message, enabled categories and emojis. Ask a designated tester to open a ticket and verify that the intended support staff can see it.

If initial deployment reports an uncertain result, inspect the Discord channel before retrying. Do not assume an error means no message was sent.

Step 6: Update a published panel

  1. Save the changed category emoji with Save emoji, or save changed settings with Save settings. Save template changes separately in Messages.
  2. Return to Tickets. Once a published message is tracked, the action is Update panel.
  3. Click Update panel to rebuild the ticket entry button or dropdown and edit the original stored message. Saving an emoji alone never updates Discord automatically.
  4. Confirm the changed panel in Discord. Updating does not create a second entry message, modify existing ticket channels, or change existing ticket records.

Published panels keep their stored channel; the channel selector is locked after publication. If the original message is missing, inaccessible or cannot be edited, the update returns an error and does not create a replacement. Restore the bot's access if possible. There is no dashboard replacement/recovery flow for a deleted tracked ticket panel; contact your workspace administrator or support rather than repeatedly deploying or changing message IDs outside the UI.

What members experience

  1. A member clicks the entry button or selects a category in the published panel. They can also use /ticket with an optional category and reason.
  2. CollabOS checks that tickets are enabled, resolves the category and applies the member's open-ticket limit and cooldown.
  3. The bot creates a private text channel in the configured Discord category, posts the welcome message and ticket controls, and records the ticket in CollabOS.
  4. The creator explains the issue in that channel. The creator and configured support roles receive access; Discord administrators can still have access through their Discord permissions.

Configure up to five opening questions under Settings > Category workflows. Questions can be required or optional and short or long answers. The panel and /ticket show a Discord modal before creation when questions are configured. Answers appear in a separate ticket embed and are preserved in HTML transcripts.

How staff manage tickets

  1. Open the ticket channel in Discord or select the ticket in Discord > Tickets > Inbox to review its details, participants and event history.
  2. In Discord, use Claim to take responsibility and Unclaim to release the assignment. The selected-ticket workflow card in the dashboard also exposes Claim and Unclaim. These controls require ticket staff access or Manage Channels; claiming is not a slash command.
  3. Authorized staff can add or remove participants using /ticket-add and /ticket-remove in the ticket channel. The dashboard also provides participant controls. Reopen a closed ticket before changing participants.
  4. Use Close or /close (or the existing /ticket-close), optionally providing a reason. The creator or authorized ticket staff can close a ticket. Closing keeps the channel but makes requester/participant access read-only; staff access remains governed by its permissions.
  5. Authorized staff can use Reopen or /ticket-reopen to restore participant messaging and return the channel to its original parent. Reopening clears the previous claim.
  6. Delete only after closure. Delete Ticket or /ticket-delete asks for explicit confirmation and permanently deletes the Discord channel and the CollabOS ticket record. The creator or authorized ticket staff can delete a closed ticket.

To ask before closing, authorized ticket staff can run /close action:request in the open ticket channel. Brainer mentions only the ticket creator above an embed using the ticket panel color, with gray 🔒 Accept & Close and 🔓 Deny & Keep Open buttons. Only the creator can answer. Accept closes through the normal ticket lifecycle; deny keeps it open. Answered buttons are disabled. Repeated requests reuse a pending request without another ping. No response keeps the ticket open, and an old request cannot close a reopened ticket.

After closing, Brainer posts one lifecycle message at the bottom of the conversation: a compact yellow-accent closure status identifying who closed it, a separate neutral Support team ticket controls section, and gray 📑 Transcript, 🔓 Reopen and 🗑️ Delete buttons. Older controls are retired and stale interactions are rejected. Reopening updates that lifecycle message to the open state with a gray 🔒 Close button; it does not post a second reopening control message. Retry protections prevent duplicate closure control messages.

On close, the bot attempts to prefix the channel name with closed-; on reopen it attempts to restore the saved name. A rename failure alone does not mean closure or reopening failed. Check the ticket status and controls.

Category workflows and button customization

Open Settings > Category workflows. All workflow disclosure cards are collapsed by default. Set workspace defaults, then leave categories inheriting or configure their own opening questions, support roles, transcript destinations, buttons and automation. One panel continues to serve all categories. Saving button settings affects newly generated or refreshed controls; it does not immediately rewrite every existing Discord message. Labels, emojis and native Discord button colors are configurable; actions and authorization checks are fixed.

Ticket automation

Automation is off until configured. Category settings control inactivity minutes, the response period, closed-ticket retention minutes and what happens when the creator leaves. A zero inactivity or retention value disables that stage. Inactivity requests mention the creator once and show the automatic-close deadline. A creator reply or Deny & Keep Open cancels pending automatic closure and restarts inactivity. Accept & Close uses the standard close lifecycle. Staff replies reset inactivity discovery; scheduled manual actions require explicit cancellation. No response closes after the response period; configured retention then schedules deletion. Reopening invalidates old requests and cancels pending deletion.

Authorized staff can use /ticket-automation status, pause, resume, schedule and cancel inside the ticket. Times are minutes. Status includes action IDs and scheduled times. Pause can have a duration; resume cancels old pending work and starts fresh inactivity/retention timers. Schedule supports reminder, request, close and delete. Manual actions remain scheduled when users reply; reopening invalidates actions from the earlier lifecycle. Delete requires a closed ticket and explicit confirmation. The dashboard selected-ticket card exposes these controls and a deletion confirmation dialog.

Jobs persist in the database and are checked about once a minute. Failed actions are shown in status; fix permissions or transcript delivery before scheduling again. After an interrupted outbound message, inspect Discord before rescheduling to avoid another ping. Configuration changes affect future activity; use status/cancel/resume to manage existing scheduled work.

Escalation

Authorized staff can transfer an open ticket using the selected-ticket workflow card or /ticket-escalate category:<category name or ID>. Use the category name shown in Settings, or its ID. The transfer updates the Discord parent and support-role access, keeps participants, clears assignment, records an event and starts the destination category’s inactivity timer. Discord administrators can retain access through server permissions.

Analytics

Use the Analytics tab and choose creation-date range (UTC) and category. Counts include open, closed and deleted tickets with preserved archives. First-response time measures the first observed configured staff reply; resolution uses the latest closure. Tracking begins after this update, so older tickets can have missing response measurements. Staff workload reflects current/final assignments rather than every historical claim.

HTML transcript preservation and delivery

Use the Transcripts tab to download the latest 100 preserved captures, including those whose channels were deleted. Downloads use HTML when available, with plain-text fallback for legacy or text-only captures. Opening answers, metadata, authors, timestamps, message text, embed text and attachment URLs are included. Attachments of supported image/text/PDF types are copied into the HTML when available: up to 1 MB per file, 5 MB per ticket and the first 20 attachment URLs. Files outside these limits stay as Discord links and may expire. A capture can be truncated by the configured message cap; its archive labels this explicitly. This is not an unlimited backup.

Configure a staff transcript channel and optional creator DM under Category workflows. Google Drive uses the Google connection of the staff member saving the workflow: Connect Google, Create Drive folder, then Save workflow settings. App-created folders work with the existing drive.file permission; an arbitrary folder ID may be inaccessible. Channel/Drive failures block deletion until resolved. Closed DMs are recorded but do not prevent preservation in CollabOS. Use Preserve transcript on the selected ticket to retry delivery. Reopening/closing again creates a fresh capture when needed.

Every deletion path attempts transcript preservation before removing the Discord channel, even when routine capture-on-close is off. No automated deletion proceeds without that archive. A stored archive survives deletion; access remains restricted to workspace staff. A successfully sent copy may still be duplicated after a crash between provider acceptance and recording delivery, so inspect destinations before manually retrying an uncertain operation.

Transcript retention and permanent removal

In Settings > Category workflows > Transcript preservation and delivery, choose Transcript retention in CollabOS. Options are 30, 60, 90, 180 or 365 days, or Keep indefinitely. New captures default to 90 days unless a workspace/category policy explicitly chooses another option. Keep indefinitely is an explicit choice; it has no expiration date. Each capture stores its own policy and scheduled expiration. Changing workflow settings affects future captures only, not archives already stored.

Existing captures from before retention was introduced have no assigned policy and are protected from automatic cleanup. This includes old text captures subsequently rendered as HTML. To adopt a policy for those older records, an OWNER or ADMIN must use Transcripts > Adopt retention for existing archives, review the count and period, and explicitly confirm. This applies to previously unassigned records in the preview, including captures older than the latest 100 displayed. Their full retention window starts on adoption, so no older archive immediately expires. It does not replace policies already assigned to other captures or change the default for new ones.

The Transcripts tab shows archive creation date, its saved retention period, assigned date and scheduled expiration. Protected older records and explicit indefinite retention are labeled separately. Pausing ticket automation does not pause archive retention. Expiration is the earliest cleanup eligibility time; cleanup uses the existing minute-based scheduler in bounded batches. Captures linked to open, claimed, creating or deleting tickets are protected until the ticket becomes inactive. Cleanup permanently removes only the selected expired transcript record and its raw text, HTML, snapshot, delivery metadata and embedded attachment copies. It never removes a ticket conversation, Discord channel or unrelated workspace record. Other independently captured archive versions keep their own policies.

OWNER and ADMIN members can also use Delete archive on an inactive or detached capture. The confirmation warns that this permanent removal cannot be undone. The ticket channel is unaffected, and ordinary ticket participants cannot use this operation. Staff archive-reading permissions are unchanged. Deleting a ticket channel still leaves its transcript available until that archive expires or an administrator explicitly deletes it.

Removal from CollabOS does not revoke or remove external copies already delivered to a Discord channel, a creator’s DMs or Google Drive. Communities must manage those copies separately. A future explicit preservation or ticket lifecycle capture can create a new archive from a Discord channel that still exists; that new capture receives the then-current retention policy.

Transcripts, archives and privacy

Enable Store transcript on close before closing tickets whose text you need to retain. CollabOS attempts to capture recent messages up to Transcript message limit and stores the result with the closed ticket. Select the ticket and read Latest transcript to see the capture time, message count, text and any truncation warning.

In Discord, configured ticket staff and members with Manage Channels or Administrator permission can click Transcript on the current closed-ticket controls. Brainer privately attaches the latest stored text as ticket-<number>-transcript.txt. The download preserves recorded ordering, authors, timestamps and content; any truncation is explained in the private response. The creator or an added participant does not gain transcript-download permission solely through that relationship. Clicking Transcript does not recapture messages or change ticket state. Missing or disabled capture receives a private explanation. A previously stored transcript remains available if future capture is disabled; files exceeding Discord’s attachment limit must be retrieved through the dashboard.

Transcript capture can fail independently of closure, so verify the stored transcript before relying on it. Stored text can include attachment URLs; these are not copied attachment files. The dashboard retains raw text and provides HTML archives in the Transcripts tab. Discord’s Transcript button downloads HTML when available, with text fallback for legacy captures. Reopening and closing again can produce a newer transcript.

Closed ticket archive moves the existing Discord channel to the configured category. It does not move transcript storage out of CollabOS. Ticket-channel deletion preserves transcript records and their ticket snapshots. Stored ticket events and participants are removed with the ticket record. Copy any required records through your approved process before confirming deletion, and limit staff access according to your privacy policy.

Troubleshooting

  • No template available: save a Ticket Panel template in Messages in the same workspace. Other template types are not accepted.
  • No categories or empty panel: add at least one enabled category; keep the enabled count at 25 or fewer.
  • Emoji saved but unchanged in Discord: click Save emoji, then Update panel. Check the custom emoji's ID and bot availability if Discord rejects it.
  • Panel cannot be updated: verify the stored message still exists and the bot can view the channel, read its history and edit its own message. No replacement is posted on failure.
  • Ticket cannot open: check Enabled, the chosen parent category, bot channel-management/permission-overwrite access, the member's open-ticket count and cooldown.
  • Support staff cannot see a ticket: check Default support roles and any existing category-specific override. Changing defaults is not a bulk permissions update for existing channels.
  • Transcript missing: confirm Store transcript was enabled when the ticket closed and the bot could read the channel history. Review Latest transcript before deleting.
  • A command is denied: server membership, workspace/product access and command-specific ticket authorization still apply. A command appearing in Discord does not grant staff privileges.

Settings and command reference

Community & Discord includes a persistent support-ticket system.

Ticket configuration can include:

  • enabled or disabled state
  • ticket-panel channel
  • saved TICKET_PANEL Message Builder template
  • quick ticket-panel message
  • open-ticket Discord category
  • optional archive category
  • default support roles
  • maximum open tickets per member
  • ticket creation cooldown
  • configurable ticket categories, optional emojis and routing

Ticket lifecycle

Tickets can be:

  • created
  • opened
  • claimed
  • closed
  • reopened

The system stores ticket records, participants, event history, assignment state, and transcript data where transcript capture is enabled.

Discord commands

/setup-tickets Configures the ticket system and can deploy a customer-built ticket panel.

/ticket Opens a private support ticket with an optional category and reason.

Ticket claim controls Use the ticket’s Claim / Unclaim buttons. Claiming is a button action, not a slash command.

/ticket-close Closes the current ticket with an optional reason.

/ticket-reopen Reopens the current ticket.

/ticket-add Adds a member to the current ticket.

/ticket-remove Removes a participant from the current ticket.

/ticket-delete Use inside a closed ticket to permanently delete its Discord channel after confirmation. The ticket creator or authorized ticket staff can confirm deletion. Copy any records required by your retention policy before deleting; stored ticket data is removed with the ticket.

Ticket transcripts can contain Discord message content. Communities should configure and retain ticket data according to their own privacy and operational requirements.