Modules
Workflows
Draw automations on a canvas: triggers, checks, actions and flow steps, a node reference, variables and six templates.
Workflows are the Module Maker drawn as a picture. You put a trigger on the canvas, wire it to checks and actions, and the bot follows the wires every time the trigger happens. A check splits the path in two, every action can go one way when it works and another when it does not, and you can watch a test run light up the path step by step before anything goes live.
Where it is
Dashboard, pick your server, then Workflows under Tools. Your old custom modules stay on the Module maker page and keep running exactly as before; workflows are separate.
Build one#
- 1Start. Press New workflow, or pick a template (they are listed below). A template opens as a draft with the channels and roles it still needs marked in red.
- 2Add steps. Drag a step from the left onto the canvas, or click it to drop it next to the step you have selected, already wired to its first free output. The search box (press
/) finds a step by name. - 3Wire it. Drag from an output dot on the right of a step to the input dot on the left of another. A wire that would make a loop, or lead into a trigger, is refused. Click a wire and press Delete to remove it.
- 4Set it up. Click a step to open its settings on the right. Any text box with a
{ }button takes variables. Messages can use a saved embed from the Embed Builder. - 5Check it. The badge at the top says Valid, or how many things need fixing. Broken steps have a red ring, and an output that must lead somewhere has a red dot. Click the badge for the list; click a line to jump to the step.
- 6Test it. Test run fires the trigger once with you as the member and animates the path. It is a dry run unless you switch that off and pick a test channel: then messages and replies post in that channel and roles change on you for real.
- 7Publish. Save keeps a draft. Publish makes it live and keeps a version you can bring back from Workflow settings. Editing a live workflow changes the draft only, until you publish again. A button or menu trigger posts its message in the channel when you publish.
Keyboard#
| Keys | Does |
|---|---|
| Ctrl+S | Save the draft |
| Ctrl+Z, Ctrl+Shift+Z (or Ctrl+Y) | Undo, redo |
| Delete or Backspace | Delete the selected steps or wires |
| Ctrl+D, Ctrl+C then Ctrl+V | Duplicate, copy and paste steps |
| F | Fit everything on screen |
| / | Search the steps |
| Esc | Deselect and close panels |
| ? | Show the shortcuts |
Node reference#
Triggers (When)#
Every workflow starts with exactly one. It decides when the workflow runs and what the steps after it know: the member, the channel, the message, the button they clicked.
| Step | What it does | Settings | Outputs |
|---|---|---|---|
| Button clicked | When a member clicks one of this workflow's buttons | Post the buttons in; Message above the buttons; Buttons | One per button |
| Select menu chosen | When a member picks from this workflow's menu | Post the menu in; Message above the menu; Menu placeholder (optional); Options; How many they can pick (optional) | Then |
| Message sent | When a member sends a message | Only in these channels (optional); Only when it contains (optional) | Then |
| Member joins | When someone joins the server | Nothing to set | Then |
| Member leaves | When someone leaves the server | Nothing to set | Then |
| Reaction added | When a member reacts to a message | Emoji; Only on this message (id) (optional); Only in this channel (optional) | Then |
| Role added | When a member is given a role | Only these roles (optional) | Then |
| Role removed | When a role is taken off a member | Only these roles (optional) | Then |
| Slash command | When a member uses /server custom | Command name (/server custom <name>) | Then |
| Scheduled | On a schedule | When; Channel it runs in (optional) | Then |
| Voice channel joined | When a member joins a voice channel | Only these voice channels (optional) | Then |
| Voice channel left | When a member leaves voice | Only these voice channels (optional) | Then |
| Voice channel moved | When a member moves between voice channels | Only these destination channels (optional) | Then |
| Form submitted | When a member sends one of your Forms | Form | Then |
Conditions#
A check has two outputs, the first when it holds and the second when it does not. Wire either one, or both.
| Step | What it does | Settings | Outputs |
|---|---|---|---|
| Role filter | Branches on whether the member has matching roles | Roles; Match (optional) | Has role, Missing |
| Channel filter | Only continues when it happened in one of these channels | Channels | In channel, Elsewhere |
| User filter | Branches on whether the member is one of these people | Members | Match, No match |
| Permission check | Branches on whether the member holds a permission | Permission | Allowed, Denied |
| Text contains or matches | Branches on a piece of text | Text to check; How (optional); Looks for; Case sensitive (optional) | Match, No match |
| Cooldown | Lets it through once per time window | Seconds; Per (optional) | Ready, Cooling down |
| Random chance | Rolls the dice | Chance (%) | Hit, Miss |
| Compare variable | Compares two values | Value; Is; Than (optional) | True, False |
| Account age | Branches on how old their Discord account is | At least (days) | Old enough, Too new |
Actions#
Every action has a Success and a Failure output. If the bot is missing a permission (Manage Roles, a role above its own, Timeout Members, sending in that channel) or Discord says no, the run goes down Failure instead of stopping.
| Step | What it does | Settings | Outputs |
|---|---|---|---|
| Send channel message | Sends a message to a channel | Channel (blank: where it happened) (optional); Message | Success, Failure |
| Send direct message | DMs the member | Message | Success, Failure |
| Reply | Replies to the click, the command or the message | Message; Only they can see it (optional) | Success, Failure |
| Show form | Opens a form for the member | Form title; Questions | Submitted, Failure |
| Add role | Gives the member roles | Roles (optional); Or the roles picked in form question (optional) | Success, Failure |
| Remove role | Takes roles off the member | Roles (optional); Or the roles picked in form question (optional) | Success, Failure |
| Set nickname | Changes the member's nickname | Nickname (blank resets it) (optional) | Success, Failure |
| Timeout | Times the member out | Minutes; Reason (optional) | Success, Failure |
| Kick member | Kicks the member from the server | Reason (optional) | Success, Failure |
| Ban member | Bans the member from the server | Reason (optional); Delete recent messages (optional) | Success, Failure |
| Move in voice | Moves the member to a voice channel | Move to | Success, Failure |
| Disconnect from voice | Disconnects the member from voice | Nothing to set | Success, Failure |
| Add reaction | Adds an emoji to the message that triggered the workflow | Emoji | Success, Failure |
| Delete trigger message | Deletes the message that started the workflow | Nothing to set | Success, Failure |
| Create text channel | Creates a text channel in the server | Channel name; Topic (optional) | Success, Failure |
| Create thread | Opens a thread | Thread name; Channel (blank: where it happened) (optional); Private thread (adds the member) (optional) | Success, Failure |
| Server currency | Adds or removes server currency | Do; Amount | Success, Failure |
| Give XP | Gives the member server XP | XP | Success, Failure |
| Open a ticket | Opens a ticket for the member | Ticket type | Success, Failure |
| Set variable | Stores a value for later | Kept per; Name; Do; Value (optional) | Success, Failure |
| Call webhook | Posts JSON to an HTTPS address | HTTPS address; Extra JSON (optional) (optional) | Success, Failure |
Flow#
Steps that shape the run rather than do something in Discord.
| Step | What it does | Settings | Outputs |
|---|---|---|---|
| Delay | Waits before continuing | Wait | Then |
| Wait for reply | Waits for the member to say something in the channel | Give up after | Replied, Timed out |
| Branch | Runs up to three paths, one after the other | Nothing to set | Path 1, Path 2, Path 3 |
| Merge | Joins paths; what comes after runs once | Nothing to set | Then |
| Stop | Ends the run here | Nothing to set | None |
A form can only open as the first answer to a click, a menu pick or a slash command, within 3 seconds, so keep Show form right after the trigger or a check. A menu question in a form can list roles, and Add role or Remove role can take the roles picked in that question. Branch runs its paths one after the other; Merge lets what comes after it run once however many paths reach it.
Variables#
Type them in any text, or insert them with the { } button next to the box.
| Variable | Is | Example |
|---|---|---|
| {member} | Member name | Dom |
| {member.mention} | Member mention | @Dom |
| {member.id} | Member id | 1234 |
| {member.username} | Member username | dom |
| {server} | Server name | Dispresso |
| {server.members} | Member count | 812 |
| {channel} | Channel name | general |
| {channel.mention} | Channel mention | #general |
| {message} | Message text (after Message sent) | hello |
| {reply} | Their reply (after Wait for reply) | yes |
| {button.label} | Button clicked (after Button clicked) | Join |
| {select.labels} | Options chosen (after Select menu chosen) | Server 1, Server 3 |
| {select.values} | Values chosen (after Select menu chosen) | s1, s3 |
| {role} | Role given or taken (after Role added or Role removed) | @Member |
| {emoji} | Reaction emoji (after Reaction added) | 👍 |
| {voice.before} | Previous voice channel (after Voice channel left or Voice channel moved) | Lobby |
| {voice.after} | New voice channel (after Voice channel joined or Voice channel moved) | Gaming |
| {form.<field>} | A form answer (after Show form or Form submitted) | {form.age} |
| {var.<name>} | Server variable | {var.giveaway_count} |
| {user.var.<name>} | Member variable | {user.var.points} |
| {date} | Today (UTC) | 2026-09-29 |
| {time} | Time now (UTC) | 18:04 |
Set variable keeps a value per member ({user.var.name}) or for the whole server ({var.name}), set, added to or taken from. A variable nobody has set yet reads 0. Compare variable checks one against a number or a word.
Templates#
| Template | What it does | You fill in |
|---|---|---|
| Server selection | A button opens a menu of your servers. Picking gives the roles; clicking again with a role takes them off. | The channel for the button; The server roles, on the check, the menu and Remove role |
| Role menu with a confirmation | A menu of roles. Members pick, get the roles and a private confirmation of exactly what they got. | The channel for the menu; One option per role (the value is the role) |
| Verification gate with a form | A Verify button checks the account is not brand new, asks two questions and hands over the member role. | The channel for the Verify button; The role verified members get |
| Staff application to a ticket | An Apply button, once a day per member, asks three questions and opens a ticket with the answers inside. | The channel for the Apply button; The ticket type applications open |
| Giveaway entry | An Enter button that lets each member in once and keeps a running count of entries. | The channel for the Enter button |
| Welcome flow | Greets every new member, gives established accounts the member role and flags brand new accounts to staff. | The welcome channel; The member role; The staff channel for new-account flags |
| Keyword auto-responder | Watches selected channels for a word or phrase, then replies without pinging the author. | The channels to watch; The phrase to match; The reply |
| Question of the day | Posts one conversation prompt every day at the time you choose. | The time and channel; The daily question |
| Reaction role | Gives a role when somebody reacts to one specific message with the emoji you choose. | The emoji and message id; The role to give |
| Suggestion box | A button opens a short form, posts the suggestion, and adds voting reactions. | The panel channel; The suggestion channel |
Plans#
The editor, test runs and run history are free on every server. The plan sets how many workflows run at once and how big they are.
| Free | Server Boost | Server Elite | |
|---|---|---|---|
| Published workflows | 3 | 15 | 50 |
| Steps per workflow | 15 | 40 | 100 |
| Longest delay | 5 minutes | 1 day | 7 days |
| Longest wait for a reply | 5 minutes | 1 hour | 1 day |
| Steps one run can take | 40 | 120 | 300 |
| Runs per minute, per workflow | 30 | 120 | 300 |
A server with a live Custom Bot Instance gets the Server Elite limits.
Safety rails#
| Rail | What happens |
|---|---|
| Loops | A wire that closes a loop is refused in the editor and at publish. To go round again, use a second trigger. |
| Permissions | The bot checks before it acts and never does what it is not allowed to; that step takes Failure. |
| Runaway runs | A run stops at its plan's step limit. A member can fire one workflow 8 times in 10 seconds at most, and two workflows that give each other's roles stop after 3 rounds. |
| Webhooks | Call webhook posts JSON to a public https address only, never a local or private one, at most 20 calls a minute per server, 5 seconds to answer. |
| Mentions | Messages never ping @everyone, @here or a role, even if the text says to. |
| Run history | The last 50 runs of each workflow, with every step it took, what it did and why a step failed. Open one to see its path on the canvas. |
Share a workflow#
Workflow settings has Export (a JSON file) and Duplicate. Import on the Workflows page takes an exported file from any server; channels, roles and members that are not in your server are left empty for you to pick, so nothing points somewhere it should not.