5
Lifecycle states
15
Form field types
19
Automation triggers
27
Automation actions
Required plan The ticket system needs an active plan. Existing tickets stay readable if a plan lapses, but new ones cannot be opened.
How it fits together

Four ideas. Everything else on this page is a setting on one of them.

Departments

A support team — Billing, Appeals, Bug Reports. Each owns its own staff, response targets, form, channel category and access rules. This is what replaced flat “categories”.

Forms

The questions asked before a ticket opens. Questions can branch on earlier answers, so a member only ever sees what applies to them.

Panels

The message members click. Buttons, a dropdown, or both — posted to any channel, and editable in place without losing its position.

Staff

People, not just roles. Each has availability, a ticket cap, the departments they cover, and a performance record. Roles still control who can see a ticket.

What a member actually experiences

Clicks the panel
Picks a department
Offered help articles
Answers the form
Private channel opens
Staff assigned
Conversation
Closed with a reason
Transcript + rating by DM

Steps that are not configured are skipped silently. With no departments, no form and no knowledge base, clicking the panel opens a channel immediately — the simple setup still works.

Setting it up

Everything lives on Dashboard → Tickets, which is split into nine tabs.

Upgrading from the old ticket system? Nothing to do. Every existing category becomes a department automatically, your ticket numbering carries on unbroken, old tickets keep their history, and panels already posted in your server keep working — their buttons route to the department their category became.
Ticket states

A ticket is always in exactly one of these. They exist so “open” tickets can be told apart from tickets that are actually waiting on you.

StateMeaningResponse timer
🟢 OpenJust opened, nobody has replied yet.Running
🟡 Waiting for StaffThe member replied — it is your turn.Running
🔵 Waiting for UserStaff replied — waiting on the member.Paused
⏸️ On HoldDeliberately parked; blocked on something outside the conversation.Paused
ClosedFinished. The transcript is kept.Stopped

The waiting states move on their own. When a staff member replies, the ticket becomes Waiting for User; when the member replies, it goes back to Waiting for Staff. Nobody has to remember to set it.

Why this matters for your numbers Time a customer spends thinking is never counted against your team. A ticket open for five days that spent four of them waiting on the member is not a missed target — it is a slow customer, and your SLA report says so.

Priority

Four levels, and they do more than colour a row: each one scales your response targets automatically. You configure one set of numbers per department and every priority derives from it.

PriorityTarget multiplierWith a 60-minute first-response target
🔥 Urgent×0.2515 minutes
⬆️ High×0.530 minutes
➖ Normal×160 minutes
⬇️ Low×22 hours

Closing

Staff pick a reason when they close; members just confirm. The reason is not decoration — it decides whether the member is asked to rate their experience, and it feeds your resolution rate.

ReasonCounts as resolvedAsks for a rating
✅ ResolvedYesYes
💬 Question AnsweredYesYes
👤 Closed by UserYesYes
🔁 DuplicateNoNo
🕓 No ResponseNoNo
🚫 Invalid / Not an IssueNoNo
🗑️ SpamNoNo
🤖 Auto-Closed (Inactive)NoNo

Nobody is asked to rate the support they received on a spam ticket they did not open — that is why the middle column and the right one differ.

Reopening

A closed ticket can be reopened within a window you set (48 hours by default; set it to 0 to disable). Reopening restores the member's ability to write and restarts the response timer. Past the window, they open a new ticket instead.

Departments

Everything a support team needs to work differently from the others.

SettingWhat it does
Support rolesWho can see and answer these tickets. Members of these roles get access to every channel opened here.
Ticket categoryWhere this department's ticket channels are created. Leave it blank and the department uses the Default ticket category from Settings.
Archive categoryWhere this department's channels are moved read-only when a ticket is archived. Leave it blank to use the server default. Whether a closed ticket is archived is the close action.
Transcript channelWhere this department's transcripts are posted. Leave it blank to use the Default transcript channel from Settings.
FormThe questions asked before the channel opens. Optional.
AssignmentManual, round robin, least busy, or random. See routing.
Default priorityWhat new tickets start at.
Welcome messagePosted at the top of every ticket here. Supports {user} and {number}.
Channel namingA pattern like billing-{number}. Tokens: {number} {username} {department} {priority}.
Required rolesA member must hold at least one to open here. Departments they cannot use are hidden from them rather than failing on click.
Blocked rolesHolding any of these refuses the ticket.
Max open per memberA per-department cap, on top of the server-wide one.
Log channel overrideSend this department's close logs somewhere specific. Leave empty to use the Logging page.
SLA & escalationResponse targets and who to page when they slip. See SLA.
Set it once in Settings, override it only where it differs The ticket category, archive category and transcript channel all exist in Settings as server defaults and on every department as an override. A department that leaves one blank follows the default — so changing the default later moves every department that has not overridden it, with nothing to update by hand. Each blank picker names the channel it is inheriting, so you can always see what "blank" is going to do.
You cannot delete a department that still has open tickets Close or transfer them first. Deleting it out from under a live conversation would strip that ticket of its SLA, its routing and its support roles mid-conversation.
Forms

The questions a department asks before it opens a ticket.

Forms are their own module now — they used to be a tab of this page, which meant the only thing a set of questions could do was open a support ticket. A department still asks one: pick it under Departments → Form, and the member answers it before their channel is created, exactly as before.

Nothing you built changed. Every form that belonged to a department still belongs to it and still opens tickets. They simply live on their own page now, alongside the forms you use for applications, feedback and everything else.

Read the Forms documentation → — the 15 field types, conditional questions, how a form splits into steps, panels, submission limits and the review queue.

Response targets (SLA)

Off by default. Turn it on per department when you want to know — and be told — that something is slipping.

TargetMeasuresDefault
First responseTicket opened → first staff message60 minutes
Next responseMember replies → next staff message2 hours
ResolutionTicket opened → closed24 hours

What happens as a target approaches

Target set
75% spent → at-risk alert
Target missed → breach
Escalation chain

At-risk and breach alerts are posted in the ticket and ping the assignee — not the whole support role, because an alert that pings everyone every time is an alert people turn off. Both also fire automation triggers, so you can decide what else should happen.

Escalation chain

Up to five rungs per department, each firing once, in time order, while a first response is still outstanding. A rung can notify a role or a person, raise the priority, or both.

30 min → notify @Senior Support 2 hours → notify @Support Lead + raise priority 4 hours → notify @Manager

Business hours

Set a working week and a timezone per department. Daylight saving is handled properly — targets do not silently shift by an hour twice a year.

Staff & assignment

Who picks up a ticket, and how many they hold at once.

StrategyBehaviour
ManualNobody is assigned; staff claim from the queue. The classic behaviour, and the default.
Round robinHanded out in turn to whoever is available and under their cap.
Least busyGoes to whoever holds the fewest open tickets. Ties break on who was assigned longest ago.
RandomPicked uniformly among available, under-cap staff.

Automatic assignment only ever picks someone who can actually take it — marked available, in that department, under their cap, still holding a support role, and still holding the Ticket System permission. A staff record outlives both the role that granted access and the permission behind it, so those last two checks run against the live server and the live permissions, never the stored record. If nobody qualifies, the ticket simply waits in the queue for someone to claim. That is a normal outcome, not a failure.

Staff and permissions are one list

The Staff tab and the Permission Manager's Ticket System module are the same setting seen from two pages. The Staff tab holds both subjects in one section — Roles and Members, added from the one Add staff button — and either writes that same grant. Grant it in either place and the other updates: add a role on the Staff tab and its members appear on the rota; grant the module in the Permission Manager and they appear there too. Take it away and they stop being assigned tickets immediately.

Records are never deleted by a permission change Somebody who loses ticket access keeps their history and stays visible on the Staff tab, marked no permission — they simply stop receiving new tickets. Removing them outright is still a deliberate click, because that is what deletes their record.

Availability

Staff set their own with /ticket staff, or you set it on the dashboard.

StatusGets new tickets
🟢 AvailableYes
🟠 BusyNo — keeps their current tickets
🟡 AwayNo
⚫ OfflineNo

Ticket caps

Give someone a maximum and they stop receiving new tickets at it — and the Claim button refuses too. A cap that routing honours but the button ignores is not a cap.

Performance

Tickets handled and closed, average first response, average resolution, and average satisfaction — per person, with a 7-day, 30-day and lifetime leaderboard. These are the numbers a lead manages against, shown side by side rather than folded into one score nobody can audit.

Automation

When something happens → check some conditions → do things. The same shape as Discord's own AutoMod.

Triggers

GroupTriggers
LifecycleTicket opened · closed · reopened · claimed · unclaimed · transferred
MessagesUser replied · Staff replied · First staff response
FormForm submitted
ChangesTag added · Status changed · Priority changed · Internal note added · Member added
TimingSLA nearly breached · SLA breached · No activity for…
FeedbackRating submitted

Conditions

Department · priority · status · tag · any form answer · opener has role · available staff count · open ticket count · ticket age · message count · within business hours · opener's first ticket · opener's lifetime tickets · rating given · is assigned.

Match all of them or any of them. Priority comparisons use severity order, so “priority is at least High” correctly includes Urgent.

Actions

GroupActions
CommunicateSend message · Send embed · DM a user · Notify staff · Add internal note
The ticketSet status · Set priority · Add tag · Remove tag · Assign staff · Move department · Escalate · Close
The memberAdd role · Remove role
The channelRename · Move category · Lock · Create staff thread
TimingPause SLA · Resume SLA · Wait (minutes to a week)
IntegrationCall a webhook
AISummarize · Auto-categorize · Suggest a reply

Test it before you trust it

ModeWhat runs
EnforceEverything, for real.
TestEverything except destructive actions (closing, roles, locking). Logs what it would have done.
SimulateEvaluates and logs only. Nothing happens.
DisabledNot evaluated at all.

Test and Simulate run the same code path as Enforce, which is what makes the preview trustworthy. Each workflow also shows how many times it has run and how often it matched.

Worth knowing

With no workflows yet, the page offers four ready-made starters — greet new tickets, nudge-then-close on silence, page a manager on a breach, and thank a five-star rating. They are ordinary workflows you can edit or delete.

Knowledge base

The cheapest ticket is the one nobody had to open.

Write short articles answering the questions your staff repeat most. When a member picks a department, Azra offers the relevant ones before any form. They read one and either say it solved their problem — no ticket is created — or continue to open one.

Picks a department
“These might help…”
Reads an article
Solved · or open a ticket
FieldNotes
TitleWhat the member sees in the list. Phrase it as the answer, not the topic.
SummaryOne line, shown under the title.
ArticleThe full answer. Discord formatting works.
KeywordsThe phrases members use, not the ones you do. These carry the most weight in matching.
DepartmentLimit an article to one team, or leave it available to all.
The number to watch is deflections Views prove nothing on their own — an article can be read a thousand times and still deflect nothing. A deflection is a member who read it and said it solved their problem. Both are shown side by side so you can see which articles are actually earning their place.

Turn it on with Settings → Suggest knowledge-base articles. If nothing matches what the member needs, they are shown nothing rather than an unrelated article — a bad suggestion reads as the bot not having understood them.

Working a ticket

Every action is available in three places: buttons in the channel, the /ticket command, and the dashboard.

Buttons in the channel

Every ticket opens with a control panel: Close · Claim/Unclaim · Status · Priority · Add · Remove · Note · Transfer. It updates itself as the ticket changes.

Commands

/
ticket close
Close the ticket you are in, with a reason and an optional internal note.
/
ticket claim
Take ownership. Refuses if you are at your ticket cap.
/
ticket unclaim
Put it back in the queue.
/
ticket assign
Hand the ticket to a specific member.
/
ticket status
Move it to another state — waiting for user, on hold, and so on.
/
ticket priority
Raise or lower the priority. Response targets re-cut to match.
/
ticket transfer
Move it to another department. Access and channel category follow.
/
ticket note
Add a staff-only note. The member never sees it.
/
ticket reply
Send a saved reply by its shortcut, with placeholders filled in.
/
ticket add
Bring another member into the ticket.
/
ticket remove
Remove someone. The person who opened it cannot be removed.
/
ticket rename
Rename the ticket channel.
/
ticket staff
Set your own availability. The one subcommand that works outside a ticket.

Every option is autocompleted — start typing and Azra offers the valid values, so there is nothing to memorise. Members do not need these commands: everything available to them is a button in their own ticket.

Internal notes

Staff-only, invisible to the member, kept with the ticket forever and included in its history. Use them for “refund issued, waiting on finance” — the context the next person needs.

Saved replies

Reusable answers with a shortcut. /ticket reply refund-policy sends it with {user}, {ticket} and the rest filled in. You can restrict one to a single department.

Tags

Label tickets for filtering, reporting and automation conditions. Tags appear in the queue, in analytics, and can be added automatically by a workflow.

The dashboard

Nine tabs at Dashboard → Tickets.

TabWhat it is for
DashboardOpen tickets, what is waiting on whom, closed today, SLA at-risk and breached, staff availability, average response and resolution, satisfaction, peak hours, and a live activity feed.
TicketsThe queue. Filter by status, priority, department, tag, assignee, SLA breach or text; sort by urgency, age or staleness. Click any row for the full ticket.
DepartmentsCreate and configure teams, including their SLA and escalation chain.
FormsThe form designer, with a live view of the steps a member will walk through.
AutomationBuild workflows; see how often each has run and matched.
PanelsBuild and deploy the messages members click.
KnowledgeWrite help articles and see how many tickets each has deflected.
StaffAvailability, caps, departments and the performance leaderboard.
AnalyticsVolume, response times, satisfaction trend, by department, by priority, how tickets ended, a day-by-hour heatmap, workload, and the transcript centre.
SettingsNaming, limits, cooldowns, ratings, auto-close, archiving, tags, saved replies, webhooks and the blacklist.

Opening a ticket from the dashboard

Clicking a ticket shows everything about it — form answers, response timers, internal notes, full history, the rating — and lets you close, claim, assign, transfer, retag, or change status and priority without opening Discord.

The search box at the top of the page looks inside tickets, form answers, internal notes and transcript text at once. Finding “that ticket about the failed invoice from March” is a search, not an archaeology expedition.

Transcripts

Saved automatically when a ticket closes.

The member gets a private link by DM. Staff can browse every transcript in the Analytics tab, search inside them, and export in four formats:

FormatGood for
HTMLReading. Discord-styled, with images inline and names resolved.
Plain textAttaching to an email or a case file.
MarkdownPasting into a wiki or an issue tracker.
JSONFeeding another system.

Transcripts record who said what and when, edits, attachments, embeds and stickers, and resolve mentions to names — so an archive read months later still makes sense after the people involved have left.

Prefer archiving over deleting Set When a ticket is closed to Archive (or leave it on Ask and pick Archive) and the channel is moved to your archive category read-only instead of being deleted. A deleted channel takes its attachments with it; the transcript keeps the text but not the files.
Closing a ticket

Closing records the outcome. What happens to the channel is a second, separate decision.

When a staff member closes a ticket, Azra asks what should happen to the channel — right there in the channel, so any staff member can answer and the choice survives a restart:

ChoiceWhat happens
📦 ArchiveThe channel is moved to the archive category, renamed closed-0001 and made read-only for the member. It is then deleted automatically after 24 hours — change that to any number of hours in Settings, or set it to 0 to keep archives forever.
📄 Transcript & deleteThe transcript is posted to the transcript channel, then the ticket channel is deleted.

Settings → When a ticket is closed chooses the default: Always archive, Always create a transcript and delete, or Ask staff every time (the default).

Both the archive category and the transcript channel are set in Settings and can be overridden per department — so Billing transcripts can land in one channel and Appeals transcripts in another, while everything else follows the default. The prompt in the channel always names the resolved destination, so what the buttons say is what actually happens.

Nobody is left waiting on a prompt The question is only asked when a staff member is there to answer it. An auto-close on inactivity, a workflow, or a member closing their own ticket all fall back automatically — archived if you have an archive category, transcript-and-delete if you do not.
Satisfaction ratings

Ask the member how it went, and know which of your team people are happiest with.

When a ticket is closed for a reason that warrants it, the member's closing DM carries star buttons. One rating per ticket, credited to whoever handled it. Ratings appear on the dashboard overall, per staff member, per department, and as a trend over time.

Turn it off entirely in Settings, or change the scale. Spam, duplicate and invalid closures never ask — asking would only poison the average.

Keeping the queue clean
ControlWhat it does
Open tickets per typeHow many of one department a member may have open at once — 1 by default, so somebody can hold one Bug Report and one Suggestion, but never two Bug Reports. A department can set its own cap.
Open tickets in totalHow many they may have across every department combined — 3 by default. Both limits apply, so a member with three open tickets waits for one to close even if the fourth would be a fresh type.
CooldownA wait between one ticket and the next.
BlacklistBar a member from opening tickets, permanently or until a date. They are told why.
Required / blocked rolesPer department — who may open one at all.
Auto-close on inactivityClose tickets nobody has touched for N hours.
Inactivity reminderNudge first, at a separate threshold. Fires an automation trigger, so you decide what the nudge says and does.
Connecting other tools

Send ticket events to anything that accepts an HTTPS request.

Subscribe an endpoint in Settings → Outbound webhooks and pick the events you want. Azra POSTs signed JSON when they happen — enough to drive Zapier, Make, n8n, a Slack relay or your own service without a vendor-specific connector.

Events
Ticket opened · closed · reopened · claimed · assigned · transferred · status changed · priority changed · tagged · note added · SLA at risk · SLA breached · rating submitted · form submitted

Every delivery carries X-Azra-Signature, an HMAC-SHA256 over the timestamp and body using a secret shown to you once at creation. Verify it and you know the request genuinely came from Azra and has not been replayed. Endpoints that keep failing are disabled automatically, with the last error shown on the dashboard.

These are for external systems. For Discord logging, use the Logging page instead.

AI assistance
Preview The AI features are built and visible, but no model is connected yet. Turning them on today runs the pipeline and returns placeholders; the dashboard says plainly which mode it is in. Nothing else about your tickets changes.

When enabled, AI can summarize a long ticket for a handover, suggest a category and priority for a new one, draft a reply, detect the language, and flag spam or abuse.

A suggested reply is always posted for staff to read and send themselves — it is never sent to the member as though it were an answer. That is deliberate and is not a setting.

Who can do what

Ticket capabilities are granted through the Permission Manager, separately from each other.

CapabilityCovers
Claim TicketClaim, unclaim, assign, close, send saved replies, set your own availability
Change Status / PriorityMove a ticket through the lifecycle and change its urgency
Transfer Between DepartmentsReroute a ticket to another team
Add Internal NoteWrite staff-only notes
Add / Remove MembersBring people into a ticket, and rename it

They are separate because they are different levels of trust — “may answer tickets” and “may reroute the queue” are routinely given to different people. Granting one never grants another, and it works the same whether the person uses a button, a command or the dashboard.

Closing is deliberately not gated The member who opened a ticket can always close their own.
Common questions

Do I have to use departments, forms and SLAs?

No. One department with a support role is a complete, working ticket system. Everything else is opt-in.

What happens to my existing tickets and categories?

Categories become departments automatically, numbering continues unbroken, closed tickets keep their transcripts, and panels already posted in your server keep working.

Will a ticket be deleted when it closes?

Only if you choose it. By default staff are asked — archive the channel, or save the transcript and delete it. The transcript is saved either way.

How long are archived tickets kept?

24 hours by default, then the channel is deleted automatically. Change it to any number of hours in Settings → Delete archived tickets after, or set 0 to keep them forever. Tickets archived before this setting existed are never deleted by it.

Can a member reopen a ticket?

Within the window you set — 48 hours by default, and it can be switched off.

Why is my automation not firing?

Check its mode is Enforce (Test skips destructive actions, Simulate does nothing), that its conditions actually match, and that a cooldown is not suppressing it. Every workflow shows its run and match counts, which usually answers this in one glance.

Why did nobody get assigned automatically?

The department's assignment is probably Manual, which is the default. Otherwise nobody was eligible — available, in that department, under their cap, and still holding a support role.

Why can I not delete this department?

It still has open tickets. Close or transfer them first.

Where do ticket logs go?

To your central Logging destination, branded like every other Azra log. A department can override this with its own channel.