Automations
Eranio Published on: 13. October 2026
Automations
This page is the builder heart of your bot: you link a trigger (a chat command, a channel-points reward, a TikTok gift, a TikTok event, or a spoken word) with an action (a counter, a text response, awarding points, an overlay alert, and much more). Each automation is a standalone rule: "If X happens, do Y."
Menu: Bot → Automations
Page overview
At the top you see two small settings fields for the meta commands (more on that in a moment), then the header with the actions Action Overview, Open voice control, New Automation and the group Data Management (StreamElements Import, JSON Import, Export). Below that is the table with all existing automations: Name, Trigger, Action, Permission, and Status (Active/Inactive), with row actions Edit, Activate/Deactivate, and Delete.
If no automation exists yet, you see instead "No automations yet. Create your first one!"
The meta commands: Commands Trigger and Minigames Trigger
At the very top of the page you can set two fixed commands:
| Field | What it does | Default |
|---|---|---|
| Commands Trigger | Lists all your currently active chat commands, e.g. "Commands: !discord, !social" | !commands |
| Minigames Trigger | Lists all enabled minigames with their commands, e.g. "Minigames: !slots, !coinflip, !roulette" | !minigames |
Both fields must start with !. If you enter a word without !, it's added automatically. If you leave a field empty, it reverts to the default when you save.
When a viewer calls your Commands Trigger (e.g. !commands), the bot lists all active chat command automations on your channel with their exact command word. If there are none, it tells them to use !addcmd.
Create a new automation
Click New Automation. The form has three parts: Name, Trigger, and Action.
Name
A free-form name you see only on this page (up to 80 characters). It appears in the table and, with certain actions, as part of the name in internal log entries.
Trigger type
This documentation covers Twitch triggers in detail. Which trigger types you get depends on which platforms you've linked. A trigger that needs a specific platform shows its name in parentheses (e.g. "Channel Points Reward (Twitch)") if not all your platforms support it.
Chat command
A classic chat command like !checkin. Fields:
| Field | What it does | Default |
|---|---|---|
| Command | The word the bot responds to. Must start with !, e.g. !checkin |
- |
| Applies to | Only visible if you've linked multiple platforms or don't want your chat commands on Twitch only. Sets which platforms this command works on in chat. Replies to TikTok appear in the "Bot message" overlay widget, as the bot can't write to the TikTok chat | Twitch |
| Who may use this command? | Permission level, see below | Everyone |
A command word can only be assigned once per channel. If you try to create an existing command, you get the message "The trigger :trigger already exists in this channel."
Permission levels (field "Who may use this command?"):
| Level | Who may use it |
|---|---|
| Everyone | Any viewer |
| Subscribers | Subscribers and up |
| Founders | Founders and up |
| VIPs | VIPs and up |
| Moderators | Moderators and you |
| Broadcaster only | Only you |
The levels are tiered: if you choose "Moderators," you automatically include yourself. If a viewer below the required level calls the command, nothing happens. The bot doesn't answer, there's no error message in chat, the call is simply silently ignored.
Channel Points Reward
Links a real Twitch channel-points reward with an action. Fields:
| Field | What it does |
|---|---|
| Reward | Pick an existing reward from your channel, or create a new one directly (title + cost in channel points) |
| Daily limit (per viewer) | 0 = unlimited. When exceeded, channel points are refunded automatically |
| Reset the limit | Only visible if the daily limit is above 0. "Once a day" or "Every time you go live" |
| Message when the daily limit is reached | Optional chat message, placeholder {user} |
| Only allow while the channel is live? | Off by default. When on, the reward only works during streams. Redemptions made offline are refunded automatically |
| Message when redeemed offline | Optional chat message, placeholder {user} |
The daily limit resets at 4am, not midnight, so a stream running past midnight doesn't get split in half. "Every time you go live" additionally lets each viewer use the limit again per stream on the same day.
When you choose "Stream Streak" as the action's counting mode (see "Counter" action below), the daily limit and "Only while the channel is live" fields disappear, with the note: "The Stream Streak counter already limits itself to once per stream and refunds channel points on its own, an extra daily limit isn't needed here, so it's hidden." This counting variant handles its own limit internally.
Voice command
The microphone triggers the automation, not chat. Works the same on Twitch and TikTok because it doesn't depend on chat. Only field:
| Field | What it does |
|---|---|
| Trigger word | The word you say into your microphone, e.g. "dragon". Case doesn't matter |
Voice recognition runs in your browser on the Live Control Room page (reachable via "Open voice control" button at the top of this page) and must be active there for the word to be recognized. There's deliberately no locally installed software; only a recognized match is sent to the server.
A voice command has no permission level and no viewer name (it runs under your own account as the trigger), so text placeholders in an action triggered by voice like {user} etc. refer to you.
TikTok Gift and TikTok Event
TikTok: planned and in progress.
The action
After the trigger, you choose in the Action field what should happen. There are 25 action types. Via the Action Overview button at the top of the page you can open a summary with description, example, and all placeholders for each action.
Base placeholders
These placeholders work in (almost) every text field of every action, plus the action-specific ones below:
| Placeholder | Meaning |
|---|---|
{user} |
Who triggered the action (with @, don't add another @ yourself) |
{touser} |
The person mentioned via @target, otherwise the caller (with @) |
{random_user} |
A random viewer active in the last 15 minutes (with @) |
{channel} |
The streamer/channel name the bot is answering on |
{icon} |
Your currency symbol (e.g. ⭐) |
{currency} |
The name of your loyalty currency (e.g. Bellas). {pointsname} works as an equivalent alias |
{balance} |
The caller's current point balance |
{uptime} |
How long the stream has been running, or "Offline" |
{viewers} |
Current viewer count |
{title} |
Current stream title |
{game} |
Currently shown game/category |
{followers} |
Current follower count |
{subscribers} |
Current subscriber count |
{rank} |
The caller's watch time level (Newcomer/Viewer/Fan/Veteran/Legend) |
Two actions (Trigger alert in overlay, Overlay Designer: Trigger widget) don't use a text template at all, so these placeholders don't apply to them.
All actions in detail
Counter
Counts something up in three possible ways.
| Field | What it does | Default |
|---|---|---|
| Counting mode | "Channel only" (one shared counter for all, e.g. !death), "Per viewer" (each person has their own), or "Stream Streak" (once per stream, series counts up) |
Per viewer |
| Reset the series if a stream was missed | Only in Stream Streak mode. Off by default: the series just keeps counting up at every check-in, no matter if streams were missed in between. On: a missed stream resets the series back to 1 | Off |
| Behavior without @target user | Only in "Per viewer" mode. "Increase own counter" or "Only show own count, don't increase" (e.g. for !kiss @user) |
Increase |
| Response text | The chat reply | - |
| Text on second trigger in the same stream | Only in Stream Streak mode. Appears when triggered a second time in the same stream. For a channel-points reward, the points are refunded automatically | - |
| Text when the channel is offline | Only in Stream Streak mode. Appears when check-in happens offline (no running stream to count); points are also refunded automatically | "Check-in only works while the stream is running! 📴" |
If a viewer includes an @user in the chat command (e.g. "!kiss @bob"), that person's counter is always increased, regardless of the "Behavior without @target user" setting.
Additional placeholders beyond base ones: {count} (current value), {streak} (current series, only filled in Streak mode), {longest} (longest series so far, only in Streak mode), {random(min,max)} (random number in the given range, e.g. {random(1,6)}), {random_text:option1|option2|option3} (picks one of the pipe-separated options randomly).
Example: Command !death → each call increases a shared channel counter, the bot says "Deaths: 42".
This action supports an additional lookup command (see below "Lookup command").
Text response (without counter)
Posts a fixed text, or picks a random line from the response text if random mode is on.
| Field | What it does | Default |
|---|---|---|
| Pick a random variant | Each line in the response text becomes its own answer option | Off |
| Response text | The chat reply (in random mode: one option per line) | - |
Additional placeholders beyond base ones: {random(min,max)}, {random_text:option1|option2|option3}.
Example: Command !slap → "{user} slaps {touser} with {random_text:a huge fish|a tiny eel|a big hammer}!"
Award loyalty points
Awards a fixed amount of your loyalty points.
| Field | What it does | Default |
|---|---|---|
| Points amount | How many points to award (minimum 1) | 10 |
| Response text (optional) | Leave empty for no chat reply | - |
Additional placeholders beyond base ones: {amount} (the awarded amount).
Example: Channel Points Reward "Bonus Points" → viewer gets 50 Bellas credited.
Convert channel points (to loyalty points)
Actually converts spent channel points at a fixed rate to your loyalty currency. Only makes sense with a Channel Points Reward as the trigger: if you use this action on a chat command, nothing happens because no real channel points were spent.
| Field | What it does | Default |
|---|---|---|
| Exchange rate | How many loyalty points per 1 spent channel point. Rate 0.5 and a reward for 100 channel points gives 50 loyalty points | 1 |
| Response text (optional) | Leave empty for no chat reply | "🔄 Exchange successful! @{user} traded {cost} channel points for {amount} {currency}. You now have {balance} {currency}!" |
If the rate rounds to 0 points (too low), the spent channel points are refunded automatically instead of charging for nothing.
Additional placeholders beyond base ones: {cost} (channel points spent), {amount} (loyalty points credited).
Example: Reward "Exchange" (100 channel points) with rate 0.5 → viewer gets 50 Bellas.
Trigger alert in overlay
Triggers an alert on an "Alert: Bot" widget of one of your overlays (freely customizable: text, image/video, sound, animation, just like follower, sub, tip, cheer, and raid alerts).
| Field | What it does |
|---|---|
| Target overlay | The overlay where the "Alert: Bot" widget lives |
| Target widget | Optional. Which specific bot widget on the chosen overlay should respond. Leave empty to filter by label instead |
| Label | Freely chosen, e.g. "checkin". Appears in the alert text of the widget as placeholder {alert_type} and is only needed for routing if no target widget was chosen |
This action doesn't use its own text placeholders in this form; you set text, image, and sound directly on the "Alert: Bot" widget in the overlay designer.
Example: Command !checkin with label "checkin" → on the chosen overlay, the check-in animation stored in the matching widget filter appears.
Overlay Designer: Trigger widget (TTS/Ad/Lucky Wheel/Text)
Triggers one of your triggerable overlay designer widgets.
| Field | What it does |
|---|---|
| Widget | The target widget. TTS, Ad, Lucky Wheel (spins), or Text (switches to next text, or to a specific one with a number after the command) |
No action-specific text placeholders.
Example: Channel Points Reward "Text-to-Speech" with text input → the entered text is read aloud in the overlay.
Send Discord webhook
Posts a message to a Discord channel via a webhook link.
| Field | What it does |
|---|---|
| Discord webhook URL | The target webhook address from Discord |
| Message template | The sent text |
Additional placeholders beyond base ones: {user} (here as an exception WITHOUT @, since Discord mentions work differently than in Twitch chat).
Example: Command !bug → reports the call automatically in your internal Discord channel.
Send HTTP request
Calls any external, publicly reachable web address, optionally with the reply in chat.
| Field | What it does | Default |
|---|---|---|
| Method | GET or POST | GET |
| Target URL | The address called. Only publicly reachable addresses; internal/private ones are rejected | - |
| Request content (JSON, POST only) | Optional JSON template for the POST body, e.g. {"user": "{user}", "amount": "{amount}"}. Leave empty for the default body {"user": "..."} |
- |
| Chat reply (optional) | Leave empty for a silent call with no chat reply | - |
Additional placeholders beyond base ones: {response.field} or {response.nested.field} access the JSON response from the called API via dot notation (e.g. {response.main.temp}).
Example: Command !weather calls a weather API and posts "18°C, cloudy" with {response.temp} in the response text.
Lurk mode
Marks a viewer as "in lurk" and automatically reports their return once they type again.
| Field | What it does | Default |
|---|---|---|
| Message when lurk starts | Chat reply when triggered | "{user} is now in lurk mode! 🫥" |
| Message on return | Chat reply once the viewer types again | "{user} is back! Was {duration} in lurk. 👋" |
Additional placeholders beyond base ones: {duration} (how long the viewer was in lurk, only filled in the return message).
Example: Command !lurk → "X is now in lurk mode!", later on next message: "X is back! Was 45 minutes in lurk."
Add command (Viewer suggests, you approve)
Lets viewers suggest their own chat command via channel points reward. The suggestion never goes live immediately, but waits for your approval or rejection.
| Field | What it does | Default |
|---|---|---|
| Confirmation message | Reply when the suggestion is submitted | "{user} Thanks! Your command has been submitted and is waiting for approval. ✅" |
| Message on invalid format | Reply and auto-refund channel points if the input doesn't start with a valid !command |
"{user} Please submit in the format "!command Response text" — your channel points have been refunded." |
| Message on approval | Chat message once you approve the suggestion | "{user} Your command {trigger} has been approved and is now active! 🎉" |
| Message on rejection | Chat message once you reject the suggestion, with auto-refund | "{user} Your suggestion was not approved — your channel points have been refunded." |
This reward must have "Require text input" enabled in Twitch reward settings. The viewer enters "!command Response text". Additional placeholders beyond base ones: {trigger} (the suggested command name, only on approval/rejection).
Example: Reward with text input, viewer types "!gg Well played!" → lands in your pending command list for review.
Shoutout (!so @user)
Shows the last played title and channel link of a user, optionally with a real Twitch shoutout.
| Field | What it does | Default |
|---|---|---|
| Trigger a real Twitch shoutout | Also triggers Twitch's native shoutout function (the highlighted channel card in chat). Requires the bot to be a moderator in your channel. If it fails, only the chat message is sent | On |
| Response text | The chat reply | "🎉 Check out {name}! {url} — last played: {game}" |
Without an @target user in the command, nothing happens. With an unknown or misspelled username, nothing happens either.
Additional placeholders beyond base ones: {name} (display name of target user), {game} (here as an exception the LAST PLAYED GAME OF THE TARGET USER, not your own), {url} (Twitch channel link of target user). {viewers}, {title}, {followers}, {subscribers} still refer to your own channel.
Example: Command !so @someone → "Check out someone! twitch.tv/someone — last played: Valorant".
Fun action "Chaos" (random timeout)
A short, harmless timeout as a fun reward or command.
| Field | What it does | Default |
|---|---|---|
| Target | "The trigger itself", "@target user from the chat command" (e.g. !chaos @someone), or "Random active viewer" |
The trigger itself |
| Exclude subscribers from the random pool | Only in "Random active viewer" mode. Protects subscribers from random timeout (max first 100 subs, technical limit; VIP protection isn't currently possible) | On |
| Timeout duration (seconds) | Pure fun effect, short values (15-60 seconds) recommended. Maximum 1,209,600 seconds (2 weeks, Twitch's technical limit) | 30 |
| Response text (optional) | Leave empty for no chat reply | "😈 {target} has been silenced for {duration}s!" |
The streamer is never selected unless they explicitly choose "The trigger itself" as the target and hit themselves.
Additional placeholders beyond base ones: {target} (affected user, with @), {duration} (seconds).
Example: Reward "Chaos" → random viewer is silenced for 30 seconds, bot announces it in chat.
Points steal (!steal @user)
A risky theft attempt of another viewer's points.
| Field | What it does | Default |
|---|---|---|
| Success rate (%) | Probability the theft succeeds | 50 |
| Stolen share of target balance (%) | What percentage of the target's balance is stolen on success | 10 |
| Penalty on failure (% of own balance) | What percentage of your balance is lost on failure | 10 |
| Minimum target balance | Targets with less balance can't be stolen from | 10 |
| Cooldown per user (seconds) | Repeated attempts during cooldown are silently ignored | 300 |
| Text on success | - | "🥷 @{user} stole {amount} {currency} from {target}!" |
| Text on failure | - | "🚨 @{user} got caught stealing from {target} and loses {penalty} {currency}!" |
| Text when target can't be stolen | Appears when target is unknown or below minimum balance | "@{user} {target} has nothing to steal." |
You can't steal from yourself. An attempt without a valid @target or against yourself is ignored. The target is found by saved loyalty name, not Twitch API lookup: only viewers who've already interacted with your points system can be found.
Additional placeholders beyond base ones: {target}, {amount} (on success), {penalty} (on failure).
Example: Command !steal @someone → on success, part of their points goes to the thief; on failure, the thief takes a small penalty.
Ship command (!ship @user)
Calculates a fun compatibility percentage between two users.
| Field | What it does | Default |
|---|---|---|
| Response text | - | "💘 {user} + {touser} = {percent}% compatibility!" |
The result is always the same for the same pair on the same day (calculated from both names and the date, not purely random), but changes the next day. Without an @target user in the command, nothing happens.
Additional placeholders beyond base ones: {percent} (0 to 100).
Example: Command !ship @someone → "Alice + someone = 73% compatibility!"
Random quote
Draws a random quote from your quote management (page Quotes). Works alongside the existing fixed !quote command but can be bound to your own command word or reward.
| Field | What it does | Default |
|---|---|---|
| Response text | - | "💬 Quote #{quote_id}: {quote}" |
| Text when no quotes exist | - | "No quotes yet!" |
Additional placeholders beyond base ones: {quote} (quote text), {quote_id}, {added_by} (who added it).
Example: Command !quote → "Quote #12: ...".
Countdown command
Shows remaining time until a date you set.
| Field | What it does |
|---|---|
| Target date/time | The target date |
| Response text (before) | Chat reply while the target date hasn't been reached yet, default "⏳ Still {countdown} until it happens!" |
| Response text (after) | Chat reply once the target date is reached, default "🎉 It's here!" |
Additional placeholders beyond base ones: {countdown} (remaining time, e.g. "3 days 4 hours").
Example: Command !event → "Still 3 days 4 hours until it happens!"
Reminder (!remindme
A viewer can set a reminder for themselves, e.g. "!remindme 15 Don't forget the ad".
| Field | What it does | Default |
|---|---|---|
| Max allowed minutes | Highest allowed wait time | 120 |
| Confirmation text | Immediate reply when called | "⏰ Ok {user}, I'll remind you in {minutes} minutes!" |
| Reminder text (after time is up) | Only sent once time has elapsed | "⏰ @{user}: {text}" |
| Text on wrong usage | If the command is called without minutes+text | "Usage: !remindme |
Placeholders: {minutes} only in the confirmation, {text} only in the reminder text itself (other base placeholders don't work in the reminder text since it's sent after time has elapsed).
Example: Command !remindme 15 Don't forget the ad → after 15 minutes the bot posts the reminder in chat.
Check giveaway status
Shows a viewer their current ticket count in the running giveaway (page Giveaways).
| Field | What it does | Default |
|---|---|---|
| Response text (with tickets) | - | "🎟️ @{user} you have {tickets} tickets in the current giveaway!" |
| Response text (no giveaway/no tickets) | - | "@{user} No giveaway running right now or you don't have tickets." |
Additional placeholders beyond base ones: {tickets}.
Example: Command !tickets → "You have 3 tickets in the current giveaway!"
Show leaderboard in chat
Posts the top loyalty-points leaderboard directly in chat.
| Field | What it does | Default |
|---|---|---|
| Number of places | 1 to 10 | 5 |
| Response text | - | "🏆 Top {top_n}: {list}" |
Additional placeholders beyond base ones: {top_n}, {list} (e.g. "1. Alice (500), 2. Bob (320)").
Example: Command !top → "Top 5: 1. Alice (500), 2. Bob (320), ..."
Start poll/prediction
Starts a real native Twitch poll or prediction with pre-configured options.
| Field | What it does | Default |
|---|---|---|
| Type | Poll or Prediction | Poll |
| Title | - | "Community vote" |
| Options (one per line) | Poll: 2 to 5 options, Prediction: 2 to 10 options. Extra lines are cut off | - |
| Duration (seconds) | 15 to 1,800 | 60 |
| Response text on success | - | "🗳️ {title} — vote in chat!" |
| Response text on error | Appears e.g. if a poll/prediction is already running | "Could not start — a poll/prediction might already be running?" |
Additional placeholders beyond base ones: {title} (title of the started poll/prediction; here overrides the base placeholder for current stream title).
Example: Command !vote → starts the poll "Next game?" with your preset options.
Lucky Wheel (custom text prizes)
A lucky wheel with freely defined text prizes, independent of loyalty points.
| Field | What it does | Default |
|---|---|---|
| Prizes (one per line) | Each line is a possible win, e.g. "Shoutout", "Song request", "No luck!" | - |
| Response text | - | "🎡 @{user} spins the wheel... {prize}!" |
This action doesn't award loyalty points on its own. To make a prize also give points, combine a second "Award loyalty points" action on the same trigger.
Additional placeholders beyond base ones: {prize}.
Example: Channel Points Reward "Lucky Wheel" → "You spin the wheel... Song request!"
Random challenge
Picks a random task from a freely defined list.
| Field | What it does | Default |
|---|---|---|
| Challenges (one per line) | Each line is a possible task, e.g. "Play left-handed for 5 minutes" | - |
| Response text | - | "🎯 Challenge for {user}: {challenge}" |
Additional placeholders beyond base ones: {challenge}.
Example: Command !challenge → "Challenge for you: Play left-handed for 5 minutes".
Trivia/Quiz (!trivia [answer])
A quiz with your own questions. !trivia without text starts a round (or says one's already running), !trivia <answer> checks the answer against the running round.
| Field | What it does | Default |
|---|---|---|
| Questions (one per line, format: Question|Answer) | Example: "How many legs does a spider have?|8". When a round starts, a question is drawn randomly. Case doesn't matter for the answer | - |
| Reward (loyalty points) | - | 50 |
| Time limit (seconds) | - | 120 |
| Text at round start | - | "❓ {question} — Answer with "!trivia |
| Text when a round is already running | - | "A trivia round is already running: {question}" |
| Text on correct answer | - | "🎉 @{user} answered correctly ({answer})! +{amount} {currency}" |
Only the first correct answer wins. Wrong answers or answers without a running round are silently ignored to avoid chat spam.
Additional placeholders beyond base ones: {question}, {duration} (at round start), {answer}, {amount} (on correct answer).
Example: Question "How many legs does a spider have?|8" → whoever types !trivia 8 first wins points.
Marry/Adopt (!marry @user)
Permanently pairs two viewers for fun, with optional lookup command.
| Field | What it does | Default |
|---|---|---|
| Text on successful pairing | - | "💍 {user} and {touser} are now a couple!" |
| Text if caller is already paired | Placeholder {partner} |
"@{user} you're already with {partner}!" |
| Text if target is already paired | - | "{touser} is already taken!" |
| Text on lookup (companion command) | Only relevant with a created lookup command, e.g. !partner. Placeholder {partner} |
"@{user} is with {partner}! 💕" |
| Text on lookup without partner | - | "@{user} you're still single! Use !marry @someone" |
A pairing is permanent (no divorce command). You can't marry yourself or someone already taken.
This action supports an additional lookup command (see below "Lookup command").
Example: Command !marry @someone → "Alice and someone are now a couple!"
Weekly stats (!stats)
Summarizes new followers, awarded points, and the most active viewer from the last 7 days.
| Field | What it does | Default |
|---|---|---|
| Response text | - | "📊 Last 7 days: {new_followers} new followers, {points_awarded} {currency} awarded. Most active: {top_viewer}" |
{top_viewer} is an approximation: it's based on total watch time among viewers active in the last 7 days, not an exact ranking of just that week.
Additional placeholders beyond base ones: {new_followers}, {points_awarded}, {top_viewer}.
Example: Command !stats → "Last 7 days: 12 new followers, 3,400 Bellas awarded. Most active: Alice".
Control OBS (Scene/Source/Hotkey)
Controls your local OBS: switch scene, show/hide/toggle source, play/pause/restart/stop media source, mute/unmute source, set volume, or trigger a hotkey. Requires prior setup of an "OBS Control" widget in the overlay designer.
| Field | What it does |
|---|---|
| OBS Control widget | Only widgets of type "OBS Control" |
| OBS action | Switch scene, show/hide/toggle source, trigger hotkey, play/pause/restart/stop media, mute/unmute source, set volume |
| Scene / Source | Selection from the list retrieved by "Test connection" in the overlay designer editor, otherwise free-form text exactly as in OBS |
| Hotkey name | Only for "Trigger hotkey": the internal OBS name, which often differs from the displayed name (e.g. "OBSBasic.StartStreaming") |
| Volume (%) | Only for "Set volume" |
| Auto-switch back/unmute after (minutes) | Only for "Toggle source" or "Mute source". Leave empty for a permanent change (only manually undoable) |
| Response text (optional) | Leave empty for no chat reply |
Which actions the OBS Control widget actually allows you set additionally on the widget itself in the overlay designer editor. An action chosen here but not allowed on the widget won't execute.
Example: Channel Points Reward "Scene Chaos" → switches to a set scene, e.g. a reaction camera. Or: Command !mute with "Mute source" action and 5 minute time limit → microphone gets muted and auto-unmutes after 5 minutes.
Lookup command
For actions that have a meaningful "status" (currently: Counter and Marry/Adopt), the form asks: "Should a lookup chat command be created?" If you enable it and enter a second command name (e.g. !streak for a check-in counter), the page automatically creates a linked second automation. This lookup command only shows the current status without changing it (no counter increase, no new pairing). For a channel-points reward this behavior is additionally enforced automatically: calling via the reward itself also only shows the status without increasing it.
If you turn off the lookup command later, the linked automation is deleted.
Edit, (de)activate, delete automation
In the table, the button next to each row opens a menu with:
- Edit: opens the same form as when creating, with current values pre-filled.
- Active/Inactive (toggle): disables an automation without deleting it. An inactive automation responds to nothing, but stays with all settings and collected counter values intact.
- Delete: asks "Really delete this automation?" first, then permanently deletes the automation, any linked lookup automation, and if present, any data table created for it.
Data Management: Import and Export
Via the Data Management button at top right you reach three tools, all referring only to chat command automations:
StreamElements Import
Loads your existing commands from StreamElements via your channel name there. After "Load Commands" the page shows a selection list. Commands you already have are marked "[exists]" and are skipped on import. If the loaded response contains a counter placeholder, it becomes a channel counter (counting mode "Channel only") with the previous value, everything else becomes a simple text response. StreamElements permission levels are transferred to your own levels.
Import (JSON)
Imports a file previously saved via Export, or a custom file in the same format. After upload the page shows a selection list of the commands it contains. A command that already exists on your account is updated instead of created twice.
Export
Downloads all your chat command automations as a JSON file, for backup or transfer to another channel.
The meta commands in chat: !commands and !minigames
These two commands aren't separate automations, but fixed built-in commands whose trigger word you change at the top of the page (see "The meta commands" above):
!commandslists all active chat command automations on your channel.!minigameslists all enabled minigames with their commands.
Manage commands directly in chat (you and your moderators only)
Besides the page itself, you and your moderators can manage simple text-response commands directly in chat:
| Command | Effect |
|---|---|
!addcmd !command Response text |
Creates the command new (permission "Everyone", action "Text response") or overwrites it if it exists |
!removecmd !command |
Deletes the command again |
!commands (or your set Commands Trigger) |
Lists all active chat command automations |
Both management commands only work for you and your moderators; other viewers are ignored. !addcmd without a valid !command or without response text replies with a usage hint. Commands created via !addcmd then appear normally in the table on this page and can be edited there (e.g. to change them to another action like "Counter").
Typical workflow
- Click New Automation.
- Enter a name, e.g. "Check-in".
- Choose trigger type "Chat command", enter
!checkinand set permission to "Everyone". - Choose action "Counter", set counting mode to "Stream Streak" and enter response text like "🔥 {user} has been here for {streak} streams straight!"
- Save. The command is immediately active.
- Optionally: enable "Should a lookup chat command be created?" and enter
!streakso viewers can check their status without a new check-in.
Limits and edge cases
- Per channel, each command word can only be assigned once, regardless of case.
- Actions that need their own small data table (e.g. pending command suggestions) are limited to 20 such tables per channel. For most streamers this limit will never matter.
- For "Send HTTP request", internal/private network addresses are always rejected, even if given as a public domain name.
- A voice command action needs active speech recognition in your browser on the Live Control Room page. Without an open tab with the microphone active, nothing happens.
- If you deactivate an automation, all previous counter values, partnerships, etc. stay intact and are available again if you reactivate it.
FAQ
Why doesn't the bot reply to my command, even though I typed it? Either you're below the set permission level (e.g. a regular viewer on a "Moderators" command gets silently ignored), the automation is deactivated, or you mistyped the command. Check the table on this page.
Why were my channel points refunded? This happens automatically when a channel-points reward reaches its daily limit, when it's set to only work during streams and you redeemed it offline, or when an action like "Add command" detects or rejects an invalid format.
Can I use a command on multiple platforms at the same time? For chat commands yes, via the "Applies to" field (visible once you've linked multiple platforms). Replies to TikTok appear in the "Bot message" overlay widget since the bot can't write to the TikTok chat itself.
What's the difference between "Channel only", "Per viewer", and "Stream Streak" in the counter?
"Channel only" is one shared counter for everyone (e.g. streamer deaths). "Per viewer" counts for each person individually (e.g. how often someone triggered !slap). "Stream Streak" counts only once per running stream and tracks a series, typically used for check-ins.
I deleted a reward that was still linked to an automation. What happens? The automation stays, but can't be triggered anymore since the reward no longer exists on Twitch. Edit the automation and pick a different (or newly created) reward.
Can I use an action multiple times with different triggers? Yes. Just create multiple automations with their own triggers, each using the same action type with their own settings, e.g. two "Award loyalty points" automations with different amounts for two different rewards.
Does !addcmd also work for complex actions like counter or points?
No, !addcmd in chat always creates a simple text response. For anything else (counter, points, overlay alert, polls, etc.) use the form on this page.