---
title: Custom commands
description: Your own chat commands - with variables, random picks, response lists, permissions, and cooldowns.
---

Custom commands are on the **Chat bot** page under the **Custom** tab. Hit **Add command** and fill in:

- **Command name** - lowercase letters, numbers, `_` and `-`. Don't type the `!`, it's added for you.
- **Response** - what the bot says. Variables below.
- **Aliases** - extra triggers, comma or space separated.
- **Permission** - Everyone, Subscribers, or Moderators. Checked from the viewer's badges on whichever platform they typed in, so it works the same in Twitch and Kick chat.
- **Cooldown** - 0 to 3600 seconds, with a scope of **Global** (one timer for the whole chat) or **Per user**.
- **Show on your tip page's command list** - whether it appears at `/commands` on your tip page (the `!commands` built-in links there). Off = still works in chat, just not listed.
- **What viewers see** (optional) - a plain one-liner for that list, like "Ask the bot anything". See [The tip page listing](#the-tip-page-listing).
- **Platforms** - shown once you have both Twitch and Kick connected: a switch per platform, so a command can answer in one chat and stay silent in the other. Both on by default; with a single platform connected everything simply runs there.

{/* SCREENSHOT /images/chat-bot/custom-command-editor.png : The custom command editor open with a filled-in example command - name, response using a {user} variable, permission and cooldown set. Uncomment the Frame below once taken. */}
{/* <Frame caption="The command editor - variables, permissions, cooldowns.">
![The custom command editor](/images/chat-bot/custom-command-editor.png)
</Frame> */}

## Variables

Curly braces are blanks the bot fills in when it speaks. The basics:

| Variable | Becomes |
| --- | --- |
| `{user}` | The name of whoever ran the command |
| `{touser}` | Who the command is aimed at - the first word typed (minus any `@`), or the viewer themselves |
| `{args}` / `{arg:1}` … `{arg:9}` | Everything the viewer typed after the command / the Nth word of it |
| `{pick:a\|b\|c}` | One of the options, at random |
| `{random:1-100}` | A random whole number in the range |
| `{list:name}` | A random line from one of your response lists |
| `{if:…\|yes\|no}` | One text or the other, depending on a comparison |
| `{count}` | A counter that bumps every time the command runs |
| `{uptime}`, `{game}`, `{title}`, `{viewers}` | Live facts about your stream |
| `{ai:prompt}` | A one-line reply from an AI model |

So `Hey {user}, {pick:good luck|no refunds|welcome aboard}!` works exactly
how you'd hope - and variables **nest**, so
`{if:{random:0-1}==1|Heads|Tails}` does too.

That's a taste. The full list, with a page for each, is in
[Variables](/chat-bot/variables) - including `{repeat:}`, `{followage}`,
`{emote}`, `{7tv}`, `{urlfetch:}` and the URL encoders.

## The tip page listing

Your tip page has a `/commands` page listing every enabled command, so viewers
can see what's available without asking. For custom commands it shows the
**What viewers see** text if you've written one. If you haven't, it shows your
response with each variable turned into a label - `Hey {user}: {list:quotes}`
reads as "Hey **your name**: **random line · quotes**".

Two things are never shown there, whatever you wrote: the address inside
`{urlfetch:}` and the prompt inside `{ai:}`. A viewer only sees "live data" or
"AI reply". If you'd rather a command wasn't listed at all, switch off **Show on
your tip page's command list** in the editor. It keeps working in chat.

## Response lists

For long random pools, make a **Response list** (third tab): give it a name, paste one line per item, and reference it from any command with `{list:name}`. The bot picks a random line each time. One list can feed as many commands as you like.

## Good to know

- Built-in commands win: if you name a custom command `!queue`, the built-in answers.
- Each command has an enable toggle, so you can bench one without deleting it.
- Commands work the same in Twitch and Kick chat. `{uptime}`, `{title}`, `{game}` and `{viewers}` read the channel the message came from (or any channel you name - `{viewers:kick}`, `{game:twitch:somebody}`). A few [variables](/chat-bot/variables) have no Kick source yet (`{accountage}`, `{emote}`, `{emotes}`, `{bttv}`, `{ffz}`) and render empty there - the variables index has the full table.
- Responses that would start with `/` or `!` are refused - no, viewers can't make your bot run `/ban`.
