Skip to content

Chatters module

The Chatters module is StreamerCatalyst’s chat bot. It answers custom commands, posts scheduled and keyword-triggered auto-chat messages, keeps quotes and counters, runs a chat countdown timer, and exposes a public API that lets external bots (Nightbot, StreamElements, Fossabot) pick random chatters or run FMK polls.

Available on the Free tier and above; the number of custom commands and auto-chats depends on your plan (see Custom commands and Auto-chats). See Module access by tier.

Chatters has five pages in the dashboard sidebar — Overview, Commands, Community, Bot Setup and Reference — and most pages are split into tabs.

Capability What it does Where
Bot switch and usage Turn the bot on or off, see who’s posting, command and auto-chat usage, top commands, recent activity Overview
Custom commands Your own ! commands with template variables, permission levels, cooldowns, a Test button and AI drafting Commands → Custom
Built-in commands !uptime, !game, !title, !followage, !accountage, !watchtime, !hypecheck, !clip, !commands, !timer, plus mod tools Commands → Utility
Shoutouts !so messages, native Twitch shoutouts and the shoutout queue (!soq) Commands → Shoutouts
Auto-chats Scheduled or keyword-triggered messages with chat/reply/announcement delivery Commands → Auto Chats
Import Bring a StreamElements account across with a JWT (commands, timers, quotes), or paste commands from StreamElements, Nightbot, or Fossabot with variable translation Commands → Import
Quotes Numbered community quotes managed from chat or the dashboard Community → Quotes
Counters Named counters usable in command templates, with an optional bits/gift auto-reduce Community → Counters
Regulars A trusted-viewer list that unlocks the regular command permission level Community → Regulars
Bot identity and settings Choose who speaks (your account, the shared @StreamerCatalyst bot, or your own bot), the @mention prefix, the public commands page switch, and who may change the title with !title Bot Setup → Settings
Bot API Your API key and ready-to-paste random / fmk URLs for external bots Bot Setup → Bot API
Tip announcements A templated chat shout-out whenever a tip settles in the Tipping module Bot Setup → Tip Announcements
Reference Template variables, expression functions, and an expression tester Reference
Public commands page A shareable page listing your enabled commands Switched on/off under Bot Setup → Settings

The selected tab is part of the page address (?tab=), so every tab can be bookmarked or shared — for example /chatters/commands?tab=auto-chats or /chatters/community?tab=quotes. Links to the older single pages (such as /chatters/auto-chats, /chatters/quotes or /chatters/apikey) redirect to the tab that replaced them.

Chatters → Overview is the module’s home page.

  • Module — the bot’s on/off switch. Turn it off and the bot goes silent in your chat without touching your plan: no custom or built-in commands, quotes, scheduled or keyword auto-chats, counter auto-reduce, tip announcements, or Wheelspin chat command and winner announcement; a running !timer is cancelled, and the bot API answers Channel not found or disabled. It can take up to about two and a half minutes after switching off for command replies to stop. A few things keep running because other modules depend on them: the chat feed for the chat-display widget, the message counts behind Numbers’ Top Chatters, !watchtime presence tracking (only the reply stops), Hype Train history for !hypecheck, and Wheelspin spins triggered by bits, gifted subs or tips.
  • Bot identity — which account is posting, with a dot showing whether it is connected, and a link to Bot Setup.
  • Usage tiles — Commands run, Auto chats sent, Quote pulls and Shoutouts sent, each with today, this stream, 7 days and 30 days, plus a sparkline. Days are UTC days, and the Stream figure resets when you go live. A shoutout is counted when !so posts its chat reply.
  • Suggestions — up to two, derived only from what loaded: a command answering 30% or more of your command traffic (suggesting it as an Auto Chat), commands that are switched off, a shared bot whose messages lack the bot badge, or no custom commands yet (suggesting an import).
  • Top commands — your most-used custom commands for Today, 7D, 30D or 90D.
  • Recent activity — auto-chats sent, quotes added, regulars added, and when each command was last used.

Every message the bot sends uses your channel’s bot identity, chosen in Chatters → Bot Setup → Settings (broadcaster only):

  • Broadcaster — messages come from your own account (the default, and the fallback whenever a bot token is missing).
  • Shared bot — the global @StreamerCatalyst account. Give it the mod role in your channel (/mod streamercatalyst) so it can post freely.
  • Custom bot — a dedicated bot account you own; you authorize it once via a Twitch login from the Bot Setup page.

Whichever account sends chat, its messages show Twitch’s verified bot badge once that account has been authorized with the user:bot permission. Bot Setup flags when the badge isn’t active yet (for the shared or a custom bot) and prompts you to re-authorize.

During a Stream Together (Shared Chat) session the bot posts only in your own chat — its replies are not mirrored into your co-streamers’ channels. Announcements are scoped the same way, as long as the account sending them is the one you granted announcement permission to; if we have to fall back to your own account’s login for a send, that one message is mirrored to the whole session.

The bot account’s own messages never trigger keyword auto-chats and aren’t counted as chat activity. Neither are yours as the broadcaster, so test a keyword auto-chat from another account.

Create commands on Chatters → Commands → Custom:

Field Details
Trigger Starts with !; letters, numbers, _, -; up to 30 characters including the !. Stored in lowercase, so !Hello in chat matches !hello
Response Up to 500 characters, with template variables
Permission everyone (default), regular, follower, sub, vip, mod, or broadcaster
Cooldowns Global and per-user, 0 – 86,400 seconds each
Mode The editor offers Text and /me (action); replies are currently posted as ordinary chat messages either way
Hidden from public command list Excludes the command from your public commands page

How many commands. Free channels can create 5 custom commands, Affiliate 25, and Partner and above unlimited, up to a hard cap of 500 per channel (see Chatters limits by tier). If your tier drops, commands beyond the new limit are switched off automatically (the oldest stay on).

Responses support template variables — $(user), $(touser) (the first word after the trigger, or the caller’s name when there isn’t one), $(1), $(2) … (the brackets are required; a bare $1 stays as text), $(random 1-100), $(randompick a|b|c), $(randomchatter [FILTER]), $(counter …), $(count) (how many times the command has run), $(eval …), $(urlfetch URL), and more. See Template variables & built-ins for the full reference.

Channel numbers never read as zero. $(followers), $(subs), $(subpoints), $(plus …), $(count) and $(hypehigh …) print [followers: unavailable] and the like when the figure can’t be read (Twitch unreachable, a token that needs reconnecting, $(subs) / $(subpoints) on a channel that isn’t Affiliate or Partner, or a hype-train record StreamerCatalyst hasn’t picked up yet). A 0 in chat would be a claim about your channel, so the bot says it doesn’t know instead. $(uptime) follows the same rule: it says stream is offline only when Twitch reports that, and [uptime: unavailable] when Twitch can’t be read. The first four can also be read inside $(eval …), where an unavailable figure turns the whole expression into the [… unavailable] message rather than calculating with zero.

Goal progress in chat. $(goal METRIC [FIELD]) (your Numbers goals), $(subathon [FIELD]) (the subathon goals ladder), $(tipgoal [FIELD]) (the active tip goal) and $(charity [FIELD]) (the running charity campaign) quote the same figures your dashboard and overlays show, e.g. !goal → Emote unlock: 412/500 — 88 to go!. They keep the same rule: a goal that can’t be read prints [goal: unavailable] and the like, never 0, and a goal that isn’t set says so ([goal subs: no goal set], [tipgoal: no active goal]). A points-mode subathon ladder shows percentages only, and a spoiler goal reads a secret goal. All four can be read inside $(eval …) too. See Template variables & built-ins for every field.

Test — every command in the list has a Test button that runs its saved response with sample arguments you type. A test never changes a counter, and it shows sample values rather than your real ones for counters, $(followers), $(subs), $(subpoints), $(plus …), $(goal …), $(subathon …), $(tipgoal …), $(charity …), $(hypehigh …) and $(randomchatter).

Who can run a command. Permission levels are ranked everyone → regular → follower → sub → vip → mod → broadcaster, and a chat badge satisfies its own level and every level below it: a VIP can run sub commands, and a mod can run vip and sub commands. Lead Moderators count as mods. regular and follower have no badge: a viewer without a higher badge is checked against your regulars list or your follower list respectively, and refused if the check can’t be completed. The follower list is cached, so a brand-new follower can take up to about two hours to pass a follower check. The broadcaster bypasses all permission and cooldown checks.

Aliases. A command imported from a StreamElements account keeps its aliases. An alias runs its parent’s response and shares the parent’s permission and cooldown, switching the parent off silences its aliases too, and each alias counts toward your plan’s command limit.

AI-generated responses — click AI Generate, describe what the command should do (up to 1,000 characters, plus an optional style: funny, informative, hype, chill), and the AI drafts the trigger, response, permission, and cooldown for you to review and edit before saving. If what you describe can’t be built from the command syntax, it says so instead of drafting something. Limited to 10 generations per channel per hour.

Most built-ins can be switched on or off and given an alias on Chatters → Commands → Utility; !so and !soq are on the Shoutouts tab. Turning a built-in off takes effect immediately; a new alias can take a few minutes to start answering. An alias is ! followed by up to 30 letters, numbers or _, and is saved in lowercase.

Command What it does
!uptime How long the stream has been live
!game Shows the current category; mods and the broadcaster can change it with !game <category> (an inexact name gets up to three “Did you mean” suggestions)
!title Shows the stream title; permitted users can set it with !title <text>
!followage How long the caller has been following
!accountage How old a Twitch account is — !accountage for the caller, !accountage @someone for anyone else
!watchtime How long a viewer has watched this channel — !watchtime for the caller, !watchtime @someone for anyone else
!hypecheck Time since the last Hype Train and when the next one can start
!clip [title] [seconds] Creates a Twitch clip of the last moments of the stream (5–60 s, default set on the Utility tab; mods, VIPs and the broadcaster; off by default)
!commands Links to the public commands page (silent while that page is switched off)
!timer Starts a chat countdown timer (see below)
!so Shouts out a user with a customizable message — optionally firing a native Twitch shoutout too, queued while Twitch’s ~2-minute cooldown is active (mods and the broadcaster)
!soq Shows the native shoutout queue; mods can remove an entry or clear it
!addcom / !editcom / !delcom Mods create, edit, or delete custom commands from chat — !addcom !hello Hi $(user)!. !addcom won’t overwrite an existing command or take a built-in’s name or alias
!cooldown Mods set a command cooldown from chat — !cooldown !hello 30 (global) or !cooldown !hello global:30 user:10

The mod tools (!addcom, !editcom, !delcom, !cooldown) are always on and have no alias. If no custom command is named !ping, !ping answers “Pong!”.

!addcom and !editcom reply with a heads-up when a response contains a bare $1 that looks like it was meant to be the $(1) variable; the command is still saved exactly as typed.

How !watchtime is counted. Twitch publishes no watch-time API, so the bot measures presence instead: every five minutes while you are live it reads your chatter list and credits everyone on it with the elapsed time. Consequences worth knowing before you put the number on screen:

  • It starts at zero. There is nothing to backfill from, so watch time begins accumulating from the first stream after tracking starts for your channel. Until then !watchtime says so rather than answering 0, and a viewer with nothing recorded is told that rather than 0 minutes.
  • It counts viewers whose chat is connected, which is what Twitch’s chatter list reports. Someone watching in an embed or with chat closed is invisible to it, so the figure is a floor, not an exact total. In a chat of more than 2,000 people, each check credits only the first 2,000 Twitch lists.
  • It rounds to the poll interval. A viewer present at two consecutive checks is credited for the whole gap; one who drops in and out between them is credited nothing. The first check of each stream only sets a starting point.
  • Brief visitors are eventually forgotten. A viewer with less than an hour in total who hasn’t been seen for 180 days is removed; anyone with more keeps their time.

While you are live the reply also shows the current session’s time in parentheses; that part resets when the stream starts.

!hypecheck cooldown — Twitch does not expose your channel’s Hype Train cooldown setting through any API, so set it with the 1–8 hour slider under the !hypecheck row on the Utility tab. It is only a fallback: when a Hype Train ends, Twitch’s own event tells us the exact instant the next one can start, and that value wins. Once a train has ended, the page shows the cooldown Twitch reported so you can tell whether the slider is stale.

!clip is off until you turn it on in the Utility tab. Turning it on and saving asks for one more Twitch permission (clips:edit); only the broadcaster can grant it, and the row shows a Grant button while it’s missing. Mods, VIPs and the broadcaster can type !clip, !clip <title>, !clip <seconds> or !clip <title> <seconds>. Seconds are 5–60 (out-of-range values are clamped), and the last word is read as the length whenever it’s a whole number, so !clip year 2024 makes a 60-second clip titled “year”. With no length the clip uses the default set by the slider under the row (60 s unless you change it). One clip per channel is made every 30 seconds, so two mods typing !clip together make one clip. The bot replies with the clip’s link; if the stream is offline, clipping is restricted on your channel, or Twitch rejects the title, it says so instead. Twitch finishes a clip in the background, so a link can occasionally point to a clip that failed to process. Turning !clip on replaces any custom !clip command you made.

Changing the category or title needs one more Twitch permission. Reading them works out of the box, but !game <category> and !title <text> write through Twitch’s Modify Channel Information API, which only accepts the channel:manage:broadcast grant. It is an on-demand scope, so it is not part of sign-in: press Save on Chatters → Commands → Utility (or the Grant button on that tab) and Twitch will ask for it. Only the broadcaster can grant it — a moderator re-authorizing would grant it on their own account. Until then both commands answer in chat with where to go.

!title write access is set under !title — write permissions on Chatters → Bot Setup → Settings: the broadcaster always can; tick Moderators and/or VIPs to let those roles change it, or add per-user grants for specific viewers (by numeric Twitch user ID, with a label of up to 100 characters). A grant lasts until you remove it.

!so <user> (mods and the broadcaster) posts a shout-out message and, with Native Twitch shoutout on, also sends Twitch’s official shoutout. A leading @ is ignored. If two mods !so the same person within 5 seconds — say, both reacting to a raid — only the first goes out.

Settings live in the !so — shoutout settings card on Chatters → Commands → Shoutouts, alongside the switches and aliases for !so and !soq. The message has four templates (each up to 300 characters): one for when the target is live and one for when they’re offline, each with a variant for when their last game is unknown. Leave a field blank to use the built-in default; a blank offline field falls back to your live message first. Besides the usual command variables ($(user) is the mod who ran it), shoutout templates take:

Variable Renders
$(touser) The target’s display name
$(login) The target’s username (safe inside a twitch.tv/ link)
$(url) twitch.tv/ plus their username
$(game) The target’s last-played category
$(status) live or offline

The chat reply is capped at 400 characters. When the native shoutout doesn’t go out straight away, a short note in brackets is added to the reply so the mod knows why — queued (with its position and rough wait), already in the queue, shouted out by Twitch recently, queue full, the broadcaster needing to reconnect their Twitch account, or (with the queue off) your stream not being live.

Twitch accepts only one native shoutout every ~2 minutes (see Shoutout cooldown), so a second !so inside that window used to be rejected and silently lost. With Queue native shoutouts on (the default), the native shoutout is queued instead and fires automatically as the cooldown clears. !so and Modomation’s native auto-shoutouts share one queue per channel, so a raid-and-shoutout burst lines up in order instead of competing.

The queue settings appear on the Shoutouts tab while native shoutouts are on: turn the queue on or off, set the queue size (1–25, default 10), and optionally announce in chat when each queued shoutout fires. Below it, the Shoutout queue card lists what’s pending — position, who’s being shouted out, whether it came from !so or an auto-shoutout, who asked, and roughly how long until it goes out — with a Remove button per entry and Clear queue.

From chat: !soq lists the queue for anyone, !soq remove <user> drops one entry, and !soq clear empties it (both mod/broadcaster only).

Queued entries expire after 30 minutes, a target Twitch already shouted out in the last hour is skipped, and the queue holds while you’re offline — Twitch only accepts native shoutouts while the channel is live.

!timer 5m Ad break starts a countdown (formats like 5m, 1h30m, 1:30:00, or plain seconds; up to 24 hours; label optional, up to 100 characters). The bot announces the time remaining at 1h, 30m, 10m, 5m, 1m and 10s — only the marks shorter than half the duration — and posts “⏰ Time’s up!” (with the label) when it completes. One timer runs at a time per channel; mods and the broadcaster start it and stop it with !timer stop (or !timer cancel), and anyone can type !timer to see the time left.

Chatters → Commands → Auto Chats posts messages automatically. Two trigger types:

  • Schedule — fires every N minutes (default 30, minimum 1), optionally only when live, and optionally only when enough people have chatted recently (Min chat lines in interval, 0 = no minimum), so reminders don’t fire into an empty chat. Despite its name, that setting counts distinct chatters who spoke within the interval (or the last hour, whichever is shorter), not individual lines; your own and the bot’s messages don’t count.
  • Keyword — fires when a chat message matches one of your keywords (Exact word or Substring, optionally case-sensitive), with a per-auto-chat cooldown (default 300 seconds; any cooldown under 60 seconds is held for 60). Keyword auto-chats don’t fire on the broadcaster’s or the bot’s own messages, or on a message that ran a custom or built-in command.

Both trigger types share the same conditions: only when live (on by default for a new auto-chat), and an optional stream category filter — only in the categories you list, or never in them, up to 20 categories. Matching is on the Twitch category itself, so renames don’t break a filter. Leave the list empty to fire in any category. If the category can’t be determined (Twitch is unreachable, or we haven’t seen a category change since setup), an only in filter holds the message rather than posting into the wrong category. Your category stays set while you’re offline, so pair a category filter with only when live if you only want it during a stream.

An auto-chat can also have an active schedule, which limits when it may fire:

  • Always (the default) — it fires whenever it’s enabled.
  • One-time window — a start and/or an end date and time. Before the start, or once the end has passed, it doesn’t fire. An ended window isn’t deleted and doesn’t switch the auto-chat off; it simply stops firing, and the list shows it as Inactive (schedule ended).
  • Repeat weekly — up to 14 windows, each a set of days plus a From and To time. If To is earlier than From, the window runs past midnight into the next day (Saturday 22:00–02:00 covers Saturday night until 2 AM Sunday). The same time for both means the whole day.

Schedule times are in your channel’s timezone (set in Settings), not your browser’s, and follow daylight-saving changes. The Enabled switch stays the master switch: an auto-chat fires only when it’s enabled and inside its schedule, and the schedule never turns the switch on or off. An enabled auto-chat outside its window is labelled Inactive (outside schedule) in the list. A scheduled auto-chat still waits out its interval from its last post, so one that hasn’t posted in a while fires on the first minute inside its window. Schedules combine with only when live and the category filter — all of them must allow the message.

Each auto-chat rotates through its message list in order, one message per firing (in the editor, Enter starts a new message and pasting several lines adds one message per line), and delivers as a plain chat message, a reply to the triggering message (keyword only), or a colored Twitch announcement (primary, blue, green, orange or purple).

Posting an announcement needs Twitch’s announcement permission on the account doing the posting. It’s requested at sign-in, so a channel that connected recently already has it; if you connected before it was added, saving an auto-chat in announcement mode sends you to Twitch once to add it (or use the reconnect prompt in Settings). If you send chat through the shared or your own bot account, that account also has to be a moderator in your channel to announce; when it isn’t, the announcement is posted from your own account instead of being dropped. Instead of fixed text, an auto-chat can mirror a custom command’s response — live (re-read on every fire) or as a snapshot you re-sync manually with Resync; deleting the linked command disables the auto-chat rather than posting stale text.

Auto-chat limits are tier-based: none on Free, 3 on Affiliate, unlimited on Partner and above. If your tier drops, surplus auto-chats are disabled automatically (oldest kept).

Store memorable moments as numbered quotes (up to 400 characters; the current game and date are captured automatically):

Command Who
!quote / !quote 42 (or !quote #42) Anyone — random quote, or quote #42
!addquote <text> Mods and the broadcaster
!editquote <number> <text> / !delquote <number> Broadcaster; mods (Lead Moderators included) only if Mods can edit/delete quotes is on

Quote numbers are your channel’s own. Your oldest quote is #1 and they count up to your newest, and what other channels have changes nothing. Deleting one leaves its number empty rather than shuffling everything above it down, so the quotes you keep never move.

The highest number is the one exception: delete your newest quote and the next quote you add takes its number, and a channel that deletes every quote starts again at #1. Nothing below the top is ever handed out twice.

The date the bot prints is the day the quote was added in your channel’s timezone (Settings → Time zone), so a quote added late in the evening is dated that evening and not the next morning. Leave the timezone on UTC and the date is UTC’s, as it always was.

StreamElements’ spelling works too, with the same permissions: !quote add <text>, !quote edit <number> <text>, !quote del <number> (delete / remove also accepted).

Quotes are managed on Chatters → Community → Quotes: Enable quotes switches all four quote commands on or off, Mods can edit/delete quotes widens !editquote and !delquote in chat, a form adds a quote, and the table lists every quote with its number in the first column, its game, who added it and when. The captured game can be corrected there too — in chat, !editquote still only changes the text. Changing anything on this tab needs a Lead Mod or the broadcaster, whichever way the mods switch is set.

Named counters (hydrate, deaths, …) are read and changed from command templates with $(counter NAME add|sub|set N) — per-viewer by default, or channel-wide with of channel — and support in-chat leaderboards ($(counter NAME top)) and closest-match lookups ($(counter NAME closest N), with under for Price is Right rules). A single response can make up to five counter operations. Counter names are lowercase letters, digits and _, up to 32 characters.

Chatters → Community → Counters lists every stored value (channel-wide totals and per-viewer tallies) with edit and delete, and lets you add or set one directly — channel-wide, or for a specific viewer by Twitch username.

Counter auto-reduce (the Auto-reduce a counter on bits & gifted subs card on the same tab) automatically subtracts from a viewer’s own value of a chosen counter when they cheer bits or gift subs — e.g. every bit reduces their “timeout jar” — at a rate you set per bit and per gifted sub. Bits from cheers and Power-ups both count; Bits used in extensions count once they’re detected, which is later than a cheer. The total never drops below zero, anonymous cheers and gifts are skipped, and auto-reduce stops while the bot is switched off. An optional chat announcement (up to 200 characters) posts only when something actually came off, with $(user), $(counter), $(amount) and $(total) available.

When a tip settles in the Tipping module, Chatters posts a shout-out in your chat. It’s on by default and configured on Chatters → Bot Setup → Tip Announcements with a single template (up to 300 characters):

Variable Renders
$(name) The tipper’s Twitch name, or “Anonymous”
$(amount) The tip amount, formatted in your tip currency (“$25.00”)
$(message) The tipper’s message, if they left one

The default is $(name) just tipped $(amount)! $(message). Leave the box blank to use it.

A tip whose message is still waiting for approval is announced without the message text, so nothing unreviewed reaches chat. Announcements are deduplicated, need the bot switched on (it’s the bot doing the talking), and are never retracted if a tip is later refunded.

Chatters is what listens for the Wheelspin widget’s triggers: the configured chat command (default !spin, broadcaster or broadcaster + mods), the bits / gifted-sub / tip thresholds, and the optional channel-point reward trigger you set on the widget (a reward that needs your approval still spins when it’s redeemed). The wheel itself, its items, and the winner announcement are configured in Widgets → Wheelspin. Bits, gifted-sub and tip triggers spin the wheel even with the Chatters bot switched off, but the winner isn’t announced in chat then. The chat command needs the bot on, and so does the channel-point trigger in practice: Chatters only asks Twitch for your redemption events while the bot is on.

Maintain a list of trusted viewers on Chatters → Community → Regulars, added by Twitch username. Regulars unlock the regular command permission level — a tier between everyone and follower for commands you want semi-restricted.

Every viewer’s message count is tracked per stream, per day (90-day history), and across recent windows, powering the Top Chatters leaderboard (surfaced under Numbers → Top Chatters, with Stream/Today/7D/30D/90D ranges). The broadcaster’s and the bot’s own messages aren’t counted, and counting continues while the bot is switched off.

Chatters → Commands → Import has two ways in. StreamElements account connects to StreamElements directly and brings your commands, timers and quotes across in one go. Paste commands takes a block of text copied out of any of the three supported bots. If you are moving from StreamElements, use the account import — it carries settings that copying cannot.

Paste your StreamElements JWT and StreamerCatalyst reads your account directly, so everything behind each command comes with it:

What comes across Notes
Custom commands Response, cooldowns, who can run it, aliases, and whether it was enabled
Timers Imported as Auto Chats — every message, the interval in minutes, the chat-lines threshold, the category filter, and only when live for a timer that ran only while live
Quotes Text, the original date and time, and whoever StreamElements recorded as adding it (plus its category, when it kept one) — blank rather than guessed at when it sent none

Up to 200 commands, 100 timers and 500 quotes per import, with up to 10 aliases per command and 20 messages per timer — anything past those is reported on the row rather than dropped quietly. Your plan’s command and Auto Chat limits apply; rows past them are marked in the preview.

One batch per token. Once you press Import the reviewed batch is spent; to bring more across, press Start over and paste a fresh JWT. That is deliberate — a second press of the same batch would create every timer again.

Finding your JWT. In StreamElements, open Account → Channels, click Show secrets, and copy the JWT Token.

Moderating for someone else? You do not need the broadcaster’s token. If you are a Lead Mod here and they have added you as an editor on their StreamElements account, your own JWT works. Either way the import only ever reads the channel you are signed in to and writes to that same channel; it can never pull one channel’s setup into another.

If it cannot find the channel, enter its StreamElements ID. There is an optional field under the JWT box. Leave it blank first — most channels are found automatically. Fill it in when they are not, which happens because StreamElements usernames are not unique across Twitch and YouTube, so looking a channel up by name can land on an unrelated account.

If you are moderating for someone else, expect to need it — the field opens with the steps already showing.

Finding the ID is fiddly, and it is not in the address bar; StreamElements does not display it anywhere. It only appears in the requests their dashboard makes:

  1. Open StreamElements and switch to the channel you are importing.
  2. Press F12 for your browser’s developer tools.
  3. Go to the Network tab and type api.streamelements.com in its filter box.
  4. Click around the dashboard — the bot or commands page will do — so some requests appear.
  5. Right-click any request, copy its URL, and paste the whole thing into the field.

Paste the entire URL; StreamerCatalyst pulls the ID out of it. If that is more than you want to do, the broadcaster’s own JWT works with no ID at all.

The ID only says which channel to read. The import still refuses unless that channel is the one you are signed in to.

StreamElements editor access is not the same as Twitch editor or moderator access. They are separate systems: being a mod or editor on someone’s Twitch channel gives you nothing in StreamElements. The broadcaster has to add you explicitly, on their StreamElements account, under Account → Channels — as Editor or Full Control.

Three different errors, three different fixes:

  • “is not a manager of this channel” — your token works and we found the channel, but StreamElements says you have no grant on it. Ask the broadcaster to add you, or use their JWT.
  • “could not find this Twitch channel on StreamElements by name” — enter its StreamElements channel ID, as above. (The broadcaster’s own JWT also works, and needs no ID.)
  • “that StreamElements channel ID is not this Twitch channel” — the ID resolved, but to a different channel. Check you copied it while managing the right one.

Previews are limited to 20 per 5 minutes per channel; past that, the error says how long to wait.

About that token. It is used for one request and then discarded — StreamerCatalyst never saves it, and you are never asked for it twice. Treat it like a password until you have imported: it grants full access to your StreamElements account, so do not paste it anywhere else, and you can reset it in StreamElements afterwards if you would rather not leave it live.

What does not come across, and why. Nothing is guessed at. Each of these is reported on the row it affects, so you know exactly what to re-add:

  • Loyalty-point costs. There is no points cost on a command here, so a command that cost points is imported free to run.
  • Regex and keyword triggers. The command imports under its normal !name. Keyword triggers are better rebuilt as a keyword Auto Chat.
  • Whispered replies. A command that whispered in StreamElements answers in chat here.
  • Per-timer title filters. There is no title filter on an Auto Chat, so a timer limited to titles containing a word is imported without that limit, and the words are named on the row.
  • Live-only and offline-only settings on commands, and offline-only timers. There is no live/offline split on a command here, so it is imported to run at all times rather than switched off. A timer that ran only while offline is imported to run at all times too.
  • Unreadable timer intervals. A timer whose interval StreamElements didn’t give in a readable form posts every 30 minutes until you change it, and the row says so.
  • Quote numbers. Quote numbers are assigned fresh — oldest first, continuing after any quotes you already had — so !quote 4 will not be the same quote it was in StreamElements. (Because they continue from what you have, importing an old backlog into a channel that already has quotes numbers the older ones above the newer ones; importing into a fresh channel numbers everything in order.) A quote’s author and game come across only when StreamElements sent them; when it didn’t, they’re left blank instead of being filled in with something untrue, and the import never stamps your current game onto an old quote.

Category filters come across. A timer limited to certain categories is looked up against Twitch, so the Auto Chat arrives with the same filter already set. If Twitch does not recognise one of them, can’t be reached, or the timer lists more than 20, the filter is left off entirely and the row says which — an Auto Chat filter is an allow-list, so importing part of one would silently stop the timer posting in the category that went missing.

Permissions map by name, not by rank. StreamElements orders Subscriber below Regular and StreamerCatalyst does not, so the import matches the label — a sub-only command stays sub-only. Super Moderator becomes Mods, since it is a moderator with extra StreamElements-side powers rather than a rank above one.

Re-importing is safe. Commands you already have, timers with the same name as an existing Auto Chat, and quotes whose text you already have are marked already here and default to skip, so topping up after adding a few new commands will not overwrite ones you have since tuned or double your quotes. If you do choose to import over an existing command, its response is refreshed and its cooldown and permission are left alone.

The paste importer ingests commands copied from Fossabot, Nightbot, or StreamElements. Variables are translated to StreamerCatalyst syntax where an equivalent exists; anything untranslatable is left exactly as you pasted it and flagged as a warning, so you can find and fix it. A preview step shows conflicts with existing commands — resolve each by importing over it, skipping it, or renaming it (a -2 … -9 suffix) — and up to 200 commands import per batch, within your plan’s command limit.

How the source bot is detected. All three bots write variables as $(name …) (StreamElements also accepts ${name …}), so the brackets don’t identify anything — the variable names do. The importer reads the whole paste, weighs every name that only one of the three defines ($(rngphrase) is Fossabot, $(userlevel) is Nightbot, $(pointsname) is StreamElements), and applies the winner to every line, including the many commands that are plain text with no variables at all. The preview names what it detected; if it guesses wrong, pick the right bot from the Source bot dropdown and the paste is re-translated.

A few translations change more than the brackets:

From Becomes Why
$(sender) $(user) Same meaning, different spelling
$(randint 1 100) $(random 1-100) One range argument instead of two bounds
$(chatters.random) $(randomchatter) Same live-chatter draw, and repeats in one response still name different people
$(count.increment shots) $(counter shots add 1 of channel) Fossabot’s custom counters are channel-wide; StreamerCatalyst counters default to per-viewer
$(count.increment lips-on) $(counter lips_on add 1 of channel) Counter names allow letters, numbers and _ only — the rename is reported
$(rngphrase a,b,c) $(randompick a|b|c) Same random pick, StreamerCatalyst’s spelling
${random.pick 'a b' 'c d'} $(randompick 'a b' 'c d') Same grammar — quoted or bare options, whitespace-separated — so the list carries across untouched
${random.1-26} $(random 1-26) Same range; StreamerCatalyst takes the bounds as an argument rather than glued to the name
${random.number 1-100} $(random 1-100) Same range, whether the bounds were written with a hyphen or a space
${random} $(random 1-100) StreamElements’ bare $(random) is documented as 1–100; StreamerCatalyst has no default range, so it is written out
${random.chatter} $(randomchatter) Same live-chatter draw, and repeats in one response still name different people
$(channel.followers) $(followers) The channel’s follower count, from either bot
$(channel.subs) / $(channel.subscribers) $(subs) The channel’s subscriber count
$(channel.subpoints) $(subpoints) The channel’s sub points
${channel.game} / ${channel.title} $(game) / $(title) Same stream fields, StreamerCatalyst’s spelling
${customapi.URL} $(urlfetch URL) Same fetch, StreamerCatalyst’s spelling

One difference worth knowing about the counts: $(followers), $(subs) and $(subpoints) answer [followers: unavailable] and the like when Twitch cannot be reached, where the old bots print 0. A 0 in chat is a claim about your channel, so StreamerCatalyst says it does not know instead.

Things with no equivalent — Fossabot’s $(chatters.count), Nightbot’s $(userlevel) and its $(twitch … "{{game}}") format strings, and StreamElements’ cross-channel $(channel.game somestreamer) — are listed in the row’s warnings and left untouched rather than silently dropped.

Imported commands start throttled. A paste carries no cooldown settings, and thirty wide-open commands arriving at once is how an import turns into a chat flood — so each newly created command gets a 5-second channel cooldown and a 15-second per-viewer cooldown. Change them any time under Chatters → Commands → Custom, or in chat with !cooldown !name global:30 user:10. Re-importing over a command you already tuned refreshes its response and leaves its cooldown alone.

External bots call plain-text endpoints on https://chatters.streamercatalyst.com with your channel’s API key, a 64-character hex key managed on Chatters → Bot Setup → Bot API:

  • /api/random — one or more random chatters (n = 1–10), with an optional format template.
  • /api/fmk — three random chatters for an FMK poll.
  • /api/chatters — the full current chatter list (plain or JSON).

/api/random and /api/chatters accept a comma-separated filter: sub, not_sub, tier1/tier2/tier3 (exact tier), vip, mod, follower, not_follower. The endpoints read the list of people currently connected to your chat, so they answer No chatters found — is the stream live? when nobody is.

Getting the key. Press Regenerate on the Bot API tab (broadcaster only) to create a key, or to replace the current one — anything using the old key stops working at once. The full key is shown only right after you regenerate it; after a reload the page shows it masked, so copy it straight away. The tab also builds ready-to-paste command text for StreamElements, Nightbot and Fossabot, sets the default filter /api/random uses when a URL has no filter=, and holds the names you plan to give the !random and !fmk commands in your other bot (labels for the URL list; they don’t create commands here). The @mention prefix switch on the Settings tab puts an @ in front of the names /api/random and /api/fmk return. For setup and URL formats per bot, see Bot integration.

Inside Chatters itself you don’t need the API: $(randomchatter [FILTER]) in a custom command draws from the same list with the same filters.

Each channel gets a public, no-login page at https://chatters.streamercatalyst.com/c/<channel-login>/commands listing enabled built-in commands and enabled custom commands (minus any marked Hidden from public command list). Custom commands are listed with their response text, so hide any you would rather not publish. The page is on by default; switch it off with Public commands page on Chatters → Bot Setup → Settings, which also shows the page’s address. While it’s off the address answers Channel not found and !commands stays silent. Changes can take up to a minute to show.

  • Bot messages are capped at 500 characters and rate-limited to 20 per minute per channel; messages beyond that rate are dropped, not queued.
  • Incoming chat events are deduplicated for 24 hours, so redeliveries never double-fire commands.
  • Chat clients add an invisible character to a message that repeats your previous one (to get past Twitch’s duplicate-message filter). The bot strips those marks before reading a command, so typing !quote 1 twice in a row works both times, and an auto-chat keyword pasted with a hidden mark in it is cleaned when you save it.
  • $(urlfetch URL) (also spelled $(customapi URL); $(urlfetch json URL path.to.field) picks one field from a JSON reply) is HTTPS-only, times out after 3 seconds, reads at most 10 KB, refuses private addresses and redirects, and is limited to 3 fetches per response. The same URL’s answer is reused for 60 seconds.

Looking for giveaways? Those run in the Events module.

Page Tabs (?tab=) What’s there
Overview (/chatters/overview) — The bot on/off switch, bot identity status, usage tiles, suggestions, top commands, recent activity
Commands (/chatters/commands) Custom (default), Utility (utility), Auto Chats (auto-chats), Shoutouts (shoutouts), Import (import) Custom commands and AI Generate; built-in command switches, aliases and the !hypecheck cooldown; auto-chats; !so / !soq and the shoutout queue; both importers
Community (/chatters/community) Quotes (default), Counters (counters), Regulars (regulars) Quotes and their settings; counter values and auto-reduce; the regulars list
Bot Setup (/chatters/setup) Settings (default), Bot API (api), Tip Announcements (tips) Bot identity, @mention prefix, public commands page, !title write permissions and grants; API key, bot-API defaults and ready-made URLs; the tip announcement template
Reference (/chatters/reference) Variables (default), Functions (functions), Expression Tester (tester) Template variables and the Nightbot/StreamElements migration table; $(eval …) functions and identifiers; a tester for expressions

Regular mods can see every page and do day-to-day command work: adding, editing, enabling and deleting custom commands and Auto Chats, AI Generate, and the paste importer. Everything else — the bot switch, built-in and shoutout settings, quotes, counters and auto-reduce, regulars, !title permissions, the @mention prefix and public page switches, bot-API defaults, tip announcements, and the StreamElements import — needs a Lead Mod or the broadcaster. Choosing the bot identity, authorizing a custom bot, and regenerating the API key are the broadcaster’s alone; mods see the key masked.

Mods can edit/delete quotes (on the Quotes tab) widens !editquote and !delquote in chat. It does not change the Quotes tab itself — editing a quote in the dashboard still needs a Lead Mod or the broadcaster whichever way that switch is set.

See Template variables & built-ins for the generated reference of template variables, permission levels and built-in commands, and the AI token DSL reference for the full $(counter …) and $(eval …) grammar.

See Chatters — API endpoints for the full list of HTTP endpoints.

See Chatters — Authentication & permissions for the OAuth scopes this module uses and the EventSub subscriptions it registers.