Discord Ticket Search: How to Find an Old Ticket
Staff can filter every ticket in the server by eleven things, but the only free text it reads is the close reason. Why that is, and how to stay findable.
Dani, Founder, AI Ticket Bot
9 min read
Six months in, a server has a few thousand ticket records and no memory of any of them. Somebody asks whether that refund was ever processed, and the answer depends entirely on what your staff typed into a box on the way out.
How do you search tickets in a Discord server?
Run /ticket search anywhere in the server. Not inside a ticket, and not in a direct message: it is scoped to the server it is run in, and it reads every ticket that server has ever had.
The reply is private to you. Ten results a page, newest first, each one a line carrying the channel name, status, priority, panel, opener and how long ago it opened, with a dropdown to open any of them in full. Web chats and tickets from a connected third-party bot are marked so you can tell at a glance why they have no channel to jump into, and an anonymous web visitor with no Discord account reads as "Website visitor" rather than as a broken mention.
What running it gives you
- Who can run it
- Manage Server, or a staff role with the base Work on tickets permission
- Plan
- Free on every plan, with no part of the filter set held back
- Rate limit
- Ten searches per person per server per minute
- Results
- Ten a page, newest first, private to whoever ran the command
- Session
- Usable for ten minutes, and your permissions are re-checked on every click
That last line is worth more than it looks. The view re-queries live data each time you turn a page, so the permission check cannot be a one-off from the moment you typed the command. A staff member who loses their role mid-session loses the results with it.
The gate being the base support permission rather than a reporting one is a deliberate split. Finding a ticket is part of doing the job. /ticket stats, which aggregates rather than lists, is the one behind the See stats permission and behind Premium for its longer windows.
What can you actually filter by?
Eleven options, and they combine. Everything is optional except the window, which has a default.
| Filter | What it matches | Worth knowing |
|---|---|---|
| Period | Tickets opened in the window | Defaults to the last thirty days. Today, 7 days, 30 days, last year, All time |
| Status | Open, claimed or closed | Shown as words in your server's language, never the raw value |
| Priority | Low, normal or high | Normal is not shown on result rows, only the exceptions |
| Panel | One panel by name | Autocompletes. A panel hidden by a downgrade behaves as though it does not exist |
| Opened by | Tickets a member opened | The closest thing to a per-member history on the staff side |
| Claimed by | Tickets a staff member claimed | Empty for anything nobody ever claimed |
| Closed by | Tickets a staff member closed | An automatic close is attributed to the bot, not to a person |
| Source | Discord, web chat or another bot | All three sit in the same records and appear together by default |
| AI | Replied, never replied, closed without staff, handed over | Closed without staff is the honest phrasing, see below |
| Transcript | Yes or no | Whether a transcript was ever built, not whether it still opens |
| Text | Text in the close reason | The only free text field in the whole set |
Two of those are worded carefully on purpose. Closed without staff is not "the AI solved it": the underlying condition is that the ticket closed with the AI having replied and no escalation recorded, and a staff member can take a ticket over without that escalation ever firing. The filter reports what the query does rather than the flattering version of it.
Panel is capped by your plan. If a downgrade has put a panel out of reach, it is neither offered in the autocomplete nor accepted if you type it, and the refusal is identical to the one for a panel that never existed. Its tickets still appear in unfiltered results, because history is never hidden, only the filter is.
Why can you not search what people said?
This is the question the filter list raises and it has a real answer rather than a roadmap answer.
When a ticket closes, the bot does five things in one transaction: it works out the timing bounds of the conversation, flips the ticket to closed, writes one contribution row per staff member who took part, builds the transcript, and then deletes the ticket's message rows.
- Messages stored live
- Transcript written
- Message rows deleted
- Close reason kept
The conversation is not lost. It moves into the transcript, a stored document served at its own link, and the per-staff credit moves into a contributions table that keeps it permanently. What goes away is the searchable copy, the heavy message text a query would have to scan. So a closed ticket has no message rows left to search, and an open one, which still has them, has no filter that reads them either.
Two consequences follow. Storage stays flat as a server grows, which is part of why this is free rather than metered. And the conversation lives under one retention clock instead of two: ninety days on Free, two years on the paid plans, after which the transcript stops opening. The ticket record, and everything you can filter on above, stays.
What makes a ticket findable a year later
The close reason, and nothing else. Closing a ticket well covers what belongs in that box and why it travels further than any other text in the product. What that article does not cover is how the matching behaves, which changes what a useful reason looks like.
It is a case-insensitive substring match on one field. refund finds "Refunded on order 4471". There are no word boundaries, so it also finds "non-refundable", and no way to require two words at once or exclude one. The field caps at 255 characters. Write the noun a future search would use, put it early, and resist writing a sentence.
Automatic closes are searchable too, because the bot stores a stable code rather than a sentence and then translates it for display. Search the code, not the words you see in your log channel.
Codes an automatic close writes into the reason
- auto_close_inactivity
- Nobody replied and the inactivity timer ran out
- user_left_server
- The member left, so the ticket closed with them
- close_request_expired
- A close request nobody answered in time
- admin_close
- An administrator force-closed it
- channel_deleted_manually
- Somebody deleted the ticket channel by hand
- thread_deleted_manually
- The same, for a thread ticket
- channel_missing
- The channel became unreachable
Searching inactivity finds every ticket in the first row, because it is a substring of the stored code. Searching for the phrase you read in the log post will not: the display says "User left the server" while the stored value is user_left_server, so one word is a safer search than a sentence.
Discord or the dashboard?
Both search the same close reason field. What differs is who can reach them and what else they offer.
In Discord
- Staff role with Work on tickets, or Manage Server
- Eleven filters
- Ten a page, newest first, no other order
- Private reply that expires in ten minutes
- One ticket at a time through the dropdown
On the dashboard
- Manage Server only, so it is the admin surface
- The same set, plus category, plus sorting
- Newest, oldest, or most recent activity
- A plain URL you can bookmark and share with another admin
- Saved views, multi-select, bulk close and export
The export has no equivalent in Discord and it is the closest thing to searching a conversation. Filter the list down, select the tickets, export them with the conversations included, up to a hundred at a time, then search the file. A metadata-only export, the spreadsheet of who opened what and when, goes up to a thousand rows. That is a workaround rather than a feature, and it is worth calling one.
Where ticket search falls short
Worth using for
- Finding one specific ticket when you know the person, the panel or roughly when
- Auditing a member's history before answering their new ticket
- Pulling every inactivity close in a period to see whether your timer is set right
- Checking what happened on a ticket whose channel is long gone
Do not expect
- Anything based on what was said in the conversation
- Filtering by category, which exists on the dashboard and not on the command
- A per-member profile. There is no customer record anywhere in the product
- Saved searches or alerts. Every search is typed fresh
One rough edge is worth naming plainly, because it looks like a broken product and is not. A ticket whose transcript has aged out still shows a transcript button on the staff side, and the link then reports that the transcript is gone. The member-facing /mytickets view checks the retention clock first and says "no longer available" instead. The staff view does not run that check yet, and we have reported it internally. Until it changes, treat that button on an old ticket as a maybe rather than a promise.
Making your server searchable
Fifteen minutes, once
- Agree one close reason format with your staff, such as outcome then reference
- Ban the word "closed" as a reason. The status field already says that
- Teach the team that the period defaults to thirty days
- Name your panels after what they are for, since panel is a filter and a good one
- Decide what your ticket naming template is, because the channel name is the label on every result row
- If a category matters to you as a filter, do that search on the dashboard
None of it costs anything. The searchable half of a ticket is written by a human at the moment they are least interested in writing it, which is why the format is worth agreeing once instead of hoping.
How the resolution share is defined
- Sample
- Every ticket handled across the bot's lifetime, V1 and V2 combined
- Window
- Lifetime to date, refreshed continuously rather than pinned to a date
- Definition
- Resolved by AI means the AI closed the ticket with no human stepping in at any point. A single staff reply disqualifies it
Keep reading
Frequently asked questions
Run /ticket search anywhere in the server. It is a staff command, free on every plan, and it needs either Manage Server or a staff role with the base Work on tickets permission. The reply is private to you: ten results a page, newest first, with a dropdown to open one of them. It is not a search of the conversation, it is a filter over your ticket records.
Because the message rows are deleted when the ticket closes. The conversation is written into the transcript first, which is a stored document at its own link rather than an indexed table, and the searchable copy is then removed. Nothing in the product searches message text, on an open ticket or a closed one. The close reason is the only free text any filter reads.
Eleven things: time window, status, priority, panel, who opened it, who claimed it, who closed it, where it came from, what the AI did on it, whether a transcript exists, and text in the close reason. The window defaults to the last thirty days, so anything older needs the period set to All time before it will appear.
Set the period to All time first, because the default window is thirty days and it is the single most common reason a search comes back empty. Then narrow with the person who opened it, the panel it came from, or a word from the close reason. If you know roughly when it happened, the dashboard ticket list sorts by oldest and pages through the same records.
No. It is free on every plan and no part of the filter set is held back, because finding a ticket is a do the job feature rather than an analytics feature. The aggregate view is the one that is gated: /ticket stats needs the See stats staff permission, and its longer time windows need Premium. Listing and filtering never do.
Yes, but it is a different audience. The dashboard ticket list needs Manage Server, so it is the admin surface rather than the staff one, and it adds a category filter, sorting, saved views and an export the Discord command does not have. It searches exactly the same close reason field. Staff without Manage Server use the command.
It’s not just an AI, it’s your AI.
See it on your own server.
Add the bot free, teach it a few of your most common answers, and watch it clear the repeat tickets on its own.
Free plan, no card. Your first panel starts 14 days of Premium.
Keep reading.
All articlesDiscord Ticket Welcome Message: The One Post Every Ticket Gets
The welcome message is the one post every Discord ticket gets. What to put in it, what to leave to the AI greeting, and the nine other messages you can rewrite.
9 min read
Discord Ticket Logs: Four Events, Four Channels, One Blind Spot
Ticket log channels are free on every plan and set per event, so opens, claims, closes and transfers can each land somewhere different. What each one carries.
9 min read
How to Open a Ticket in Discord (and What Decides If It Opens)
Members open a ticket by pressing a button on a panel. Behind that press sit five steps in a fixed order, and five routes in that do not all pass them.
9 min read