Approval Workflows

Require sign-off from an approver role before staff carry out refunds, bans, and other sensitive actions

The approval process lets a staff member ask for a manager's sign-off inside a ticket before doing something sensitive: a refund, a ban, an exception to policy, or anything else you define. The request is recorded on the ticket, the approver role is pinged, and the decision is announced in the ticket, optionally logged to an audit channel, and optionally shared with the customer. Approvers decide with /approval approve or /approval reject in Discord, or with the Approve and Reject buttons on the dashboard's Approvals page.

The approval process is an Enterprise feature. Running /approval on a lower plan returns "Approval workflow management requires Enterprise plan" (code TC014). Only the bot owner can change approval settings on the dashboard; dashboard staff see the block read-only. Upgrade your plan to use it.

Multi-step approval chains are not available yet. The Advanced option under Mode is marked "Coming soon", and the bot only runs the single-step Simple mode described on this page.

Go to Staff → Approvals

Setting up

Open the Approvals settings

Go to Staff → Approvals. Turn on the Approvals card and leave Mode on Simple.

Choose the approver role

In the Who approves, and what card, pick the Discord role whose members may approve or reject under Approver role. The card confirms "Members with the @Role role can approve requests." Staff status alone is not enough: approvers must hold this role.

Pick what needs approval

Under What needs approval, turn on at least one of Refund request, User ban, Policy exception, Escalation, and Custom request. Anything not turned on cannot be requested. For Custom request, add up to 10 named types under Your own actions, for example discount or account merge.

Set the rules

Decide whether to Ask staff for a reason on every request, whether to Tell the member about submissions and decisions, and how many hours a request may wait before it times out under Time limit.

Configure the audit log

Keep the Logging card turned on and pick a channel the bot can post in under Post logs in. Choose whether Include reasons should copy the approver's reason into the log. A log channel is required while logging is on.

Save

Click Save changes on the bar at the bottom of the page, or press Ctrl/Cmd + S. The approver role and log channel must belong to this server, and the bot must be able to send messages in the channel, or the save is rejected with a message naming the problem.

Settings

SettingAllowed valuesDefault
Approvals (card switch)on or offoff
ModeSimple (Advanced is coming soon)Simple
Approver roleone role from this servernone (required)
What needs approvalany of Refund request, User ban, Policy exception, Escalation, Custom request; at least oneRefund request
Your own actionsup to 10 names of up to 100 characters; no duplicates, ignoring upper and lower casenone
Ask staff for a reasonon or offon
Tell the memberon or offon
Time limit1 to 168 hours48
Logging (card switch)on or offon
Post logs ina text channel the bot can post in; required while logging is onnone
Include reasonson or offon

Requesting approval

A staff member runs the command inside the ticket channel:

/approval request type:<Refund|User Ban|Policy Exception|Escalation|Custom> [reason] [urgency] [amount] [custom_type]
OptionValuesNotes
typeRefund, User Ban, Policy Exception, Escalation, CustomMust be one of the types turned on under What needs approval
reasonfree textRequired when Ask staff for a reason is on
urgencyLow, Medium, HighDefaults to Medium
amounta numberOptional; shown on the request, useful for refunds
custom_typeone of your custom type namesRequired when type is Custom; matched case-insensitively

What happens next:

  1. The requester gets a private confirmation card, Approval Request Created, listing the request ID, type, urgency, amount if given, and reason, with the status "Request submitted and awaiting management review".
  2. A public card, New Approval Request, is posted in the ticket channel with a ping of the approver role, showing the ticket, type, urgency, requester, amount, and reason, and the footer "Use /approval approve or /approval reject to respond". There are no buttons on the card; decisions are made by command or on the dashboard.
  3. When Tell the member is on, a plain message tells the ticket creator their request for that type "has been submitted for approval and is currently being reviewed by our management team".
  4. The ticket's approval status becomes Pending and an approval.requested webhook event is sent.

A ticket holds one request at a time. Requesting again while one is pending, approved, or rejected returns a TC015 error explaining the current state.

Worked example

A support agent handling ticket #0042 wants to refund €30 to a customer who was double charged:

/approval request type:Refund reason:Customer was charged twice on 3 May, second charge is invoice INV-1183 urgency:Medium amount:30

The @Support Managers role is pinged in the ticket. A manager reads the card, checks the invoice, and runs /approval approve reason:Verified duplicate charge. The agent sees the approval in the ticket, the customer is told the refund was approved, and #approval-log records the decision with the manager's name and reason.

Deciding

Approvers decide in the ticket channel:

/approval approve [reason]
/approval reject reason:<required>
/approval status
  • Only members holding the Approver role can approve or reject. Anyone else gets "You don't have permission to approve requests." (TC002).
  • Rejecting without a reason returns "A reason is required when rejecting an approval request." (TC012).
  • The first decision wins. A second approver acting on the same request sees "This approval request has already been processed by another approver." (TC015).
  • /approval status shows the ticket's current approval state to anyone in the ticket, in every mode.

After a decision:

  1. The approver gets a private confirmation, Request Approved or Request Rejected, with the request ID, type, who decided, and the reason.
  2. When Tell the member is on, the ticket creator is told "Your request for [type] has been approved" or "rejected", with the reason if one was given.
  3. When logging is on and a channel is set, an Approval Decision Logged entry is posted to the channel chosen under Post logs in with the decision, approver, and response time. The reason is included only when Include reasons is on.
  4. An approval.approved or approval.denied webhook event is sent.

Deciding on the dashboard

The Approvals page lists requests across your servers. It is in the sidebar under More tools on the dashboard home. Once there is at least one request, the page shows counters for Pending, Approved, Rejected, and Timed out, a search box, and a status filter. Each pending card has Open in Discord, View ticket, Approve (optional reason), and Reject (reason required). As with /approval, the member is told about the decision, with your reason, only when Tell the member is on. The same approver-role rule applies: if your Discord account does not hold the role, the card shows "You don't have the required approval role." The settings are not on this page: change them in Staff → Approvals. While there are no requests, the page shows Approval settings, which opens that block (asking which server first if you have several).

Go to Approvals

The ticket page on Tickets also has an Approval tab, shown while the ticket's request is pending, approved, or rejected, with the request and the same buttons.

Statuses

StatusMeaning
PendingWaiting for a decision from the approver role
ApprovedAn approver approved it
RejectedAn approver rejected it, with a reason
Timed outNobody decided within Time limit

A decision or a timeout is informational. TicketCord does not perform the refund, ban, or other action for you; the staff member carries it out after seeing the result. A timeout is recorded silently: no message is posted, nobody is notified, and no webhook is sent. Check Approvals for the Timed out count.

Limits and gotchas

  • One request per ticket, ever. After a decision the ticket keeps its approved or rejected state, and a new /approval request in the same ticket is refused with TC015. If the situation changes, open a new ticket for the follow-up request.
  • Requests time out after Time limit hours counted from submission. Timeouts are checked every couple of minutes, so a request may show as pending for a moment after its deadline.
  • Custom types are limited to 10 and are matched by name; renaming a type in the settings does not update requests already made.
  • The audit log channel must be in the same server and writable by the bot. If it is later deleted, decisions stop being logged until you pick a new channel.
  • Advanced under Mode cannot be selected yet. A server set to Advanced mode gets "Advanced approval actions are not available in Discord yet." (TC018) for approve, reject, and request commands. Stay on Simple.

Troubleshooting

SymptomCodeCauseFix
"Approval workflow management requires Enterprise plan."TC014The bot owner's plan is not EnterpriseUpgrade at ticketcord.com/pricing
"The approval process is not enabled in this server."TC018The card switch is offTurn on Approvals and save
"The approval process is not configured for this server."TC011The settings were never saved with a roleComplete the setup steps and save
"Approval type 'ban' is not enabled in this server."TC018That type is not turned on under What needs approvalTurn it on and save
"Only staff members can request approvals."TC002The requester has no staff roleAdd the requester to a staff role in Staff → Staff roles
"You don't have permission to approve requests."TC002The approver does not hold the Approver roleGive them the role, or change the role in the settings
"This ticket already has a pending approval request."TC015A request is open on this ticketWait for the decision or the timeout
"This approval request has already been processed by another approver."TC015Someone else decided firstNothing to do; run /approval status to see the result
"A reason is required when rejecting an approval request."TC012/approval reject was run without reasonAdd reason: to the command
Request accepted but no reason was requirednoneAsk staff for a reason is offTurn it on if reasons are mandatory for you
Nothing was posted to the audit channelnoneLogging is off, no channel is set, or the bot cannot post thereTurn on Logging, pick a channel under Post logs in, and give the bot send permission
The customer was not told about the decisionnoneTell the member is offTurn it on

Common questions

Who can approve a request? Only members of the role chosen under Approver role. Being staff is not enough on its own, and the same rule applies on the dashboard.

Can approvers click a button instead of typing a command? Not in Discord: the request card has no buttons, so approvers use /approval approve or /approval reject. On the dashboard's Approvals page there are Approve and Reject buttons.

What happens when a request times out? Its status becomes Timed out and nothing else happens. No message or notification is sent, so managers should watch the Timed out counter on Approvals.

Does approving a refund actually refund the customer? No. Approval is a recorded sign-off. A staff member still performs the refund in your payment system.

Can I have two managers both sign off? Not yet. Multi-step chains are the "Coming soon" Advanced mode. Today the first approver's decision is final.

Can I request approval from the dashboard? No. Requests are made with /approval request in the ticket. The dashboard is for reviewing and deciding.

Does the customer see the approver's reason? When Tell the member is on, the customer sees the decision and the reason if one was given. Keep reasons customer-safe, or leave the reason off approvals and use the audit log for internal notes.

Last updated on

On this page