Custom Commands
Build your own commands for your server with a full scripting engine — variables, conditions, and actions like sending messages, adding roles, and more.
What custom commands do
Custom commands let you create commands unique to your server. Unlike autoresponders (which simply reply to matching messages with canned text), custom commands are invoked deliberately by name and can run real logic: read variables, branch on conditions, take arguments, and perform actions such as sending embeds, assigning or removing roles, adding reactions, or replying with dynamic content.
They are the most powerful utility tool in exceed — anything from a ,rules command to a multi-step, role-gated workflow.
Setting up custom commands (dashboard)
Open the Custom Commands page on the dashboard. Toggle the feature on, then create commands with a name, trigger, and a script body. The manager also surfaces your server's roles and channels so you can wire them into actions.
Note: The Custom Commands feature is off by default. Enable it on the dashboard before your commands will run.
The Script API
Custom command scripts have their own mini-language with variables, conditionals, loops, and a library of actions. That reference is large and lives on its own page:
Head there for the full list of available variables, control-flow syntax, and every action you can call, with examples.
Last.fm and live data tokens
Standard custom commands can use a few extra {variable} tokens that resolve live data when the command runs. They work in the response text and in actions, just like {user.*} and the other built-in variables.
Last.fm
{lastfm.*} is auto-filled from the command runner's linked Last.fm account. The member must link Last.fm with the bot's lastfm command first.
{lastfm.user}: their Last.fm username{lastfm.url}: their profile URL{lastfm.track}: current or last track name{lastfm.artist}: that track's artist{lastfm.album}: that track's album{lastfm.image}: album art URL{lastfm.nowplaying}:trueorfalse{lastfm.status}:Now playingorLast played{lastfm.scrobbles}: total scrobbles{lastfm.topartist}: their number one artist{lastfm.toptrack}: their number one track
A simple now-playing command:
{lastfm.status}: {lastfm.track} by {lastfm.artist}
Scrobbles: {lastfm.scrobbles}
External lookups
These tokens take arguments after a colon and pull from outside services. Results are cached for about a minute, and any lookup that fails renders an empty string.
Crypto
{crypto:<coin>}: USD price, e.g.{crypto:bitcoin}or{crypto:eth}{crypto:<coin>:change}: 24h percent change{crypto:<coin>:marketcap}: market cap in USD
Currency
{currency:<amount>:<from>:<to>}: currency conversion, e.g.{currency:100:USD:EUR}
Minecraft
{minecraft:<name>}: the player's UUID{minecraft:<name>:name}: the player's current name{minecraft:<name>:avatar}: avatar image URL{minecraft:<name>:skin}: skin image URL{minecraft:<name>:body}: body render image URL
Weather
{weather:<city>}: short summary like19.5°C in London{weather:<city>:temp}: temperature{weather:<city>:humidity}: humidity{weather:<city>:wind}: wind speed{weather:<city>:city}: resolved city name
GitHub
{github:<user>}: follower count, e.g.{github:torvalds}{github:<user>:repos}: public repo count{github:<user>:name}: display name{github:<user>:bio}: profile bio{github:<user>:avatar}: avatar image URL{github:<user>:url}: profile URL{github:<owner>/<repo>}: star count, e.g.{github:facebook/react}{github:<owner>/<repo>:forks}: fork count{github:<owner>/<repo>:language}: primary language{github:<owner>/<repo>:issues}: open issue count{github:<owner>/<repo>:description}: repo description{github:<owner>/<repo>:url}: repo URL
Pokemon
{pokemon:<name>}: name and types, e.g.{pokemon:pikachu}{pokemon:<name>:id}: Pokedex number{pokemon:<name>:types}: type list{pokemon:<name>:height}: height{pokemon:<name>:weight}: weight{pokemon:<name>:sprite}: sprite image URL
Reference
{dictionary:<word>}: first definition (alias{define:<word>}){urban:<term>}: top Urban Dictionary definition{npm:<package>}: latest version, e.g.{npm:react}{npm:<package>:description}: package description{npm:<package>:license}: package license{npm:<package>:homepage}: package homepage URL
A price command:
Bitcoin is at ${crypto:bitcoin} ({crypto:bitcoin:change}% today).
No-argument tokens
These take no arguments at all. Drop the bare token in and it resolves on each run. They refresh quickly rather than caching for a minute, and still render an empty string if the lookup fails.
{advice}: a random piece of advice{joke}: a random safe joke{cat}: a random cat image URL{dog}: a random dog image URL
Related tools
- For automatic canned replies with no command name, use Autoresponders.
- For rich message templates and a live preview, use the Embed Builder.
- For trigger/action workflows, see the Automations page on the dashboard.