Custom Commands
Build your own commands without writing code. Choose between simple text responses with dynamic variables, or the visual Block Editor, a drag-and-drop scripting system with conditions, loops, math, persistent storage, and embeds.
Overview
Custom commands are created and managed entirely from the dashboard: open your server, then Custom Commands in the sidebar. Every command has a trigger (what activates it) and a response. There are two response modes:
Text Response
A single message sent back when the command triggers. Supports all template variables. Perfect for FAQs, links, and quick info commands.
Visual Blocks
A sequence of drag-and-drop blocks executed top to bottom: send messages, add roles, check conditions, roll dice, store data, and more. No code required.
Creating a Command
Open the Custom Commands page
In your server dashboard, click Custom Commands, then Create Command.
Set the trigger
Give the command a name/trigger and pick a trigger type. Optionally make it case-sensitive.
Choose a response mode
Pick Text for a simple reply, or Visual Blocks to open the block editor and build logic.
Save and test
Save the command and trigger it in your server. Changes apply instantly, no restart needed.
Trigger Types
CommandThe message starts with the bot prefix + trigger (e.g. !hello)Exact MatchThe whole message equals the trigger text exactlyContainsThe trigger text appears anywhere in the messageRegexThe message matches your regular expression patternThese can fire on normal conversation. Combine them with a cooldown, or use conditions inside the block editor to limit where they respond.
Template Variables
Variables use double curly braces and are replaced when the command runs. They work in text responses and in any text field inside blocks (messages, embed fields, database keys…).
User
{{user}}Mentions the user (@Username){{user.id}}The user's Discord ID{{user.username}}Username as plain text{{user.displayname}}Server display name (nickname if set){{user.avatar}}URL of the user's avatar imageServer
{{server}}Server name{{server.id}}Server ID{{server.membercount}}Current member count{{server.icon}}URL of the server iconChannel
{{channel}}Mentions the channel (#channel){{channel.id}}Channel ID{{channel.name}}Channel name as plain textArguments
Arguments are the words a user types after the trigger. For example, in !say hello world, the arguments are "hello world".
{{args}}Everything after the trigger{{args.0}}The first argument (then {{args.1}}, {{args.2}}…)Custom Variables
Any variable you create with the Set Variable, Random Number, math, or database Get Value blocks becomes available as {{yourVariableName}} in all later blocks.
Hey {{user}}, welcome to {{server}}! We're now {{server.membercount}} members strong.The Block Editor
Blocks run from top to bottom. Drag them from the palette, fill in their settings, and reorder freely. Condition and loop blocks contain nested blocks that only run when their condition passes.
Actions
Send MessageSends a message to the channelReply to UserReplies directly to the triggering messageSend DMSends a private message to the user (silently skipped if their DMs are closed)Add ReactionReacts to the triggering message with an emojiDelete TriggerDeletes the message that triggered the commandAdd RoleGives the user a roleRemove RoleRemoves a role from the userWaitPauses execution for 1–60 secondsConditions
Each condition holds nested blocks that only run when it passes. Every condition can be negated ("if NOT…").
If Has RoleThe user has the selected roleIf In ChannelThe command ran in the selected channelIf Is AdminThe user has the Administrator permissionIf Message ContainsThe trigger message contains specific textRandom ChanceA configurable percentage roll succeeds (e.g. 25%)Variables
Set VariableStores a value under a name for use as {{name}} laterUser / Server / Channel / ArgumentsReference cards listing the built-in variables; they don't execute anythingControl Flow
RepeatRuns its nested blocks 1–10 timesStopImmediately ends command executionMath
Random NumberStores a random integer between min and max in a variableAdd / Subtract / MultiplyComputes a result from two values and stores it in a variableEmbeds
Send EmbedSends a rich embed to the channelReply with EmbedReplies to the user with a rich embedDatabase blocks get their own section below.
Command Database
The database blocks give your commands memory. Each server gets its own key-value store that persists between command runs, ideal for counters, scores, opt-in lists, and daily streaks.
Get ValueReads a key into a variable (with a default if missing)Set ValueWrites a value to a keyAdd to NumberIncrements a numeric key and stores the new total in a variableCheck ExistsStores whether a key exists (true/false) in a variableDelete ValueRemoves a key entirelyUser-Scoped Keys
Every database block has a user-scoped toggle. When enabled, the key is stored separately per user, so points with user-scope on gives every member their own counter, while the same key without user-scope is shared by the whole server.
Keys support variables too: a key like warnings-{{user.id}} achieves manual per-user storage if you need to mix scopes.
You can inspect and manage all stored values on the dashboard's Custom Commands → Database page.
Embeds
The embed blocks open a mini embed builder. Every field accepts template variables.
TitleBold heading at the top of the embedDescriptionMain body text (supports Discord markdown)ColorHex color of the embed's side bar (defaults to teal)AuthorSmall header line with optional icon URLThumbnailSmall image in the top-right cornerImageLarge image below the descriptionFieldsName/value pairs, optionally displayed inline side by sideFooterSmall text at the bottomCooldowns
Prevent spam by setting a cooldown in seconds (0 = none). The scope decides who shares the timer:
Per UserEach member has their own cooldownPer ChannelOne timer per channel, shared by everyone in itPer ServerOne global timer for the whole serverExamples
1. Simple FAQ (Text Response)
Trigger type Command, trigger ip:
Our Minecraft server IP is **play.example.com**. See you there, {{user.displayname}}!2. 8-Ball (Blocks)
rollThe magic 8-ball says: answer #{{roll}}…3. Per-User Daily Counter (Blocks + Database)
daily-claims, user-scoped, +1 → variable totalDaily Reward, description {{user}} you've claimed {{total}} rewards so far!4. Role-Gated Response (Blocks)
5. Server Stats (Blocks + Embed)
{{server}} Stats, thumbnail {{server.icon}}, field Members = {{server.membercount}}Limits & Tips
Wait block1–60 seconds per blockRepeat block1–10 iterationsTriggersCommands only fire for humans; bot messages are ignoredAdd Role / Remove Role blocks only work if Natsumi's bot role is above the target role in the server's role list.
Start with a Reply block to confirm the trigger works, then add conditions and storage one block at a time. Disabled commands keep their blocks, so you can pause a command while reworking it.