Support Flows
Support Flows are visual workflows made from connected nodes. Use them when a ticket needs more than a simple button: ask questions, route by answer, call an external service, create a ticket with context, or run follow-up actions automatically.
Flow types
| Type | Use it for | Triggered by |
|---|---|---|
| Interactive | Forms, guided intake, knowledge base suggestions, conditional ticket creation | Panel buttons, custom commands, or a category's workflow buttons |
| Automation | Background ticket actions, reminders, tagging, routing, auto-close workflows | Category auto-actions and automation rules |
Interactive flows can ask users for input. Automation flows run without user prompts.
Build a flow
Create it
Open Automations → Flows in the dashboard, choose New Flow, then pick Interactive or Automation.
Add nodes
Drag nodes into the builder and connect them in the order they should run. Every flow starts at a Start node.
Configure each node
Set labels, messages, conditions, variables, or actions on each node. Keep labels short so the builder remains readable.
Test and activate
Run a test, fix any missing connections, then mark the flow active.
Link it
Attach interactive flows to a panel button, a command, or a category's workflow button. Attach automation flows from a category auto-action or automation rule.
Node catalog
Node cards in the builder show the exact plan requirement. The groups are:
Interactive nodes
Collect input or show information during an interactive flow.
Embed
Show rich info in a Discord embed: title, description, images, and fields.
Use for:
- •Welcome messages
- •Instructions
- •Formatted info display
Button
Present navigation buttons with customizable styles and emojis. Up to 5 buttons per row.
Use for:
- •Menu navigation
- •Yes/No choices
- •Multi-option selection
Modal
Collect input from users via Discord modals. Each page holds up to 5 fields, and modals can span multiple pages for longer forms.
Use for:
- •Short text answers
- •Long descriptions
- •Multi-page form collection
Application
Multi-page application posted to a review channel, with an optional Approve/Deny step that can grant a role.
Use for:
- •Staff applications
- •Whitelist or allowlist requests
- •Role applications with review
Create Ticket
Final action to create a ticket with collected information in a specific category.
Use for:
- •Creating tickets
- •Routing to categories
- •Setting priority
Condition
Branch based on user responses or variables with multiple condition operators.
Use for:
- •Conditional routing
- •Response-based logic
- •Value checking
Permission Check
Verify user has required Discord permissions with AND/OR logic.
Use for:
- •Admin-only flows
- •Staff verification
- •Role-based access
Logic Gate
Advanced AND/OR/NOT logic branching with multiple condition checks.
Use for:
- •Complex logic
- •Multiple conditions
- •Variable existence checks
Staff Presence
Branch on whether support staff are currently online so the flow can respond differently.
Use for:
- •Offline auto-replies
- •Route to on-call
- •Set wait expectations
Knowledgebase
Display knowledge base articles with pagination controls to reduce ticket volume.
Use for:
- •Self-service
- •FAQ display
- •Troubleshooting guides
Action nodes
Change a ticket, message a channel, tag a role, set a variable, or wait before continuing.
Send Message (Ticket)
Send a message into the current ticket channel, with variable interpolation support.
Use for:
- •Automated notifications
- •Status updates
- •Reminders
Send Message (Channel)
Send a message to any channel you choose, not just the ticket channel, with variable support.
Use for:
- •Post to a log channel
- •Notify a staff channel
- •Cross-post updates
Rename Ticket
Rename the ticket channel from a template, so its name reflects the latest context.
Use for:
- •Add the order number
- •Show the issue type
- •Mark a ticket escalated
DM User
Send a direct message to the ticket creator, the staff member who claimed it, or a specific user.
Use for:
- •Follow-up messages
- •Private instructions
- •Status nudges
Reopen Ticket
Reopen a closed ticket, with an optional reason, so the conversation can continue.
Use for:
- •Customer replies again
- •Reopen on new info
- •Undo an early close
Set Variable
Store a value in a flow variable for use in later nodes, with full variable interpolation.
Use for:
- •Save a computed value
- •Carry state between nodes
- •Flags
Round-robin Assign
Assign the ticket to the next staff member in a role, spreading work evenly across the team.
Use for:
- •Even workload
- •Fair distribution
- •Auto-claim by rotation
Request Rating
Ask the ticket creator to rate their support, using a five-star scale or a thumbs up/down.
Use for:
- •Collect CSAT
- •Post-close feedback
- •Measure quality
Add User
Add users to ticket channels automatically for team collaboration.
Use for:
- •Adding staff
- •Including users
- •Team collaboration
Remove User
Remove users from ticket channels for access control.
Use for:
- •Removing users
- •Access control
- •Temporary participants
Close Ticket
Automatically close tickets with optional reason and silent mode.
Use for:
- •Auto-close inactive
- •Close after resolution
- •Scheduled closing
Tag Role
Mention roles in tickets for notifications and escalation.
Use for:
- •Notify teams
- •Escalation
- •Role alerts
Claim Ticket
Automatically assign tickets to staff members for load balancing.
Use for:
- •Auto-assignment
- •Load balancing
- •Round-robin
Update Priority
Change a ticket's priority as part of a flow, for example when triage detects an urgent issue.
Use for:
- •Escalate urgent tickets
- •Set priority on triage
- •Re-prioritize on reply
Add Note
Add an internal staff note to the ticket, visible to your team but not to the ticket creator.
Use for:
- •Record context
- •Hand-off notes
- •Triage findings
Move Category
Move the ticket to a different category, updating its support roles and settings.
Use for:
- •Re-route to the right team
- •Escalation paths
- •Reclassify tickets
Generate Transcript
Save a transcript of the ticket conversation to the configured transcript channel.
Use for:
- •Archive on close
- •Compliance records
- •Supervisor review
Delete Ticket
Permanently delete the ticket channel. A transcript is saved first when auto-transcript is enabled.
Use for:
- •Remove spam tickets
- •Clear test tickets
- •Close-and-purge flows
Wait / Delay
Pause an automation for a set time, up to your plan's max, before the next node runs. Automation only.
Use for:
- •Send a reminder later
- •Stagger follow-ups
- •Wait before auto-close
Wait for Reply
Pause until the ticket opener (or anyone you pick) replies, then branch on reply vs timeout. Automation only.
Use for:
- •Ask for missing details
- •Confirm before closing
- •Chase a stalled ticket
Wait for Reaction
Post a prompt and wait for a reaction, routing each emoji to its own branch, plus a timeout path. Automation only.
Use for:
- •Staff approval gates
- •Yes / no confirmations
- •Route by emoji choice
Letting a button run out
A button posted by an automation flow stays in the channel, so by default anyone can press it as often as they like and the flow runs again each time. Give a button a click limit to cap that. Once the limit is reached the button either greys out or disappears, whichever you pick, and the flow can swap the message text for something else at the same time.
The count is per posted message and shared by everyone, so a limit of 1 makes a claim-once button: the first person to press it takes it. Leave the limit empty and the button keeps working indefinitely.
This applies to automation flows. An interactive flow already replaces its message at every step, so its buttons cannot be pressed twice.
How long a flow can wait
Three nodes pause an automation flow: Wait / Delay parks it on a timer, while Wait for Reply and Wait for Reaction suspend it until someone acts. Wait / Delay is available on Community and Pro; Wait for Reply and Wait for Reaction are Pro only.
One maximum covers whichever of the three your plan can use, and it comes from your plan. Community servers can wait up to
7 days, and Pro raises that to 30 days.
That is long enough for the usual follow-up pattern: ask the member for the missing details, wait a couple of days, nudge them, then close if the ticket is still quiet.
Saving a flow whose wait exceeds the maximum is rejected, so the builder always shows what the flow will actually do.
Waits end with the ticket
If the ticket is closed or deleted while a flow is waiting, the wait is canceled and the run is marked abandoned. A paused flow never resumes into a ticket nobody can reply to.
When a flow loops back on itself
A step wired back to an earlier one can send a run round the same circle over and over. A run that takes 50 steps in a row without any of them doing anything is stopped and marked abandoned.
Bad wiring often only breaks one way of starting the flow. A form step waits for a person, so the flow finishes when someone drives it from a panel, and the same flow can circle when it carries on by itself after a ticket is created, because nothing left in the circle can act without input. So the pause is per trigger: five circling runs on one trigger within 24 hours pause that trigger for 24 hours, and every other way of starting the flow keeps running. Switching the whole flow off would take the working path down with the broken one.
The server owner gets one DM naming the flow and the way of starting it that paused, in plain words rather than internal names. There is nothing to switch back on, since the pause lifts itself when the 24 hours are up, so fix where the last step points before then or it will pause again.
Advanced nodes
Compose flows out of other flow blocks.
Call Flow
Trigger another flow with variable passing for reusable workflows.
Use for:
- •Flow reusability
- •Nested workflows
- •Shared sub-flows
Integration nodes
Call webhooks, external APIs, connected apps, or AI features.
Send Webhook
Send data to external webhooks with custom headers and JSON body interpolation.
Use for:
- •External services
- •Trigger automations
- •Zapier/Make/n8n
API Request
Fetch data from external APIs with authentication and JSONPath extraction.
Use for:
- •User verification
- •Data lookup
- •External integration
AI Logic
AI-powered routing and response generation with knowledge base context.
Use for:
- •Intelligent routing
- •Automated responses
- •Sentiment analysis
AI Summarize
Generate a short summary of the ticket conversation so staff can catch up at a glance.
Use for:
- •Hand-off summaries
- •Quick context
- •Transcript recaps
AI Sentiment / Route
Read the tone of a message and branch the flow, for example sending frustrated users to a priority path.
Use for:
- •Detect frustration
- •Priority routing
- •Escalate by tone
AI Suggested Reply
Draft a reply for staff to review and send, based on the ticket and your knowledge base.
Use for:
- •Faster responses
- •Draft answers
- •Assist new staff
AI Auto Reply
Send an AI-written reply automatically, grounded in your knowledge base, to handle common questions.
Use for:
- •Answer FAQs
- •Reduce ticket load
- •First-line support
Translate
Translate a message between languages so your team can support users in any language.
Use for:
- •Cross-language support
- •Translate replies
- •Global teams
Plan gates
Webhook nodes require Community or higher. API and AI nodes require Pro.
Variables
Most text fields support double-brace variables, for example {{user.username}}.
Common variables:
| Variable | Meaning |
|---|---|
{{user.id}} |
User ID |
{{user.username}} |
Discord username |
{{user.mention}} |
Mention for the user |
{{guild.name}} |
Server name |
{{ticket.number}} |
Ticket number, when a ticket exists |
{{responses.fieldName}} |
Value collected from a modal or select menu |
{{aiOutputs.name}} |
Output saved by an AI node |
When a ticket exists, a few more describe what has happened in it so far:
| Variable | Meaning |
|---|---|
{{ticket.lastMessage.mention}} |
Mention whoever spoke last |
{{ticket.lastMessage.content}} |
The text of that message |
{{ticket.lastStaffReply.mention}} |
Mention the staff member who replied most recently |
{{ticket.staffReplied}} |
true once any staff member has replied |
{{ticket.messageCount}} |
How many messages people have sent, not counting the bot |
{{ticket.lastMessage}} skips the bot's own messages, and skips anonymous dashboard replies so they stay anonymous. If the newest message is one of those, it names the person who spoke before it. Each of these also has a .username and an .id form.
{{ticket.lastMessage.content}} is the text of that same message, and it is empty for an attachment-only reply. It is the right input for an AI node that should judge only what was just said. Leave an AI node's input blank and it reads the last ten messages instead, so it keeps matching on something raised earlier in the ticket.
The {{ticket.*}} variables are not limited to automation flows. A click-started flow gets them too whenever the click happened inside a ticket, which is what lets a workflow button reach the ticket's owner rather than the staff member who pressed it. They are empty in a flow that starts a new ticket, since none exists yet at that point.
Variable names are case-sensitive. If a placeholder appears unchanged in the final message, check that the variable exists earlier in the flow and that the spelling matches.
Seeing every variable while you debug
When a message comes out wrong and you are not sure what the flow actually collected, put {{all_variables}} in a step and run it. It prints every variable available at that point, one per line, with the full name on the left:
ticket.number = 42
ticket.status = OPEN
responses.Email = alice@example.com
responses.What happened? = Cannot log in after the update
api.login.user = alice
api.login.token = «redacted: looks like a credential»
custom._apiStatus = 200
That tells you the exact spelling to use, so a wrong guess like {{responses.email}} becomes an obvious {{responses.Email}}.
Three things to know:
- Values that look like credentials are hidden. Anything under a name like
token,password,api_keyorauthorizationis replaced with a redaction marker, as is any value shaped like a key or token even under an innocent name, and any token quoted inside a longer value such as an error body. Ordinary identifiers are left readable, so the ids in an API response still tell you what came back. This matters most for API Request steps, which can save a whole response body. - It stays empty inside Send Webhook and API Request steps, so a token left in a flow by accident cannot send your run's data to an outside service.
- The output is capped in length and long values are shortened, so a large run will not overflow the message.
Take it out when you are done
The dump is meant for a private or staff-only step while you are working on a flow. Left in a message the ticket opener can see, it shows them form answers and internal values they have no reason to read.
Import, export, and templates
Use Templates to start from common flow shapes such as ask-questions-first, route-by-topic, tag-staff, save-transcript, or warn-then-close.
Use the flow card action menu to Export as JSON. Use Import on the Support Flows page to create a new flow from an exported file. Server-specific IDs are not included, so imported flows still need to be linked to this server's panels, categories, channels, and roles.
Limits by plan
| Limit | Free | Community | Pro |
|---|---|---|---|
| Active flows | 5 | Unlimited | Unlimited |
| Total flows | 10 | Unlimited | Unlimited |
| Webhook nodes | 0 | 10 | Unlimited |
| API request nodes | 0 | 0 | Unlimited |
| AI nodes | 0 | 0 | Unlimited |
| AI tokens / month | 0 | 0 | 5,000,000 |
| Longest flow wait | Not available | 7 days | 30 days |
AI usage and limits
AI nodes require Pro. They share the server's monthly AI token budget, and the Plan & Billing page shows usage, limit, and reset date.
The reply nodes (AI Suggested Reply and AI Auto Reply) have an Include knowledge base switch that grounds the reply in published knowledge base articles and approved AI memory. It is on by default for new nodes, and a node saved without an explicit setting inherits the server-wide grounding default from AI Control. AI Auto Reply can post straight to the customer or run in draft mode, where staff review the reply with Send, Edit, and Discard buttons before anything reaches the customer. The AI Decision and AI Classify routing nodes have an opt-in Ground in knowledge + memory switch that adds the same retrieved context to their verdicts. See AI Assist for the reply modes in full.
If your server brings its own OpenAI-compatible provider key, AI runs on your provider account instead of the included platform budget. Plan limits for how many AI nodes a flow can use still apply.
Troubleshooting
| Problem | Check |
|---|---|
| Flow does not start | It is active and linked to the panel, command, category, or rule that should trigger it. |
| Flow stops mid-run | Every branch has a next node or an intentional end. |
| A trigger stopped firing on its own | It is not looping on that trigger. Five circling runs pause that trigger for 24 hours, and the server owner is DMed once. |
| Variables show literally | The variable name is spelled correctly and exists before it is used. Add {{all_variables}} to a step to see the real names. |
| A variable resolves to nothing | It is set earlier in the run. {{all_variables}} shows what exists at that point and what it is called. |
| Webhook, API, or AI node is disabled | The server plan includes that node type. |
| Modal does not appear | Each modal page has at least one field and no more than five. Longer forms split across multiple pages. |