---
title: "How to make a ticket system in Discord"
description: "Discord has no tickets, and a forum shows every post to everyone who can see it. Bond adds a button that opens a private thread with your team."
canonical_url: "https://www.bondbot.gg/use-cases/ticket-system"
last_updated: "2026-10-05"
---

# How to make a ticket system in Discord

Discord has no ticket feature, and the closest thing without a bot is a support forum, where every post is visible to everyone who can see the forum. With Bond you ask in one message and it installs a Tickets panel, a button that opens a private thread for the member and your support team, with a close button and a summary in a staff-only log.

Verified 2026-09-28 on a test server, build 51b06c8.

## In Discord, without a bot

Discord has no tickets. The nearest built-in shape is a forum channel, where each question is its own post.

1. Right-click the channel list, **Create Channel**, choose **Forum**, and name it support.
2. In **Edit Channel**, **Permissions**, let @everyone **View Channel**, **Create Posts** and **Send Messages in Posts**.
3. Under the forum's **Tags**, add tags such as Open and Solved, so staff can filter what still needs an answer.
4. Staff answer in each post, tag it Solved, and close it from the post's menu.

A forum post is public to everyone who can see the forum, so members cannot raise anything private there. A private ticket, one thread only the member and your team can read, needs a bot. [Bond is an AI Discord bot that builds one from a single message](https://www.bondbot.gg/), as the run below shows. For bots that only do tickets, see [Bond vs Ticket Tool and Tickets](https://www.bondbot.gg/alternatives/ticket-tool). For the open help channels a support server runs beside its tickets, see the [support server layout](https://www.bondbot.gg/guides/discord-support-server).

## With Bond, in one message

A real run, recorded on a test server: what was asked, what Bond asked you to approve, what it did, and what members saw afterwards.

In #admin-chat:

> **You:** @Bond Set up a ticket system: a button in #support that opens a private thread for the member and the Support team, and a log of closed tickets in a staff-only channel.

> **Install a plugin**
> for @You
> Always allow stops asking about installing plugins · Expires in 10 minutes
>
> Buttons: Allow, Always allow, Deny. Pressed: Allow.

What Bond did:

- List plugins
- List channels
- List roles
- List flows
- Install plugin

> **Bond:** Ticket system installed. The **Open ticket** button is in #support (`#support`). It opens a private thread for the member and the Support team, and closing it posts a summary and transcript to #ticket-log (`#ticket-log`). The `Support` role is @Support.
>
> Nothing has run yet—try opening a ticket from the button in `#support`.

In #support, afterwards:

> Need help? Press the button and a private thread opens for you and the team.
>
> Buttons: Open ticket.

Bond's reply, which only the member sees:

> Your ticket is open: #ticket-You

What Open ticket asks, in a form titled "New ticket": What do you need help with?

Answered: My order never arrived and I would like a refund.

In the private ticket thread ticket-You, under #support:

> @You @Support
> Thanks for reaching out. Someone from the team will be with you soon.
> > My order never arrived and I would like a refund.
>
> Buttons: Close ticket.

The member wrote:

> Hi, it was order 4417, placed last Monday.

Bond's reply to closing it, which only the member sees:

> Ticket closed. The summary and transcript are in #ticket-log.

In #ticket-log, staff only, the close summary:

> **Ticket closed: ticket-You**
>
> > My order never arrived and I would like a refund.
>
> **Opened by**: @You
>
> **Closed by**: @You
>
> **Open for**: 1 min
>
> **Messages**: 2
>
> **Thread**: #ticket-You
>
> Attached: ticket-You.txt.

Light tier · 1 message · 24 seconds · 155K tokens

Recorded on a Bond test server on the Light tier, the tier every free plan runs on. Server, channel and member IDs are placeholders, the test bot is shown as Bond, and the steps where Bond loads its own tools or pages through a long result are left out. The test server has no plan limits, so the plan limits a step reports are left out. The Always allow line on each approval card is reworded in plain words.

Recorded on version 3 of the Tickets plugin, which is now on version 4. Version 4 adds everyone who holds the support role to each new ticket directly, where the recorded version relied on the role mention in the ticket's first message. A ticket whose thread is deleted no longer counts against the member's open-ticket limit. The setup and the panels shown above are unchanged.

Bond asked once, to install the plugin, and the recording pressed Allow. The test server already had #support, so Bond put the panel there and pinned it. It had no log channel and no Support role, so the install made the staff-only #ticket-log and a new Support role, and every ticket adds that role. After the install the same test account played the member: it opened a ticket through the form, wrote in it and pressed Close. That account is a bot, and the summary's Messages line names who wrote but leaves bots out, so here it is a count with no names. The test app could read message text, which Bond cannot do in production, so this page shows the transcript file's name and not what was in it.

## The permissions it takes

Bond checks every step against your own Discord permissions and role position before it acts, and what it reads back is only what you can already see.

### What you need

- List plugins: Nothing extra
- List channels: Nothing extra
- List roles: Nothing extra
- List flows: Manage Server
- Install plugin: Administrator

Installing takes Administrator, the same bar as any automation, because an automation goes on acting as Bond long after you asked for it. Bond itself never needs Administrator.

### What Bond needs

The tickets open and close as Bond, not as whoever installed them, so these are Bond's own permissions in each channel. Bond's invite grants all of them, and a channel's own permissions can still deny Bond's role there.

- In #support: **View Channel** and **Send Messages** to post the panel. **Create Private Threads** and **Send Messages in Threads** to open each ticket: a ticket is a private thread, so **Create Public Threads** alone does not open one. **Read Message History** for the transcript, **Manage Messages** to take the Close button off, and **Manage Threads** to add your support team to each ticket and to lock and archive a closed one.
- In the log channel: **View Channel**, **Send Messages**, **Embed Links** for the summary and **Attach Files** for the transcript.
- A staff-only log channel has to let Bond's role in. The one the install creates does, as #ticket-log did in this run. If you name a channel of your own that Bond cannot use, Bond refuses it and names the permission it lacks there.

## What to watch for

- Bond adds everyone who holds the support role to each new ticket, and its first message mentions the role, so the whole team is pinged for each new ticket.
- If Bond cannot add some of the team, for example on a very large support role, the ticket still opens. The role mention is their way in, and the close summary says how many were left out.
- The support team has to be a role members can be given. Bond refuses its own role, or any other role Discord keeps for an app or for boosts, because such a role would add nobody to a ticket.
- The install never makes a second channel or role with a name your server already uses. If you already have a Support role or a #ticket-log, Bond uses the one your request names, or asks you which to use.
- Bond runs without Discord's Message Content intent, so a ticket's transcript lists who wrote and when, and shows the text only for Bond's own messages and messages that mention Bond.
- A member can have one open ticket at a time by default, and you can raise that to five.
- A ticket nobody writes in is archived after 24 hours by default. You can set anything from one hour to seven days.
- Installing the plugin needs Administrator. Changing its settings later needs Manage Server.
- The Tickets plugin does not use any of your automation slots. A server without a plan can have 5 plugins installed.

## Questions people ask

### Why a private thread and not a channel per ticket?

A thread keeps every ticket inside #support instead of adding a channel for each one, and it archives itself when it goes quiet. Only the member, the support team and anyone with Manage Threads can see a private thread.

### Can staff see every ticket?

The support role is added to every ticket, and anyone with Manage Threads can open any private thread. Closed tickets stay in #support as archived threads, and each close posts a summary and a transcript in the log channel.

### Who can close a ticket?

By default the member who opened it or anyone on the support team. You can limit closing to the support team.

### Does Bond read what members write in tickets?

Only part of it. Bond keeps the reason a member types into the ticket form, posts it at the top of the ticket, and quotes it in the close summary. It cannot read the other messages in the thread unless they mention Bond, because it runs without Discord's Message Content intent, so the summary counts each person's messages and the transcript lists who wrote when.

### Is it free?

Yes. Every tool works on the free plan. Setting it up uses tokens from your weekly allowance, and a free account gets 600K tokens a week. Opening and closing tickets uses none.

## Read next

- [How to make a private channel in Discord](https://www.bondbot.gg/use-cases/private-channels): Create a channel only certain roles can see, without opening the permissions tab and toggling twenty overwrites by hand.
- [Create custom slash commands](https://www.bondbot.gg/use-cases/custom-slash-commands): Ask for a command and get a real Discord slash command with typed arguments and per-role access, registered in your server.
- [Collect applications with a form command](https://www.bondbot.gg/use-cases/application-forms): A slash command with typed questions like age, timezone and why they want the role, that saves the answers and posts them for staff to read.
- [Bond vs PeakBot](https://www.bondbot.gg/blog/bond-vs-peakbot): PeakBot pairs a classic module dashboard with an AI builder. Bond is an agent that manages the server in conversation. What each one is actually good at.
