OverlayThing Docs
Home
Login / Request Access
01 Get started
Introduction Quickstart Add to your stream
02 Overlays
Overlays The editor Overlay URLs Alert queue Share, export & import
02.1 Widgets
Widgets overview Alerts Variations Hype Train Text to speech Goals Countdown & subathon Chat box Data labels Counter Text, image & video
03 Chatbot
Chatbot overview Getting started Commands Variables Conditionals Recipes API commands Integrations Command API & Copy-URL Chat moderation Bot account Bot settings
03.1 Chatbot modules
Modules overview Timers Counters Quotes Chat alerts Welcome Ad Breaks Giveaways Queue Song requests Loyalty
04 Flows
Overview Build a flow Triggers Conditions Actions Using data Examples
05 Channel Rewards
Channel Rewards
06 Remote Control
Overview Connect OBS Studio Connect Meld Studio Bindings & triggers Security & access
07 OBS Dock
Overview & setup Layouts & display Chat & Needs You Activity & media Stream info & controls
08 Companion
Companion overview Install & pair Feed, chat & channel Scripting The scripting API Permissions & security
09 Monetize
Tip page Tip settings Merch with Fourthwall
10 Build your own
Describe & Build Custom widgets Widget SDK
11 Your data
Dashboard Stream data Chat log Moderation
12 Account
Settings & connections Export your data Import from StreamElements
13 Reference
Label tokens Keyboard shortcuts FAQ Troubleshooting
Chatbot/Variables
Chatbot

Variables.

Variables are $( … ) tokens you drop into a command response. They fill in with live data when the command runs: the viewer name, your uptime, a random number, a quote, a counter value, and much more.

How variables work

Write a token anywhere in a command response and the bot replaces it before posting. They combine freely with your own text.

responseexample
Welcome $(user)! $(channel) has been live for $(uptime).

If a token has no value (or names something that does not exist) it simply renders as nothing, so a small typo never breaks the reply.

command response variables Live
$(touser)@ninja just hit $(count.deaths)12 deaths on $(game)Elden Ring

Tokens that target a user

A few tokens describe a person and accept an optional @mention. With no mention they describe the viewer who ran the command; with one, they describe that user. These are $(followage), $(watchtime) and $(accountage).

arg-or-selfexample
!followage          → your own follow age
!followage @cohh    → @cohh's follow age

Other arg-taking tokens read what the viewer typed: $(touser) is the first word after the command, $(query) is everything after it, and $(random 1-6) / $(pick a;b;c) take their own inline options.

Use $(querystring) inside URLs

When you put viewer input into an API URL, use $(querystring) (URL-encoded), never the raw $(query). The encoded form keeps spaces and symbols from breaking the link.

Doing math

$(math …) works out an expression, with other tokens filled in first and the result rounded to two decimals. The operators, helpers and worked examples are on its card in the reference.

Counting down

$(countdown …) renders how long until a moment and $(countup …) how long since one, read in your channel time zone from Bot settings unless the date ends with a zone. The accepted date shapes are on the countdown card.

How slash dates are read

A part over 12 settles it: 14/09/2026 and 09/14/2026 are both September 14. When either part could be the month, your date format in Bot settings decides: DD/MM/YYYY reads 12/11/2027 as 12 November, every other preset reads it as December 11. The editor shows the date it understood under the response, so check that line when you use slashes.

Calendar

month.* and year.* read today's date in your Bot settings time zone: $(month) and $(month.short) name the month, $(month.number), $(month.day) and $(month.daysin) are its numbers, and $(year), $(year.day), $(year.daysin) and $(year.week) do the same for the year and its Monday-to-Sunday week number. $(month.daysleft), $(year.daysleft) and $(year.weeksleft) count what is still ahead. The "days left" tokens do not count today, so they read 0 on the last day; add today back with $(math $(month.daysleft) + 1) when you want it included.

plusgoalexample
we've got $(month.daysleft) days to get $(pluspoints.next) more!
A month name, not a month count

$(month) is the word September. The count of what happened this month is $(month.followers) and the rest of the month.* numbers below.

Latest and this-stream numbers

The latest.* tokens name the most recent follower, sub, cheer, raid, tip and redemption, with details such as $(latest.sub.tier), $(latest.cheer.bits) and $(latest.raid.viewers). session.* counts what has happened since the stream went live (follows, subs, gift subs, bits, tips, raid viewers and redemptions) plus the top cheerer and tipper, and the same counts exist for today, this week, this month and all time as today.*, week.*, month.* and total.*. today.*, week.* and month.* use the time zone from Bot settings, with the week running Monday to Sunday.

welcomeexample
Welcome $(latest.follower)! That makes $(session.followers) new follows this stream and $(month.followers) this month.

Goals, timers and merch

goal.* reads a Goal widget from your overlays: $(goal.followers) is how far along it is, with $(goal.followers.target), $(goal.followers.remaining) and $(goal.followers.pct) beside it. $(subathon.remaining) and $(countdown.remaining) read your Subathon and Countdown widgets the same way. merch.* needs a connected Fourthwall shop.

When you have more than one

Each of those tokens takes the widget's name: $(goal.followers Sub Drive). With only one widget of that kind you can leave it out. With more than one, the editor asks you to name one before you save, and the $( list offers your widget names as soon as you type a space.

Counting down to a date

$(countdown Dec 25 2026 6pm) counts down to a date you type and has nothing to do with a Countdown widget. $(countdown.remaining) is the widget one.

Fetching a URL

$(urlfetch …) pastes what a web address returns, trimmed to one line; it is the quick option for a service that answers in plain text. When you need headers, a secret, or one field out of a JSON reply, use an API command instead. The weather example is on its card.

Defaults, ranges, captures and chaining

A positional argument can carry a fallback: $(1|stranger) renders the first word, or "stranger" when the viewer typed nothing. $(touser|someone) works the same way. $(2..) renders the second word onward and $(1..3) renders words one to three. In a regex keyword, $(match.1) is the first capture group. $(command …) runs another of your commands in place and pastes its reply, up to three deep.

hugexample
$(user) hugs $(1|everyone) $(2..). $(command !so $(touser))

Full reference

Every available variable, grouped by what it relates to, with the same examples and tips the command editor shows. Tokens shown as $(count.<name>) or $(api.<field>) take a name or field you supply; a "Looking for" line points at a twin you may have meant instead.

User

$(user)

The viewer who ran the command.

Example
$(user)→ninja
In a response
Hi $(user), welcome in!→Hi ninja, welcome in!Their display name, with their casing.
$(user) rolled a $(random 1-6)→ninja rolled a 4Name the person the reply is about.

Talking about someone else? $(touser) is the name typed after the command, and falls back to the viewer.

Looking forThe person typed after the command? That is $(touser).

$(user.id)

The viewer's numeric Twitch user ID.

Example
$(user.id)→44322889
In a response
$(user), your Twitch ID is $(user.id)→ninja, your Twitch ID is 44322889The number behind the name; it never changes, even after a rename.

Most replies want the name, $(user). The ID is for links and tools that ask for it.

Looking forThe name, not the number? $(user). The mentioned person: $(touser.id).

$(chatter)

The viewer who ran the command. Alias of $(user).

Example
$(chatter)→ninja
In a response
Thanks for chatting, $(chatter)!→Thanks for chatting, ninja!Same as $(user), for people who prefer the word.

$(user) and $(chatter) are the same thing; pick one and stick with it.

Looking forSame as $(user); most people use that one.

$(chatter.id)

The running viewer's numeric Twitch ID. Alias of $(user.id).

Example
$(chatter.id)→44322889
In a response
Your ID: $(chatter.id)→Your ID: 44322889Same as $(user.id).

Alias of $(user.id).

Looking forSame as $(user.id).

$(user.followers)

The running viewer's own channel follower count.

Example
$(user.followers)→1,530
In a response
$(user) has $(user.followers) followers on their own channel→ninja has 1,530 followers on their own channelThe viewer's channel, not yours.
$(if $(user.followers) >= 1000)Big streamer in chat!$(endif)→Big streamer in chat!Compare it inside a condition.

Your own count is $(followers); a mentioned channel is $(touser.followers).

Looking forYour channel: $(followers). A mentioned channel: $(touser.followers).

$(user.status)

Whether the running viewer's own channel is live (with game) or offline.

Example
$(user.status)→live playing Fortnite
In a response
$(user) is $(user.status)→ninja is live playing FortniteLive with the category, or "offline".

For a shoutout of someone else, $(touser.status) does the same for the mentioned channel.

Looking forYour channel: $(status). A mentioned channel: $(touser.status).

$(user.title)

The running viewer's own channel stream title.

Example
$(user.title)→ranked grind to Champion
In a response
$(user)'s stream title: $(user.title)→ninja's stream title: ranked grind to ChampionThe viewer's own current title.

Your own title is $(title).

Looking forYour title: $(title). A mentioned channel: $(touser.title).

$(user.viewers)

The running viewer's own channel viewer count (0 if offline).

Example
$(user.viewers)→212
In a response
$(user) has $(user.viewers) viewers right now→ninja has 212 viewers right now0 when their channel is offline.

Your own viewer count is $(viewers).

Looking forYour count: $(viewers). A mentioned channel: $(touser.viewers).

$(user.url)

A link to the running viewer's own channel page.

Example
$(user.url)→https://twitch.tv/ninja
In a response
Go say hi to $(user) at $(user.url)→Go say hi to ninja at https://twitch.tv/ninjaA link to the viewer's own channel.

For a shoutout target use $(touser.url).

Looking forYour channel: $(channel.url). A mentioned channel: $(touser.url).

$(user.tags)

The running viewer's own channel stream tags.

Example
$(user.tags)→English, FPS
In a response
$(user) streams with the tags $(user.tags)→ninja streams with the tags English, FPSComma-separated, empty when they have none.

Your own tags are $(tags).

Looking forYour tags: $(tags). A mentioned channel: $(touser.tags).

$(user.game)

The category the running viewer's own channel last streamed.

Example
$(user.game)→Fortnite
In a response
$(user) last streamed $(user.game)→ninja last streamed FortniteTheir last category, even while offline.

For the person you are shouting out, $(touser.game).

Looking forYour category: $(game). A mentioned channel: $(touser.game).

$(touser)

The first word after the command with any @ removed, or the viewer if none was given. $(touser|text) uses text instead of the viewer.

Example
$(touser)→cohhcarnage
In a response
$(user) hugs $(touser)→ninja hugs cohhcarnage"!hug @cohhcarnage" fills it; a bare "!hug" makes it the viewer.
$(user) hugs $(touser|everyone)→ninja hugs everyoneA fallback after | replaces the viewer when nothing was typed.

Details about that person come from the touser.* family: $(touser.followers), $(touser.game), $(touser.url).

Looking forThe person who ran the command? That is $(user).

$(followage.days)

How many days the viewer has followed, as a plain number (0 when not following).

Example
$(followage.days)→412
In a response
You've followed for $(followage.days) days!→You've followed for 412 days!A plain number, 0 when not following.
$(if $(followage.days) >= 365)Veteran follower!$(else)Thanks for following!$(endif)→Veteran follower!A number you can compare.

For "1 year, 2 months" in words, $(followage).

Looking forIn words: $(followage). Months: $(followage.months). Inside $(if …): followage_days.

$(followage.months)

How many whole months the viewer has followed, as a plain number.

Example
$(followage.months)→13
In a response
$(followage.months) months of following, thank you!→13 months of following, thank you!Whole months only.

Days instead? $(followage.days).

Looking forIn words: $(followage). Days: $(followage.days). Inside $(if …): followage_months.

$(accountage.days)

How many days old the viewer's Twitch account is, as a plain number.

Example
$(accountage.days)→2190
In a response
Your Twitch account is $(accountage.days) days old→Your Twitch account is 2190 days oldA plain number for comparisons.
$(if $(accountage.days) < 7)Welcome to Twitch!$(endif)→Welcome to Twitch!Spot brand-new accounts.

In words, $(accountage); as a date, $(accountdate).

Looking forIn words: $(accountage). The date: $(accountdate). Inside $(if …): accountage_days.

$(user.avatar)

A link to the viewer's profile picture.

Example
$(user.avatar)→https://static-cdn.jtvnw.net/jtv_user_pictures/ninja-profile_image-300x300.png
In a response
$(user)'s profile picture: $(user.avatar)→ninja's profile picture: https://static-cdn.jtvnw.net/jtv_user_pictures/ninja-profile_image-300x300.pngA link to the image, handy in overlays and flows.

For the mentioned person, $(touser.avatar).

Looking forThe mentioned person: $(touser.avatar).

$(touser.avatar)

A link to the @-mentioned user's profile picture (or the viewer's).

Example
$(touser.avatar)→https://static-cdn.jtvnw.net/jtv_user_pictures/cohhcarnage-profile_image-300x300.png
In a response
$(touser)'s picture: $(touser.avatar)→cohhcarnage's picture: https://static-cdn.jtvnw.net/jtv_user_pictures/cohhcarnage-profile_image-300x300.pngThe mentioned user, or the viewer when nobody was typed.

Pairs with $(touser.url) in a shoutout.

Looking forThe viewer who ran the command: $(user.avatar).

$(touser.accountage)

How old the @-mentioned user's Twitch account is (or the viewer's). Like $(accountage) without an argument.

Example
$(touser.accountage)→11 years, 4 months
In a response
$(touser)'s account is $(touser.accountage) old→cohhcarnage's account is 11 years, 4 months oldSame as $(accountage $(touser)), shorter.

For the viewer themselves, $(accountage).

Looking forThe viewer who ran the command: $(accountage).

$(touser.followage)

How long the @-mentioned user has followed you (or the viewer). Like $(followage) without an argument.

Example
$(touser.followage)→1 year, 2 months
In a response
$(touser) has followed for $(touser.followage)→cohhcarnage has followed for 1 year, 2 monthsEmpty when that person does not follow you.

For the viewer themselves, $(followage).

Looking forThe viewer who ran the command: $(followage).

$(random.chatter)

A random active chatter in your channel right now.

Example
$(random.chatter)→pokimane
In a response
$(user) high-fives $(random.chatter)!→ninja high-fives pokimane!Someone in chat right now, picked at random.
Spotlight on $(random.chatter), say hi!→Spotlight on pokimane, say hi!Fun on a timer as well as a command.

Random numbers and options are $(random) and $(pick).

Looking forA random number: $(random). One of your options: $(pick a;b;c).

$(userlevel)

The calling viewer’s level (everyone, subscriber, vip, moderator, broadcaster).

Example
$(userlevel)→moderator
In a response
$(user), you are a $(userlevel) here→ninja, you are a moderator hereeveryone, subscriber, vip, moderator or broadcaster.

To branch on it, use user_level inside $(if …): $(if user_level == "moderator")…$(endif).

Looking forInside $(if …): user_level, or simply mod, vip, subscribed, follower.

$(touser.id)

The numeric Twitch ID of the @-mentioned user (or the viewer).

Example
$(touser.id)→26610234
In a response
$(touser)'s Twitch ID is $(touser.id)→cohhcarnage's Twitch ID is 26610234The mentioned user, or the viewer.

Most replies want the name, $(touser).

Looking forThe viewer who ran the command: $(user.id).

$(touser.followers)

The @-mentioned channel’s follower count.

Example
$(touser.followers)→1,850,000
In a response
Go follow $(touser), they have $(touser.followers) followers!→Go follow cohhcarnage, they have 1,850,000 followers!A shoutout with a number in it.
$(if $(touser.followers) > $(followers))$(touser) is bigger than us, go follow!$(else)Show $(touser) some love$(endif)→cohhcarnage is bigger than us, go follow!Compare their count with yours.

Your own count is $(followers).

Looking forYour channel: $(followers). The viewer's own channel: $(user.followers).

$(touser.status)

Whether the @-mentioned channel is live (with game) or offline.

Example
$(touser.status)→live playing Path of Exile 2
In a response
$(touser) is currently $(touser.status)→cohhcarnage is currently live playing Path of Exile 2Live with the category, or "offline".

Add $(touser.url) so people can click through.

Looking forYour channel: $(status). The viewer's own: $(user.status).

$(touser.title)

The @-mentioned channel’s current stream title.

Example
$(touser.title)→Chill Tuesday | PoE2
In a response
$(touser) is streaming "$(touser.title)"→cohhcarnage is streaming "Chill Tuesday | PoE2"Their current title.

Pairs with $(touser.game) and $(touser.url) in a shoutout.

Looking forYour title: $(title). The viewer's own: $(user.title).

$(touser.viewers)

The @-mentioned channel’s current viewer count (0 if offline).

Example
$(touser.viewers)→4,120
In a response
$(touser) has $(touser.viewers) viewers right now→cohhcarnage has 4,120 viewers right now0 when they are offline.

Your own count is $(viewers).

Looking forYour count: $(viewers). The viewer's own: $(user.viewers).

$(touser.url)

A link to the @-mentioned channel’s page.

Example
$(touser.url)→https://twitch.tv/cohhcarnage
In a response
Go follow $(touser) at $(touser.url)→Go follow cohhcarnage at https://twitch.tv/cohhcarnageThe classic shoutout line.
$(touser) was last playing $(touser.game): $(touser.url)→cohhcarnage was last playing Path of Exile 2: https://twitch.tv/cohhcarnageCategory plus link.

The built-in !so command already posts a line like this.

Looking forYour channel: $(channel.url). The viewer's own: $(user.url).

$(touser.tags)

The @-mentioned channel’s stream tags.

Example
$(touser.tags)→English, RPG
In a response
$(touser) streams under $(touser.tags)→cohhcarnage streams under English, RPGComma-separated, empty when none.

Your own tags are $(tags).

Looking forYour tags: $(tags). The viewer's own: $(user.tags).

Channel & Stream

$(channel)

Your channel / broadcaster display name.

Example
$(channel)→doxmia
In a response
Welcome to $(channel)! Grab a seat.→Welcome to doxmia! Grab a seat.Your display name.
Follow $(channel) for more: $(channel.url)→Follow doxmia for more: https://twitch.tv/doxmiaName plus link.

$(streamer) is the same thing.

Looking forSame as $(streamer). A link: $(channel.url).

$(streamer)

Your channel / broadcaster display name. Alias of $(channel).

Example
$(streamer)→doxmia
In a response
Thanks for hanging out with $(streamer)!→Thanks for hanging out with doxmia!Alias of $(channel).

Alias of $(channel).

Looking forSame as $(channel).

$(game)

The category / game you are currently streaming.

Example
$(game)→Just Chatting
In a response
We are playing $(game) today→We are playing Elden Ring todayYour current category.
$(if $(game) == "Just Chatting")Just vibing, no game right now$(else)Playing $(game)$(endif)→Playing Elden RingMatch the category by name.

Mods can switch the category from chat with the built-in !game command.

Looking forThe viewer's last category: $(user.game). A mentioned channel: $(touser.game).

$(title)

Your current stream title.

Example
$(title)→building the overlay platform
In a response
Today: $(title)→Today: building the overlay platformYour stream title as set on Twitch.

Category is $(game); both together make a good !info reply.

Looking forThe viewer's title: $(user.title). A mentioned channel: $(touser.title).

$(viewers)

Your current live viewer count.

Example
$(viewers)→342
In a response
$(viewers) people watching right now, thank you!→342 people watching right now, thank you!Live viewer count, 0 when offline.

People in chat (not just watching) is $(chatters).

Looking forIn chat rather than watching: $(chatters). The viewer's channel: $(user.viewers). A mentioned channel: $(touser.viewers).

$(uptime)

How long you have been live this stream.

Example
$(uptime)→2h 14m
In a response
$(channel) has been live for $(uptime)→doxmia has been live for 2h 14mThe everyday uptime reply.
$(if live)Live for $(uptime)!$(else)Offline right now, back soon.$(endif)→Live for 2h 14m!Empty when offline, so say something else in that case.

For a number you can compare, $(uptime.minutes).

Looking forA plain number: $(uptime.minutes). True or false in a condition: live. The start date: $(livesince).

$(chatters)

How many people are in chat right now. Needs the moderator chatters permission the bot already asks for.

Example
$(chatters)→312
In a response
$(chatters) people in chat, say hi!→312 people in chat, say hi!Everyone currently in the chat room.

Viewers watching (a different number) is $(viewers).

Looking forPeople watching rather than chatting: $(viewers).

$(uptime.minutes)

How long you have been live this stream, in minutes as a plain number (0 when offline).

Example
$(uptime.minutes)→134
In a response
Live for $(uptime.minutes) minutes so far→Live for 134 minutes so farA plain number, 0 when offline.
$(if $(uptime.minutes) >= 180)Three hours deep!$(endif)→Three hours deep!Compare it in a condition.

In words, $(uptime).

Looking forIn words: $(uptime). Inside $(if …): uptime_minutes.

$(followers)

Your channel’s total follower count.

Example
$(followers)→12,480
In a response
We are at $(followers) followers, thank you all!→We are at 12,480 followers, thank you all!Your total follower count.
$(followers) followers! Goal: 15,000→12,480 followers! Goal: 15,000Pair it with a goal you type yourself.

New follows this stream: $(session.followers). The latest one: $(latest.follower).

Looking forThe viewer's own channel: $(user.followers). A mentioned channel: $(touser.followers).

$(pluspoints)

Your Twitch Plus Points so far this calendar month. Uses Twitch's own figure when your channel is in the Plus Program, and a close estimate otherwise.

Example
$(pluspoints)→39
In a response
Plus Points this month: $(pluspoints)→Plus Points this month: 39Twitch's own number when you are in the Plus Program, our count when you are not.

Sub count is $(subscribers). Your program level is $(pluspoints.level).

$(pluspoints.level)

Your Plus Program level as Twitch has it: 0 if you are not in the program, otherwise 1 or 2. This is your standing, not this month's total, so it does not move with $(pluspoints). Empty until Twitch has answered for your channel.

Example
$(pluspoints.level)→1
In a response
We are Plus Level $(pluspoints.level)→We are Plus Level 1Your standing in the program, not this month's running total.

This one is empty until Twitch has answered for your channel. $(pluspoints), $(pluspoints.next) and $(pluspoints.threshold) have a number whenever $(pluspoints) does, which is every time we have any reading at all.

$(pluspoints.next)

How many Plus Points you still need to reach the goal on your Plus Points bar. 0 once you have reached it. Always a number: Twitch’s own when it has answered, otherwise worked out from your count.

Example
$(pluspoints.next)→47
In a response
$(pluspoints.next) Plus Points to go!→47 Plus Points to go!Counts down to the goal on your Plus Points bar.

Always a number: Twitch’s own figure when it has answered, otherwise worked out from your count against the 100 and 300 thresholds. $(pluspoints.level) is the one that stays empty until Twitch answers.

$(pluspoints.threshold)

The Plus Points goal you are working toward: the one you picked on your Plus Points page, or the next one above your current total if you have not picked one. Always a number, on stream or off.

Example
$(pluspoints.threshold)→100
In a response
$(pluspoints)/$(pluspoints.threshold) Plus Points→53/300 Plus PointsReads like the bar Twitch shows in your chat.

Always a number, the same way $(pluspoints.next) is. The first time you use these after a quiet spell we ask Twitch in the background, so running the command again a moment later shows Twitch’s own figures.

Looking forThe number you typed on a Goal widget is $(goal.pluspoints.target). This one is Twitch's own threshold.

$(status)

Whether you’re live (with the game) or offline.

Example
$(status)→live playing Just Chatting
In a response
$(channel) is $(status)→doxmia is live playing Just ChattingLive with the category, or "offline".

To branch on it: $(if live)…$(else)…$(endif).

Looking forJust true or false for a condition: live. The viewer's channel: $(user.status). A mentioned channel: $(touser.status).

$(tags)

Your current stream tags, comma-separated.

Example
$(tags)→English, Software & Game Dev
In a response
Current tags: $(tags)→Current tags: English, Software & Game DevComma-separated.

Category is $(game).

Looking forThe viewer's tags: $(user.tags). A mentioned channel: $(touser.tags).

$(channel.url)

A link to your channel page.

Example
$(channel.url)→https://twitch.tv/doxmia
In a response
Share the stream: $(channel.url)→Share the stream: https://twitch.tv/doxmiaA link to your channel.

Your public command list is $(url.commands).

Looking forThe viewer's channel: $(user.url). A mentioned channel: $(touser.url). Your command list: $(url.commands).

$(channel.id)

Your channel’s numeric Twitch ID.

Example
$(channel.id)→99288217
In a response
Channel ID: $(channel.id)→Channel ID: 99288217The number behind your channel name.

Most replies want $(channel).

$(livesince)

The date your current stream went live.

Example
$(livesince)→Jun 9, 2026
In a response
Live since $(livesince)→Live since Jun 9, 2026The date the stream started, in your date format.

How long, rather than since when: $(uptime).

Looking forHow long, rather than since when: $(uptime).

$(touser.game)

The category another user (an @-mention, or the viewer) last streamed. Great for shoutouts.

Example
$(touser.game)→Path of Exile 2
In a response
$(touser) was last playing $(touser.game)→cohhcarnage was last playing Path of Exile 2Their last category, even while offline.
Go follow $(touser), last seen playing $(touser.game): $(touser.url)→Go follow cohhcarnage, last seen playing Path of Exile 2: https://twitch.tv/cohhcarnageThe full shoutout line.

Live or not right now: $(touser.status).

Looking forYour category: $(game). The viewer's own: $(user.game).

$(query)

Everything the viewer typed after the command. For a keyword, the whole message.

Example
$(query)→best loadout?
In a response
You asked: $(query)→You asked: best loadout?Everything after the command, spaces and all.
$(user) suggests: $(query)→ninja suggests: best loadout?Empty when nothing was typed, so the sentence should still read.

Just the first word is $(1); words from the second on is $(2..).

Looking forJust the first word: $(1). From the second word on: $(2..). The whole line with the trigger: $(message). Safe inside a link: $(querystring).

$(message)

The whole chat message that triggered the command or keyword, trigger word included.

Example
$(message)→!loadout best loadout?
In a response
You said: $(message)→You said: !loadout best loadout?The whole line, trigger word included.

Without the trigger word, $(query).

Looking forWithout the trigger word: $(query).

$(match)

A capture group from a regex keyword: $(match.1) is the first group, $(match.2) the second, and $(match.0) the whole match. Blank for any other trigger.

Example
$(match.1)→12
In a response
Wow, $(match.1) deaths already?→Wow, 12 deaths already?A regex keyword like ^(\d+) deaths captures the number into $(match.1).
Takes
.1the first capture group
.0the whole match

Only regex keywords fill this; $(match.0) is the whole match.

$(querystring)

Everything typed after the command, URL-encoded (for use inside API URLs).

Example
$(querystring)→best%20loadout%3F
In a response
Search it: https://www.google.com/search?q=$(querystring)→Search it: https://www.google.com/search?q=best%20loadout%3FSafe inside a link; spaces and symbols are encoded.

For plain text in the reply, $(query).

Looking forPlain text for the reply: $(query).

$(1)

A single word the viewer typed, by position. $(1) is the first word after the command, $(2) the second, and so on (for a keyword, the words of the message). $(1|text) falls back to text when the word is missing; $(2..) joins every word from the second on and $(1..3) joins a range.

Example
$(1|stranger)→best
In a response
Rolling for $(1|stranger)…→Rolling for stranger…The fallback after | shows when the viewer typed nothing.
$(1) vs $(2): $(pick $(1);$(2)) wins!→cats vs dogs: dogs wins!Words by position, "!vs cats dogs".
Note from $(user): $(2..)→Note from ninja: remember to hydrate$(2..) joins every word from the second on.
Takes
|strangerfallback when the word is missing
..this word and every word after it

Everything typed, in one go, is $(query).

Looking forEverything typed: $(query). Inside a link: $(querystring).

Date & Time

$(time)

The current time in your configured timezone. Add 24h for a 24-hour clock and/or a timezone name to show another zone.

Example
$(time 24h Europe/London)→21:42
In a response
It is $(time) for me→It is 9:42 PM for meChannel timezone, 12-hour clock.
London: $(time 24h Europe/London)→London: 21:42Another zone, 24-hour clock.
Takes
24h24-hour clock
Europe/Londonanother timezone
24h America/Torontoboth

Today's date is $(date).

Looking forJust the hour for a condition: hour. The date: $(date). Time until a date: $(countdown).

$(countdown)

Time left until a date, like "2 days, 3 hours". Write the date as 2027-12-11, 12/11/2027, Dec 11 2027 6pm, or 11 Dec 2027 18:00, optionally ending with a timezone. Says "now" once the date has passed.

Example
$(countdown Dec 25 2026 6pm)→3 days, 4 hours
In a response
BlizzCon is in $(countdown 09/14/2026)→BlizzCon is in 8 days, 13 hoursSlash dates work either way round; the editor shows the date it understood.
Next stream $(countdown Dec 11 2027 6pm America/Toronto)→Next stream 1 year, 3 monthsA zone at the end overrides the channel zone for that date.
Sub goal ends in $(countdown 2026-12-31 23:59)→Sub goal ends in nowOnce the moment has passed it reads "now", so write the sentence to fit.
Takes
2027-12-11 18:00year first, optional time
Dec 11 2027 6pmmonth name, either order
12/11/2027 America/Torontoslash date, zone at the end overrides yours

Counting the other way? $(countup 2024-06-05) renders time since a date.

Looking forTime since a date: $(countup). The current time: $(time).

$(countup)

Time since a date, like "1 year, 2 months". Same date forms as $(countdown).

Example
$(countup 2024-06-05)→2 years, 3 months
In a response
This channel has been around for $(countup 2024-06-05)→This channel has been around for 2 years, 3 monthsTime since a date, in words.
Days since the last rage quit: $(countup 12/01/2026)→Days since the last rage quit: 4 days, 6 hoursA running "since" counter.
Takes
2024-06-05year first
Jun 5 2024month name

Time until a date is $(countdown).

Looking forTime until a date: $(countdown).

$(date)

Today's date in your configured format and timezone.

Example
$(date)→Jun 9, 2026
In a response
Today is $(date)→Today is Jun 9, 2026Your date format and timezone from Bot settings.

The time is $(time); a countdown to a date is $(countdown).

Looking forThe clock: $(time). The weekday for a condition: day.

$(month)

This month's name in your timezone, like September. The rest of the family is $(month.short), $(month.number), $(month.day), $(month.daysin) and $(month.daysleft).

Example
$(month)→September
In a response
Sub goal for $(month): 50 new subs→Sub goal for September: 50 new subsThe month name in your Bot settings timezone.

Just the number for a comparison: $(month.number). The short form: $(month.short).

Looking forThe month's name, not a count. This month's follows, subs and bits are $(month.followers), $(month.subs) and $(month.bits).

$(month.short)

This month's name shortened to three letters, like Sep.

Example
$(month.short)→Sep
In a response
$(month.short) $(month.day) and we are still here→Sep 8 and we are still hereThree letters, for a title or a tight line.

The full name is $(month). The whole date at once is $(date).

$(month.number)

This month as a plain number, 1 for January through 12 for December.

Example
$(month.number)→9
In a response
$(if $(month.number) == 10)spooky season is open$(else)$(month) it is$(endif)→September it isA number compares cleanly in a condition; a name has to be quoted.

The name instead: $(month). The day of the month: $(month.day).

$(month.day)

Today's day of the month in your timezone, 1 to 31.

Example
$(month.day)→8
In a response
Day $(month.day) of $(month), let us go→Day 8 of September, let us goThe day of the month, with no leading zero.

The day of the year is $(year.day), and the weekday is $(day).

Looking forThe day of the YEAR is $(year.day). The weekday as a word is $(day).

$(month.daysin)

How many days this month has: 28, 29, 30 or 31, leap years included.

Example
$(month.daysin)→30
In a response
$(month) has $(month.daysin) days and we are streaming most of them→September has 30 days and we are streaming most of themLeap years are handled, so February reads 29 when it should.

How many of those are still to come: $(month.daysleft).

$(month.daysleft)

How many days are left in the month after today. Today is not counted, so it reads 0 on the last day of the month.

Example
$(month.daysleft)→22
In a response
$(month.daysleft) days left in $(month) to hit the sub goal→22 days left in September to hit the sub goalToday is not counted, so it reads 0 on the last day.
That is $(math $(month.daysleft) + 1) days counting today→That is 23 days counting todayAdd one when you want today in the number.

Today is not counted: use $(math $(month.daysleft) + 1) to include it. Plus Points reset at the start of each month, so this pairs with $(pluspoints.next) for a "days left to go" line.

Looking forThe rest of the year, not the month: $(year.daysleft).

$(year)

The current year in your timezone, as four digits. The rest of the family is $(year.day), $(year.daysin), $(year.daysleft), $(year.week) and $(year.weeksleft).

Example
$(year)→2026
In a response
Stream 200 of $(year), thanks for being here→Stream 200 of 2026, thanks for being hereFour digits, in your Bot settings timezone.

The month name: $(month). The whole date: $(date).

$(year.day)

Which day of the year today is, 1 on 1 January through 365 or 366.

Example
$(year.day)→251
In a response
Day $(year.day) of $(year)→Day 251 of 20261 on 1 January, counting up to 365 or 366.

The day of the month instead: $(month.day).

Looking forThe day of the MONTH is $(month.day).

$(year.daysin)

How many days this year has: 365, or 366 in a leap year.

Example
$(year.daysin)→365
In a response
$(year) has $(year.daysin) days in it→2026 has 365 days in itReads 366 in a leap year.

How many of those are still to come: $(year.daysleft).

$(year.daysleft)

How many days are left in the year after today. Today is not counted, so it reads 0 on 31 December.

Example
$(year.daysleft)→114
In a response
$(year.daysleft) days left in $(year), plenty of time→114 days left in 2026, plenty of timeToday is not counted, so it reads 0 on 31 December.
That is $(math $(year.daysleft) + 1) days counting today→That is 115 days counting todayAdd one when you want today in the number.

Today is not counted: use $(math $(year.daysleft) + 1) to include it. In whole weeks: $(year.weeksleft).

Looking forThe rest of the month, not the year: $(month.daysleft).

$(year.week)

The week number of the year, 1 to 53. Weeks run Monday to Sunday, so the first days of January can still belong to the last week of the year before.

Example
$(year.week)→37
In a response
Week $(year.week) of $(year), same time same place→Week 37 of 2026, same time same placeWeeks run Monday to Sunday, so early January can still be week 53 of the year before.

Weeks still to come: $(year.weeksleft). This week's follows and subs: $(week.followers) and $(week.subs).

Looking forThis week's follows and subs, not the week number: $(week.followers) and $(week.subs).

$(year.weeksleft)

How many whole weeks are left in the year after today, the days left divided by seven and rounded down.

Example
$(year.weeksleft)→16
In a response
$(year.weeksleft) more weeks of streams this year→16 more weeks of streams this yearThe days left divided by seven, rounded down.

The days behind that number: $(year.daysleft).

$(random)

A random whole number: $(random 6) is 1 to 6, $(random 10-20) is 10 to 20, and $(random) on its own is 1 to 100.

Example
$(random 1-6)→4
In a response
$(user) rolls a $(random 1-6)→ninja rolls a 4A range, low to high.
$(touser) is $(random 1-100)% cool→cohhcarnage is 87% coolThe classic percent roll.
$(if $(random 1-100) <= 10)JACKPOT $(user)!$(else)no luck$(endif)→no luckA one-in-ten chance inside a condition.
Takes
1-6a dice roll
1001 to 100
1-100a percent roll

Random words instead of numbers? $(pick yes;no;maybe) picks one option.

Looking forOne of your own options: $(pick a;b;c). A random person in chat: $(random.chatter).

$(pick)

One option at random. Separate options with semicolons; an option may contain other tokens, even another $(pick). Repeat an option to make it more likely.

Example
$(pick heads;tails)→tails
In a response
Magic 8-ball says: $(pick yes;no;maybe;ask again later)→Magic 8-ball says: maybeOptions separated by semicolons.
Coin flip: $(pick heads;tails)→Coin flip: tailsTwo options, even odds.
Loot: $(pick common;common;common;rare;legendary)→Loot: commonRepeat an option to make it more likely.
Takes
yes;no;maybeoptions separated by semicolons
heads;tailsa coin flip

Numbers instead? $(random 1-6).

Looking forA random number: $(random 1-6). A random person: $(random.chatter).

Numbers

$(math)

Works out an expression: + - * / % and ^, parentheses, and round, floor, ceil, abs, min, max. Other tokens can appear inside it.

Example
$(math $(count.deaths) * 2)→24
In a response
Deaths per hour: $(math $(count.deaths) / max(1, $(uptime.minutes)) * 60)→Deaths per hour: 5.14Tokens inside are filled in first, then the math runs. Two decimals.
Half of $(1|10) is $(math $(1|10) / 2)→Half of 10 is 5Viewer input can feed it; a broken expression renders nothing.
Followers to go: $(math 15000 - $(followers))→Followers to go: 2520A goal countdown.
Takes
$(count.deaths) * 2a counter times two
15000 - $(followers)distance to a goal
round($(uptime.minutes) / 60)hours, rounded

For comparisons you do not need math: $(if $(followers) >= 15000)…$(endif) works directly.

API & Advanced

$(command)

Runs another command in place and pastes its reply. Chains up to three deep; a command cannot run itself, and API commands, protected built-ins and fallback-backed commands cannot be chained.

Example
$(command !so $(touser))→Go follow CohhCarnage at twitch.tv/cohhcarnage
In a response
$(user) hugs $(touser). $(command !so $(touser))→ninja hugs cohhcarnage. Go follow cohhcarnage at twitch.tv/cohhcarnageThe inner $(touser) is filled first, then !so runs with it.
$(command !deaths) and $(command !uptime)→Died 12 times and Live for 2h 14mTwo commands in one reply.
Takes
!so $(touser)run !so for the mentioned user
!deathspaste another command's reply

The viewer still needs the target command's permission level, and the target's count does not go up.

$(api)

The raw response body of this command’s configured API call.

Example
$(api)→{"temp":21,"humidity":72}
In a response
Weather: $(api)→Weather: London: ⛅ +14°CThe whole reply of this command's API call, as text.

One field out of a JSON reply: $(api.main.temp). The API call is set up on the command itself.

$(api.<field>)

A single field pulled from this command’s JSON API response.

Example
$(api.main.temp)→21
In a response
It is $(api.main.temp)°C in $(query)→It is 21°C in TokyoA dotted path into the JSON reply.
Top: $(api.results.0.title)→Top: Elden RingNumbers pick an item out of a list.
Takes
.main.tempa nested field
.results.0.titlefirst item of a list

The whole reply as text: $(api).

$(url.commands)

A public link to your channel’s command list.

Example
$(url.commands)→https://overlaything.com/c/doxmia
In a response
All my commands: $(url.commands)→All my commands: https://overlaything.com/c/doxmiaYour public command list.

Only commands with "show in public list" appear there.

Web

$(urlfetch)

Fetches a web address and pastes its response, trimmed to one line. Put viewer input in the address with $(querystring). For headers, secrets or a single JSON field, use an API command instead.

Example
$(urlfetch https://wttr.in/London?format=3)→London: ⛅ +14°C
In a response
Weather: $(urlfetch https://wttr.in/$(querystring)?format=3)→Weather: Tokyo: 🌧 +12°C"!weather Tokyo" puts Tokyo in the address, encoded.
Takes
https://wttr.in/$(querystring)?format=3weather for whatever the viewer typed

A page that returns HTML renders as nothing; pick an address that answers in plain text.

Text

$(upper)

The text in UPPER CASE. Other tokens can appear inside it.

Example
$(upper $(user))→NINJA
In a response
$(upper $(user)) IS HERE!→NINJA IS HERE!Shouting a name.
HYPE: $(upper $(query))→HYPE: lets goUppercase whatever the viewer typed.
Takes
$(user)the viewer name
$(query)whatever was typed

The opposite is $(lower …).

$(lower)

The text in lower case. Other tokens can appear inside it.

Example
$(lower $(touser))→cohhcarnage
In a response
twitch.tv/$(lower $(touser))→twitch.tv/cohhcarnageLowercase for a hand-built link.
Takes
$(touser)the mentioned name

The opposite is $(upper …). A ready-made link is $(touser.url).

$(len)

How many characters the text has. Other tokens can appear inside it.

Example
$(len $(query))→13
In a response
That message was $(len $(query)) characters long→That message was 13 characters longCounts characters, emoji included.
$(if $(len $(query)) > 100)Whoa, essay.$(else)Short and sweet.$(endif)→Short and sweet.Branch on length.
Takes
$(query)whatever was typed

Number of words is not a token; $(2..) gives you the words themselves.

Loyalty

$(followage)

How long a user (an @-mention, or the viewer) has followed your channel.

Example
$(followage @cohhcarnage)→2 years, 3 months
In a response
Thanks for following for $(followage)!→Thanks for following for 1 year, 2 months!The viewer's own follow age.
$(touser) has followed for $(followage $(touser))→cohhcarnage has followed for 4 years, 1 monthSomeone else's, from the name typed after the command.
$(if follower)following for $(followage)$(else)not following yet$(endif)→not following yetRenders empty for non-followers, so pair it with a condition.
Takes
@cohhcarnagesomeone else, by mention
$(touser)whoever was typed after the command

Want a number instead of words? $(followage.days) and $(followage.months) print plain numbers for comparisons.

Looking forA plain number: $(followage.days) or $(followage.months). The mentioned person: $(touser.followage). True or false in a condition: follower.

$(watchtime)

Total tracked watch time for a user (an @-mention, or the viewer). Needs Loyalty enabled.

Example
$(watchtime @cohhcarnage)→38h 12m
In a response
$(user), you've watched for $(watchtime). Legend.→ninja, you've watched for 38h 12m. Legend.Needs the Loyalty module on.
$(touser) has $(watchtime $(touser)) of watch time→cohhcarnage has 12h 40m of watch timeSomeone else's, by the name typed after the command.
Takes
@cohhcarnagesomeone else, by mention
$(touser)whoever was typed after the command

Plain numbers for comparisons: $(watchtime.minutes) and $(watchtime.hours).

Looking forA plain number: $(watchtime.minutes) or $(watchtime.hours). Inside $(if …): watchtime_hours.

$(watchtime.minutes)

The viewer's tracked watch time in minutes, as a plain number. Needs Loyalty enabled.

Example
$(watchtime.minutes)→2292
In a response
Watch time: $(watchtime.minutes) minutes→Watch time: 2292 minutesNeeds the Loyalty module on.

In words, $(watchtime).

Looking forIn words: $(watchtime). Hours: $(watchtime.hours). Inside $(if …): watchtime_minutes.

$(watchtime.hours)

The viewer's tracked watch time in whole hours, as a plain number. Needs Loyalty enabled.

Example
$(watchtime.hours)→38
In a response
$(if $(watchtime.hours) >= 100)100-hour club!$(else)$(watchtime.hours) hours in, keep going$(endif)→100-hour club!Whole hours; compare or print.

In words, $(watchtime).

Looking forIn words: $(watchtime). Minutes: $(watchtime.minutes). Inside $(if …): watchtime_hours.

$(accountage)

How long ago a user (an @-mention, or the viewer) created their Twitch account.

Example
$(accountage @cohhcarnage)→11 years
In a response
$(user), your Twitch account is $(accountage) old→ninja, your Twitch account is 6 years oldThe viewer's own account age.
$(touser)'s account: $(accountage $(touser))→cohhcarnage's account: 11 yearsSomeone else's.
Takes
@cohhcarnagesomeone else, by mention
$(touser)whoever was typed after the command

The exact date is $(accountdate); days as a number, $(accountage.days).

Looking forThe date itself: $(accountdate). A plain number: $(accountage.days). The mentioned person: $(touser.accountage).

$(accountdate)

The date a user (an @-mention, or the viewer) created their Twitch account.

Example
$(accountdate)→Mar 14, 2015
In a response
$(user) joined Twitch on $(accountdate)→ninja joined Twitch on Mar 14, 2015In your date format.

How long ago, in words: $(accountage).

Looking forHow long ago, in words: $(accountage).

$(subscribers)

Your channel’s total subscriber count. Aliases: $(subscriber), $(subcount).

Example
$(subscribers)→486
In a response
We have $(subscribers) subs, thank you!→We have 486 subs, thank you!Your current subscriber count.
$(subscribers) subs! Next goal: 500→486 subs! Next goal: 500Pair it with a goal you type yourself.

New subs this stream: $(session.subs). The latest one: $(latest.sub).

Looking forTrue or false for one viewer, in a condition: subscribed. Their tier: tier.

$(subscriber)

Alias of $(subscribers) | your channel’s total subscriber count.

Example
$(subscriber)→486
In a response
Sub count: $(subscriber)→Sub count: 486Alias of $(subscribers).

Alias of $(subscribers).

Looking forSame as $(subscribers). Whether one viewer is subbed: subscribed.

$(subcount)

Alias of $(subscribers) | your channel’s total subscriber count.

Example
$(subcount)→486
In a response
Sub count: $(subcount)→Sub count: 486Alias of $(subscribers).

Alias of $(subscribers).

Looking forSame as $(subscribers).

Quotes

$(quote)

A random saved quote (its text). Same pick as $(quote.text) in the same response.

Example
$(quote)→dont feed the trolls
In a response
"$(quote)"→"dont feed the trolls"A random saved quote. Needs the Quotes module on.
#$(quote.id): "$(quote)" - $(quote.author)→#42: "dont feed the trolls" - doxmiaThe same pick fills all three in one reply.

Viewers add quotes with the module's own !addquote command.

Looking forSame as $(quote.text). Who said it: $(quote.author). Its number: $(quote.id).

$(quote.text)

The text of a random saved quote.

Example
$(quote.text)→dont feed the trolls
In a response
Quote: $(quote.text)→Quote: dont feed the trollsSame as $(quote).

Same as $(quote).

Looking forSame as $(quote).

$(quote.author)

The author of the random quote.

Example
$(quote.author)→doxmia
In a response
"$(quote)" said $(quote.author)→"dont feed the trolls" said doxmiaWho the random quote is attributed to.

Its number is $(quote.id).

$(quote.id)

The per-channel number of the random quote.

Example
$(quote.id)→42
In a response
Quote #$(quote.id): $(quote)→Quote #42: dont feed the trollsThe per-channel number, so people can ask for it again.

Who said it: $(quote.author).

Counters

$(count)

How many times this command has run, counting this one (or, inside a counter's own response, that counter's value).

Example
$(count)→128
In a response
This command has been used $(count) times→This command has been used 128 timesEach run adds one, including this one.
$(user) is hype fan number $(count)!→ninja is hype fan number 128!A running tally makes a fun reply.

Need a counter you bump from anywhere, like deaths? Make a named counter and read it with $(count.deaths).

Looking forA counter you bump yourself, like deaths: $(count.deaths).

$(count.<name>)

The current value of a named counter. Counters only change when a command or dashboard action explicitly increments them | they do NOT measure how often a word or phrase appears in chat messages.

Example
$(count.deaths)→7
In a response
$(channel) has died $(count.deaths) times this stream→doxmia has died 7 times this streamA named counter, bumped by its own command or the dashboard.
Deaths: $(count.deaths) | Wins: $(count.wins)→Deaths: 7 | Wins: 3Two counters in one reply.
Takes
deathsthe counter name

Counters only move when something increments them; they do not count words in chat.

Looking forThis command's own run count: $(count).

Queue

$(queue.current)

The viewer currently up (now playing) in the queue.

Example
$(queue.current)→ninja
In a response
Now playing with $(queue.current)→Now playing with ninjaNeeds the Queue module on.

Who is next: $(queue.next).

$(queue.next)

The next viewer waiting in the queue.

Example
$(queue.next)→shroud
In a response
Up next: $(queue.next)→Up next: shroudEmpty when nobody is waiting.

The next five: $(queue.list).

$(queue.count)

How many viewers are waiting in the queue.

Example
$(queue.count)→5
In a response
$(queue.count) people waiting to play→5 people waiting to playA plain number.

Where the viewer stands: $(queue.position).

$(queue.list)

Up to the next 5 waiting viewers, comma-separated.

Example
$(queue.list)→shroud, pokimane, tfue, myth, sykkuno
In a response
Queue: $(queue.list)→Queue: shroud, pokimane, tfue, myth, sykkunoUp to five names, comma-separated.

Just the count: $(queue.count).

$(queue.position)

The calling viewer's position in the queue.

Example
$(queue.position)→3
In a response
$(user), you're number $(queue.position) in the queue→ninja, you're number 3 in the queueEmpty when the viewer is not in it.

How many ahead in total: $(queue.count).

Media Requests

$(media.current)

The now-playing song, with who requested it.

Example
$(media.current)→Darude - Sandstorm (requested by ninja)
In a response
Now playing: $(media.current)→Now playing: Darude - Sandstorm (requested by ninja)Title and requester in one. Needs Media Requests on.

Just the title: $(media.current.title); the link: $(media.current.url).

$(media.current.title)

The title of the now-playing song.

Example
$(media.current.title)→Darude - Sandstorm
In a response
Song: $(media.current.title)→Song: Darude - SandstormTitle only.

With the requester: $(media.current).

$(media.current.artist)

The channel / artist of the now-playing song.

Example
$(media.current.artist)→Darude
In a response
By $(media.current.artist)→By DarudeThe channel or artist of the current song.

Title: $(media.current.title).

$(media.current.url)

A YouTube link to the now-playing song.

Example
$(media.current.url)→https://youtu.be/y6120QOlsfU
In a response
Listen: $(media.current.url)→Listen: https://youtu.be/y6120QOlsfUA YouTube link.

Title: $(media.current.title).

$(media.requester)

Who requested the now-playing song.

Example
$(media.requester)→ninja
In a response
Thanks $(media.requester) for this one!→Thanks ninja for this one!Who requested the current song.

Song and requester together: $(media.current).

$(media.next)

The title of the next song in the request queue.

Example
$(media.next)→Never Gonna Give You Up
In a response
Coming up: $(media.next)→Coming up: Never Gonna Give You UpEmpty when the queue is empty.

The next five: $(media.queue).

$(media.queue)

Up to the next 5 requested song titles, comma-separated.

Example
$(media.queue)→Never Gonna Give You Up, Megalovania, Sandstorm
In a response
Up next: $(media.queue)→Up next: Never Gonna Give You Up, Megalovania, SandstormUp to five titles.

Just the number waiting: $(media.count).

$(media.count)

How many songs are waiting in the request queue.

Example
$(media.count)→3
In a response
$(media.count) songs in the queue→3 songs in the queueA plain number.

The titles: $(media.queue).

League of Legends

$(lol.rank)

A League player's ranked solo/duo tier, LP and win/loss. Needs the Riot integration enabled.

Example
$(lol.rank Faker#KR1 kr)→Challenger 1,487 LP (412W / 388L)
In a response
$(channel) is $(lol.rank Faker#KR1 kr)→doxmia is Challenger 1,487 LP (412W / 388L)A fixed player. Needs the Riot integration on.
$(touser) is ranked $(lol.rank $(query))→cohhcarnage is ranked Diamond II 61 LP (98W / 80L)Let viewers type "!rank Name#Tag na".
Takes
Faker#KR1 krRiot ID, then the region
$(query)let viewers type a Riot ID and region

Recent results: $(lol.recent …); top champions: $(lol.champs …).

$(lol.recent)

A League player's last 5 ranked-solo results plus today's win/loss record.

Example
$(lol.recent Faker#KR1 kr)→WWLWW · today 3-1
In a response
Last games: $(lol.recent Faker#KR1 kr)→Last games: WWLWW · today 3-1Last five results plus today.
Takes
Faker#KR1 krRiot ID, then the region
$(query)let viewers type a Riot ID and region

Current rank: $(lol.rank …).

$(lol.champs)

A League player's top 3 most-played ranked-solo champions with win rates.

Example
$(lol.champs Faker#KR1 kr)→Azir 62%, Ahri 58%, Orianna 55%
In a response
Most played: $(lol.champs Faker#KR1 kr)→Most played: Azir 62%, Ahri 58%, Orianna 55%Top three with win rates.
Takes
Faker#KR1 krRiot ID, then the region
$(query)let viewers type a Riot ID and region

Current rank: $(lol.rank …).

Conditionals

$(if)

Show text only when a condition is true. Pair with $(endif).

Example
$(if subscribed)thanks for subbing!$(endif)→thanks for subbing!
In a response
$(if subscribed)thanks for subbing!$(else)hi $(user)$(endif)→thanks for subbing!Only the matching branch is posted.
$(if tier == 3)Tier 3 legend$(elseif tier == 2)Tier 2 hero$(else)Not subbed yet$(endif)→Tier 2 hero$(elseif) adds cases to one block; the first match wins.

Anything you can check is listed under Conditions: subscribed, tier, mod, follower, live, hour and any $( ) token.

$(else)

The text to show when the $(if) condition is false.

Example
$(if mod)hi boss$(else)hi$(endif)→hi boss
In a response
$(if mod)hi boss$(else)hi $(user)$(endif)→hi ninjaThe branch for everyone the condition does not match.

More than two cases? $(elseif …) between the if and the else.

$(endif)

Closes an $(if) block.

Example
$(if vip)VIP$(endif)→VIP
In a response
$(if vip)VIP in the house!$(endif) Welcome, $(user).→Welcome, ninja.Text after $(endif) always shows; the block before it only for VIPs.

Every $(if …) needs one $(endif); the editor underlines a missing one.

$(subscribed)

True when the viewer is subscribed. Aliases: sub, subscriber.

Example
$(if subscribed)thanks for the support!$(endif)→thanks for the support!
In a response
$(if subscribed)thanks for the support, $(user)!$(else)consider subbing, $(user)!$(endif)→thanks for the support, ninja!Subs and founders count.

Which tier: tier. Months subbed is not tracked; watch time is watchtime_hours.

Looking forWhich tier: tier. Your total sub count: $(subscribers).

$(founder)

True when the viewer is a founder (one of the channel’s earliest subscribers).

Example
$(if founder)OG sub!$(endif)→OG sub!
In a response
$(if founder)OG sub! $(user) was here from the start$(endif)→OG sub! ninja was here from the startOne of your earliest subscribers.

Any sub at all: subscribed.

$(mod)

True when the viewer is a moderator (the broadcaster counts too). Alias: moderator.

Example
$(if mod)mod tools ready$(endif)→mod tools ready
In a response
$(if mod)Mod tools: !timeout !clip !title$(else)Ask a mod for help$(endif)→Mod tools: !timeout !clip !titleYou count as a mod too.

Only you: broadcaster. The exact level as a word: user_level.

Looking forOnly the channel owner: broadcaster. The level as a word: user_level.

$(vip)

True when the viewer has the VIP badge.

Example
$(if vip)VIP in the house$(endif)→VIP in the house
In a response
$(if vip)VIP lane for $(user)!$(else)standard queue$(endif)→VIP lane for ninja!The VIP badge.

Subs and VIPs together: $(if subscribed or vip)…$(endif).

$(broadcaster)

True only when the channel owner runs the command. Alias: streamer.

Example
$(if broadcaster)hey boss$(endif)→hey boss
In a response
$(if broadcaster)hey boss$(else)hey $(user)$(endif)→hey bossTrue only for the channel owner.

Mods and you together: mod.

Looking forMods and you together: mod.

$(bits)

How many bits the viewer cheered in this message (0 if none).

Example
$(if bits >= 100)big cheer!$(endif)→big cheer!
In a response
$(if bits >= 100)Big cheer, thank you $(user)!$(elseif bits > 0)Thanks for the bits!$(endif)→Big cheer, thank you ninja!How many bits came with this message.

Just whether there was a cheer at all: is_cheer.

$(is_cheer)

True when this message included a bit cheer.

Example
$(if is_cheer)thanks for the bits!$(endif)→thanks for the bits!
In a response
$(if is_cheer)thanks for the bits, $(user)!$(endif)→thanks for the bits, ninja!True when the message carried bits.

The amount: bits.

$(emote_count)

How many emotes the viewer used in this message.

Example
$(if emote_count >= 3)so many emotes$(endif)→so many emotes
In a response
$(if emote_count >= 3)so many emotes, $(user)!$(endif)→so many emotes, ninja!Emotes in this message.

Handy on a keyword rather than a command.

$(first_time)

True when this is the viewer’s first-ever chat message in your channel.

Example
$(if first_time)welcome!$(endif)→welcome!
In a response
$(if first_time)Welcome to the stream, $(user)! 🎉$(else)wb $(user)$(endif)→Welcome to the stream, ninja! 🎉Their first-ever message in your chat.

The opposite is returning; the Welcome module can greet automatically.

$(returning)

True when the viewer has chatted before (a returning chatter).

Example
$(if returning)welcome back!$(endif)→welcome back!
In a response
$(if returning)welcome back, $(user)!$(endif)→welcome back, ninja!They have chatted before.

How many streams they have been in: streams_seen.

$(streams_seen)

How many of your streams this viewer has been seen in.

Example
$(if streams_seen >= 10)regular!$(endif)→regular!
In a response
$(if streams_seen >= 10)regular! $(user) has been here $(streams_seen) streams$(endif)→regular! ninja has been here 14 streamsStreams this viewer has chatted in.

Watch time in hours: watchtime_hours.

$(hour)

The current hour (0 to 23) in your timezone. Also prints on its own as $(hour).

Example
$(if hour >= 22)late-night crew$(endif)→late-night crew
In a response
$(if hour >= 18)Good evening$(elseif hour >= 12)Good afternoon$(else)Good morning$(endif), $(user)!→Good evening, ninja!Your timezone, 0 to 23.

The clock as text: $(time). The weekday: day.

Looking forThe clock as text: $(time). Printable: $(hour).

$(day)

The current weekday in your timezone as mon, tue, wed, thu, fri, sat or sun. Also prints on its own as $(day).

Example
$(if day == "fri")happy Friday!$(endif)→happy Friday!
In a response
$(if day == "fri")Happy Friday, $(user)!$(else)Have a good one, $(user)!$(endif)→Happy Friday, ninja!mon, tue, wed, thu, fri, sat or sun.

The hour: hour. The date as text: $(date).

Looking forThe date as text: $(date). Printable: $(day).

$(tier)

The viewer's sub tier as a number (0=not subbed, 1/2/3). Prime counts as 1. Also prints on its own as $(tier).

Example
$(if tier >= 2)Tier 2+ perk unlocked$(endif)→Tier 2+ perk unlocked
In a response
$(if tier >= 2)Tier 2+ perk unlocked for $(user)!$(endif)→Tier 2+ perk unlocked for ninja!0 = not subbed, 1, 2 or 3. Prime counts as 1.

Just subbed or not: subscribed.

Looking forJust subbed or not: subscribed. Printable: $(tier).

$(follower)

True when the viewer follows your channel. Alias: following.

Example
$(if follower)thanks for following!$(endif)→thanks for following!
In a response
$(if follower)thanks for following, $(user)!$(else)hit that follow button, $(user)!$(endif)→thanks for following, ninja!Whether they follow you.

How long: followage_days, or $(followage) in words.

Looking forHow long they have followed, in words: $(followage). As a number: followage_days.

$(followage_days)

How many days the viewer has followed your channel.

Example
$(if followage_days >= 30)1+ month follower$(endif)→1+ month follower
In a response
$(if followage_days >= 30)1+ month follower!$(endif)→1+ month follower!Days followed, 0 when not following.

In months: followage_months. Printable: $(followage.days).

Looking forIn the reply rather than the condition: $(followage.days).

$(followage_months)

How many months the viewer has followed your channel.

Example
$(if followage_months >= 12)1-year follower!$(endif)→1-year follower!
In a response
$(if followage_months >= 12)A whole year of following, thank you $(user)!$(endif)→A whole year of following, thank you ninja!Whole months followed.

In days: followage_days.

Looking forIn the reply rather than the condition: $(followage.months).

$(watchtime_minutes)

The viewer’s total watch time in minutes.

Example
$(if watchtime_minutes >= 60)1+ hour watched$(endif)→1+ hour watched

In hours: watchtime_hours.

Looking forIn the reply rather than the condition: $(watchtime.minutes).

$(watchtime_hours)

The viewer’s total watch time in hours.

Example
$(if watchtime_hours >= 100)100-hour club!$(endif)→100-hour club!
In a response
$(if watchtime_hours >= 100)100-hour club, $(user)!$(endif)→100-hour club, ninja!Needs the Loyalty module on.

Printable: $(watchtime.hours), or $(watchtime) in words.

Looking forIn the reply rather than the condition: $(watchtime.hours).

$(live)

True when your channel is currently live. Alias: is_live.

Example
$(if live)we’re live!$(endif)→we’re live!
In a response
$(if live)We're live for $(uptime)!$(else)Offline right now, see you next stream.$(endif)→We're live for 2h 14m!Whether your stream is on.

Live with the category as text: $(status).

Looking forLive with the category, as text: $(status). How long: $(uptime).

$(uptime_minutes)

How many minutes the current stream has been live.

Example
$(if uptime_minutes >= 120)2+ hours in$(endif)→2+ hours in
In a response
$(if uptime_minutes >= 120)2+ hours in, hydrate!$(endif)→2+ hours in, hydrate!Minutes live, 0 when offline.

Printable: $(uptime.minutes), or $(uptime) in words.

Looking forIn the reply rather than the condition: $(uptime.minutes).

$(accountage_days)

How many days old the viewer's Twitch account is.

Example
$(if accountage_days < 7)welcome, new account!$(endif)→welcome, new account!
In a response
$(if accountage_days < 7)welcome to Twitch, $(user)!$(endif)→welcome to Twitch, ninja!Age of their Twitch account in days.

Printable: $(accountage.days), or $(accountage) in words.

Looking forIn the reply rather than the condition: $(accountage.days).

$(user_level)

The viewer's permission level: everyone, subscriber, vip, moderator, lead_moderator, or broadcaster. Alias: userlevel.

Example
$(if user_level == "moderator")thanks for modding!$(endif)→thanks for modding!
In a response
$(if user_level == "moderator")thanks for modding, $(user)!$(endif)→thanks for modding, ninja!everyone, follower, regular, subscriber, vip, moderator, lead_moderator or broadcaster.

Most checks are simpler as mod, vip, subscribed or follower.

Looking forPrintable: $(userlevel). Simpler checks: mod, vip, subscribed, follower.

Giveaway

$(entries)

Live giveaway entry count (0 when no giveaway is running).

Example
$(entries)→42
In a response
$(entries) people have entered so far, type the keyword to join!→42 people have entered so far, type the keyword to join!Needs a giveaway running.

What they win: $(prize).

$(prize)

The configured giveaway prize (empty when none set).

Example
$(prize)→a Steam key
In a response
We're giving away $(prize)!→We're giving away a Steam key!Empty when no prize is set.

How many entered: $(entries).

Hype Train

$(hypetrain.active)

yes while a Hype Train is running, otherwise no.

Example
$(if $(hypetrain.active) == "yes")train is live!$(endif)→train is live!
In a response
$(if $(hypetrain.active) == "yes")Hype Train level $(hypetrain.level) is live, jump in!$(endif)→Hype Train level 5 is live, jump in!"yes" or "no", so compare it in a condition.

Progress toward the next level: $(hypetrain.progress) of $(hypetrain.goal).

$(hypetrain.level)

Current Hype Train level (empty when none).

Example
$(hypetrain.level)→5
In a response
Hype Train level $(hypetrain.level)!→Hype Train level 5!Empty when no train is running.

Whether one is running: $(hypetrain.active).

$(hypetrain.progress)

Points earned toward the next level (empty when no train or at the end).

Example
$(hypetrain.progress)→9500
In a response
$(hypetrain.progress) / $(hypetrain.goal) to the next level→9500 / 15000 to the next levelPoints so far toward the next level.

The total this train: $(hypetrain.total).

$(hypetrain.goal)

Points needed for the next level (empty when no train or at the end).

Example
$(hypetrain.goal)→15000
In a response
Need $(hypetrain.goal) points for the next level→Need 15000 points for the next levelEmpty at the last level.

Points so far: $(hypetrain.progress).

$(hypetrain.total)

Total points contributed to the current/last train.

Example
$(hypetrain.total)→14250
In a response
This train: $(hypetrain.total) points, conductor $(hypetrain.conductor)→This train: 14250 points, conductor PixelPaladinTotal contributed to the current or last train.

Current level: $(hypetrain.level).

$(hypetrain.conductor)

Display name of the top contributor (the conductor).

Example
$(hypetrain.conductor)→PixelPaladin
In a response
All aboard, conductor $(hypetrain.conductor)!→All aboard, conductor PixelPaladin!The top contributor.

Their total is part of $(hypetrain.total).

$(hypetrain.type)

Train type: regular, treasure or golden_kappa (empty when no train).

Example
$(hypetrain.type)→golden_kappa
In a response
$(if $(hypetrain.type) == "golden_kappa")GOLDEN KAPPA TRAIN!$(else)Hype Train!$(endif)→GOLDEN KAPPA TRAIN!regular, treasure or golden_kappa.

Whether one is running: $(hypetrain.active).

Ad Breaks

$(ad.nextin)

Time until the next scheduled ad (e.g. "4m 30s"). Empty when no upcoming ad.

Example
$(ad.nextin)→4m 30s
In a response
Next ad in $(ad.nextin), grab a drink→Next ad in 4m 30s, grab a drinkEmpty when no ad is scheduled.

Mods can push it back with the built-in !snoozead; snoozes left: $(ad.snoozecount).

$(ad.lastago)

Time since the last ad ran (e.g. "12m"). Empty when unknown.

Example
$(ad.lastago)→12m
In a response
Last ad was $(ad.lastago) ago→Last ad was 12m agoEmpty when unknown.

The next one: $(ad.nextin).

$(ad.duration)

Current or last ad length, beautified (e.g. "1 min 30 secs"). Empty when unknown.

Example
$(ad.duration)→1 min 30 secs
In a response
Ads run for $(ad.duration), back soon!→Ads run for 1 min 30 secs, back soon!The current or last ad length.

When the next starts: $(ad.nextin).

$(ad.snoozecount)

Number of ad snoozes remaining. Returns "0" when none or no schedule.

Example
$(ad.snoozecount)→2
In a response
$(ad.snoozecount) ad snoozes left→2 ad snoozes left"0" when none.

Mods use the built-in !snoozead to spend one.

$(ad.prerollfree)

Preroll-free seconds remaining. Empty when no schedule.

Example
$(ad.prerollfree)→300
In a response
Preroll-free for another $(ad.prerollfree) seconds→Preroll-free for another 300 secondsEmpty when there is no schedule.

The next ad: $(ad.nextin).

Stream data

$(latest.follower)

The most recent follower.

Example
$(latest.follower)→cdnkiffer
In a response
Latest follower: $(latest.follower)→Latest follower: cdnkifferThe most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.sub)

The most recent subscriber.

Example
$(latest.sub)→Mmiwo
In a response
Latest sub: $(latest.sub)→Latest sub: MmiwoThe most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.sub.tier)

The most recent subscriber's tier (1, 2 or 3).

Example
$(latest.sub.tier)→1
In a response
Latest sub tier: $(latest.sub.tier)→Latest sub tier: 1The most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.sub.months)

The most recent subscriber's cumulative months.

Example
$(latest.sub.months)→7
In a response
Latest sub months: $(latest.sub.months)→Latest sub months: 7The most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.sub.gifter)

Who gifted the most recent gift sub.

Example
$(latest.sub.gifter)→blakkrazor69
In a response
Latest gifter: $(latest.sub.gifter)→Latest gifter: blakkrazor69The most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.sub.giftcount)

How many subs the most recent gifter gave at once.

Example
$(latest.sub.giftcount)→5
In a response
Latest gift count: $(latest.sub.giftcount)→Latest gift count: 5The most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.cheerer)

The most recent cheerer.

Example
$(latest.cheerer)→blakkrazor69
In a response
Latest cheerer: $(latest.cheerer)→Latest cheerer: blakkrazor69The most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.cheer.bits)

How many bits the most recent cheer was.

Example
$(latest.cheer.bits)→5000
In a response
Latest cheer bits: $(latest.cheer.bits)→Latest cheer bits: 5000The most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.cheer.message)

The message sent with the most recent cheer.

Example
$(latest.cheer.message)→lets gooo
In a response
Latest cheer message: $(latest.cheer.message)→Latest cheer message: lets goooThe most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.raider)

The most recent raider.

Example
$(latest.raider)→sheikhyabootie
In a response
Latest raider: $(latest.raider)→Latest raider: sheikhyabootieThe most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.raid.viewers)

How many viewers the most recent raid brought.

Example
$(latest.raid.viewers)→412
In a response
Latest raid size: $(latest.raid.viewers)→Latest raid size: 412The most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.tipper)

The most recent tipper.

Example
$(latest.tipper)→Mmiwo
In a response
Latest tipper: $(latest.tipper)→Latest tipper: MmiwoThe most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.tip.amount)

The most recent tip amount.

Example
$(latest.tip.amount)→8.00
In a response
Latest tip amount: $(latest.tip.amount)→Latest tip amount: 8.00The most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.tip.message)

The message sent with the most recent tip.

Example
$(latest.tip.message)→keep it up
In a response
Latest tip message: $(latest.tip.message)→Latest tip message: keep it upThe most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.redemption)

Who made the most recent channel point redemption.

Example
$(latest.redemption)→ninja
In a response
Latest redeemer: $(latest.redemption)→Latest redeemer: ninjaThe most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.redemption.reward)

The reward of the most recent redemption.

Example
$(latest.redemption.reward)→Hydrate
In a response
Latest reward: $(latest.redemption.reward)→Latest reward: HydrateThe most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(latest.redemption.cost)

The point cost of the most recent redemption.

Example
$(latest.redemption.cost)→500
In a response
Latest reward cost: $(latest.redemption.cost)→Latest reward cost: 500The most recent one, kept up to date live.

Totals for this stream live under session.*, for example $(session.followers).

$(session.topcheerer)

Who has cheered the most bits this stream.

Example
$(session.topcheerer)→blakkrazor69
In a response
Top cheerer (stream): $(session.topcheerer)→Top cheerer (stream): blakkrazor69Since the stream went live; resets next stream.

The most recent one, rather than the biggest, is under latest.*.

$(session.topcheer)

The biggest single cheer this stream, in bits.

Example
$(session.topcheer)→5000
In a response
Top cheer (stream): $(session.topcheer)→Top cheer (stream): 5000Since the stream went live; resets next stream.

The most recent one, rather than the biggest, is under latest.*.

$(session.toptipper)

Who has tipped the most this stream.

Example
$(session.toptipper)→Mmiwo
In a response
Top tipper (stream): $(session.toptipper)→Top tipper (stream): MmiwoSince the stream went live; resets next stream.

The most recent one, rather than the biggest, is under latest.*.

$(session.toptip)

The biggest single tip this stream.

Example
$(session.toptip)→8.00
In a response
Top tip (stream): $(session.toptip)→Top tip (stream): 8.00Since the stream went live; resets next stream.

The most recent one, rather than the biggest, is under latest.*.

$(session.topchatter)

Who has sent the most chat messages this stream, bots excluded.

Example
$(session.topchatter)→Doxmia
In a response
Top chatter (stream): $(session.topchatter)→Top chatter (stream): DoxmiaSince the stream went live; resets next stream.

These need chat analytics turned on for your channel and a stream that is live; they render empty otherwise.

$(session.topchatter.count)

How many messages the most active chatter has sent this stream.

Example
$(session.topchatter.count)→57
In a response
Top chatter messages: $(session.topchatter.count)→Top chatter messages: 57Since the stream went live; resets next stream.

These need chat analytics turned on for your channel and a stream that is live; they render empty otherwise.

Looking forJust the top chatter's messages. The whole channel is $(session.messages).

$(session.messages)

How many chat messages have been sent this stream, bots excluded.

Example
$(session.messages)→412
In a response
Chat messages (stream): $(session.messages)→Chat messages (stream): 412Since the stream went live; resets next stream.

These need chat analytics turned on for your channel and a stream that is live; they render empty otherwise.

Looking forEvery message this stream. One person's count is $(session.topchatter.count).

$(session.followers)

New follows this stream.

Example
$(session.followers)→12
In a response
Follows this stream: $(session.followers)→Follows this stream: 12The stream total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(session.subs)

New and renewed subs this stream.

Example
$(session.subs)→4
In a response
Subs this stream: $(session.subs)→Subs this stream: 4The stream total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(session.giftsubs)

Gifted subs this stream.

Example
$(session.giftsubs)→5
In a response
Gift subs this stream: $(session.giftsubs)→Gift subs this stream: 5The stream total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(session.bits)

Bits cheered this stream.

Example
$(session.bits)→5000
In a response
Bits this stream: $(session.bits)→Bits this stream: 5000The stream total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(session.tips)

Tips received, as an amount this stream.

Example
$(session.tips)→42.50
In a response
Tips this stream: $(session.tips)→Tips this stream: 42.50The stream total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(session.tipcount)

How many tips came in this stream.

Example
$(session.tipcount)→3
In a response
Tip count this stream: $(session.tipcount)→Tip count this stream: 3The stream total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(session.raidviewers)

Viewers brought by raids this stream.

Example
$(session.raidviewers)→412
In a response
Raid viewers this stream: $(session.raidviewers)→Raid viewers this stream: 412The stream total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(session.redemptions)

Channel point redemptions this stream.

Example
$(session.redemptions)→27
In a response
Redemptions this stream: $(session.redemptions)→Redemptions this stream: 27The stream total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(today.followers)

New follows today.

Example
$(today.followers)→12
In a response
Follows today: $(today.followers)→Follows today: 12The today total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(today.subs)

New and renewed subs today.

Example
$(today.subs)→4
In a response
Subs today: $(today.subs)→Subs today: 4The today total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(today.giftsubs)

Gifted subs today.

Example
$(today.giftsubs)→5
In a response
Gift subs today: $(today.giftsubs)→Gift subs today: 5The today total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(today.bits)

Bits cheered today.

Example
$(today.bits)→5000
In a response
Bits today: $(today.bits)→Bits today: 5000The today total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(today.tips)

Tips received, as an amount today.

Example
$(today.tips)→42.50
In a response
Tips today: $(today.tips)→Tips today: 42.50The today total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(today.tipcount)

How many tips came in today.

Example
$(today.tipcount)→3
In a response
Tip count today: $(today.tipcount)→Tip count today: 3The today total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(today.raidviewers)

Viewers brought by raids today.

Example
$(today.raidviewers)→412
In a response
Raid viewers today: $(today.raidviewers)→Raid viewers today: 412The today total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(today.redemptions)

Channel point redemptions today.

Example
$(today.redemptions)→27
In a response
Redemptions today: $(today.redemptions)→Redemptions today: 27The today total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(week.followers)

New follows this week.

Example
$(week.followers)→12
In a response
Follows this week: $(week.followers)→Follows this week: 12The week total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(week.subs)

New and renewed subs this week.

Example
$(week.subs)→4
In a response
Subs this week: $(week.subs)→Subs this week: 4The week total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(week.giftsubs)

Gifted subs this week.

Example
$(week.giftsubs)→5
In a response
Gift subs this week: $(week.giftsubs)→Gift subs this week: 5The week total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(week.bits)

Bits cheered this week.

Example
$(week.bits)→5000
In a response
Bits this week: $(week.bits)→Bits this week: 5000The week total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(week.tips)

Tips received, as an amount this week.

Example
$(week.tips)→42.50
In a response
Tips this week: $(week.tips)→Tips this week: 42.50The week total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(week.tipcount)

How many tips came in this week.

Example
$(week.tipcount)→3
In a response
Tip count this week: $(week.tipcount)→Tip count this week: 3The week total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(week.raidviewers)

Viewers brought by raids this week.

Example
$(week.raidviewers)→412
In a response
Raid viewers this week: $(week.raidviewers)→Raid viewers this week: 412The week total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(week.redemptions)

Channel point redemptions this week.

Example
$(week.redemptions)→27
In a response
Redemptions this week: $(week.redemptions)→Redemptions this week: 27The week total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(month.followers)

New follows this month.

Example
$(month.followers)→12
In a response
Follows this month: $(month.followers)→Follows this month: 12The month total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(month.subs)

New and renewed subs this month.

Example
$(month.subs)→4
In a response
Subs this month: $(month.subs)→Subs this month: 4The month total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(month.giftsubs)

Gifted subs this month.

Example
$(month.giftsubs)→5
In a response
Gift subs this month: $(month.giftsubs)→Gift subs this month: 5The month total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(month.bits)

Bits cheered this month.

Example
$(month.bits)→5000
In a response
Bits this month: $(month.bits)→Bits this month: 5000The month total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(month.tips)

Tips received, as an amount this month.

Example
$(month.tips)→42.50
In a response
Tips this month: $(month.tips)→Tips this month: 42.50The month total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(month.tipcount)

How many tips came in this month.

Example
$(month.tipcount)→3
In a response
Tip count this month: $(month.tipcount)→Tip count this month: 3The month total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(month.raidviewers)

Viewers brought by raids this month.

Example
$(month.raidviewers)→412
In a response
Raid viewers this month: $(month.raidviewers)→Raid viewers this month: 412The month total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(month.redemptions)

Channel point redemptions this month.

Example
$(month.redemptions)→27
In a response
Redemptions this month: $(month.redemptions)→Redemptions this month: 27The month total, updated live.

Today, this week and this month follow the time zone in Bot settings; the week runs Monday to Sunday.

$(total.followers)

New follows all time.

Example
$(total.followers)→12
In a response
Follows all time: $(total.followers)→Follows all time: 12The all time total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(total.subs)

New and renewed subs all time.

Example
$(total.subs)→4
In a response
Subs all time: $(total.subs)→Subs all time: 4The all time total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(total.giftsubs)

Gifted subs all time.

Example
$(total.giftsubs)→5
In a response
Gift subs all time: $(total.giftsubs)→Gift subs all time: 5The all time total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(total.bits)

Bits cheered all time.

Example
$(total.bits)→5000
In a response
Bits all time: $(total.bits)→Bits all time: 5000The all time total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(total.tips)

Tips received, as an amount all time.

Example
$(total.tips)→42.50
In a response
Tips all time: $(total.tips)→Tips all time: 42.50The all time total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(total.tipcount)

How many tips came in all time.

Example
$(total.tipcount)→3
In a response
Tip count all time: $(total.tipcount)→Tip count all time: 3The all time total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(total.raidviewers)

Viewers brought by raids all time.

Example
$(total.raidviewers)→412
In a response
Raid viewers all time: $(total.raidviewers)→Raid viewers all time: 412The all time total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

$(total.redemptions)

Channel point redemptions all time.

Example
$(total.redemptions)→27
In a response
Redemptions all time: $(total.redemptions)→Redemptions all time: 27The all time total, updated live.

The same count exists for the stream, today, this week, this month and all time: session, today, week, month and total.

Goals

$(goal.subscribers)

How many subscribers your subscribers goal has so far.

Example
$(goal.subscribers)→42
In a response
Subscribers goal: $(goal.subscribers) of $(goal.subscribers.target)→Subscribers goal: 42 of 500The everyday goal reply.
$(goal.subscribers Sub Drive) so far on Sub Drive→42 so far on Sub DriveName the widget when you have more than one goal for this.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one

Renders empty when you have no subscribers Goal widget on any overlay.

Looking forTotals for the whole channel are under total.*, and this stream's under session.*.

$(goal.subscribers.target)

The target you set on your subscribers goal.

Example
$(goal.subscribers.target)→500
In a response
Aiming for $(goal.subscribers.target) subscribers!→Aiming for 500 subscribers!The number the goal is set to.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.subscribers.remaining)

How many more subscribers the goal needs.

Example
$(goal.subscribers.remaining)→380
In a response
$(goal.subscribers.remaining) to go!→380 to go!Reads 0 once the goal is met.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.subscribers.pct)

How far along the subscribers goal is, as a percentage.

Example
$(goal.subscribers.pct)→24
In a response
We are $(goal.subscribers.pct)% of the way there→We are 24% of the way thereA whole number, with no percent sign, so add your own.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.followers)

How many followers your followers goal has so far.

Example
$(goal.followers)→120
In a response
Followers goal: $(goal.followers) of $(goal.followers.target)→Followers goal: 120 of 500The everyday goal reply.
$(goal.followers Sub Drive) so far on Sub Drive→120 so far on Sub DriveName the widget when you have more than one goal for this.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one

Renders empty when you have no followers Goal widget on any overlay.

Looking forTotals for the whole channel are under total.*, and this stream's under session.*.

$(goal.followers.target)

The target you set on your followers goal.

Example
$(goal.followers.target)→500
In a response
Aiming for $(goal.followers.target) followers!→Aiming for 500 followers!The number the goal is set to.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.followers.remaining)

How many more followers the goal needs.

Example
$(goal.followers.remaining)→380
In a response
$(goal.followers.remaining) to go!→380 to go!Reads 0 once the goal is met.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.followers.pct)

How far along the followers goal is, as a percentage.

Example
$(goal.followers.pct)→24
In a response
We are $(goal.followers.pct)% of the way there→We are 24% of the way thereA whole number, with no percent sign, so add your own.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.bits)

How many bits your bits goal has so far.

Example
$(goal.bits)→5000
In a response
Bits goal: $(goal.bits) of $(goal.bits.target)→Bits goal: 5000 of 500The everyday goal reply.
$(goal.bits Sub Drive) so far on Sub Drive→5000 so far on Sub DriveName the widget when you have more than one goal for this.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one

Renders empty when you have no bits Goal widget on any overlay.

Looking forTotals for the whole channel are under total.*, and this stream's under session.*.

$(goal.bits.target)

The target you set on your bits goal.

Example
$(goal.bits.target)→500
In a response
Aiming for $(goal.bits.target) bits!→Aiming for 500 bits!The number the goal is set to.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.bits.remaining)

How many more bits the goal needs.

Example
$(goal.bits.remaining)→380
In a response
$(goal.bits.remaining) to go!→380 to go!Reads 0 once the goal is met.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.bits.pct)

How far along the bits goal is, as a percentage.

Example
$(goal.bits.pct)→24
In a response
We are $(goal.bits.pct)% of the way there→We are 24% of the way thereA whole number, with no percent sign, so add your own.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.tips)

How many tips your tips goal has so far.

Example
$(goal.tips)→42.50
In a response
Tips goal: $(goal.tips) of $(goal.tips.target)→Tips goal: 42.50 of 500The everyday goal reply.
$(goal.tips Sub Drive) so far on Sub Drive→42.50 so far on Sub DriveName the widget when you have more than one goal for this.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one

Renders empty when you have no tips Goal widget on any overlay.

Looking forTotals for the whole channel are under total.*, and this stream's under session.*.

$(goal.tips.target)

The target you set on your tips goal.

Example
$(goal.tips.target)→500
In a response
Aiming for $(goal.tips.target) tips!→Aiming for 500 tips!The number the goal is set to.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.tips.remaining)

How many more tips the goal needs.

Example
$(goal.tips.remaining)→380
In a response
$(goal.tips.remaining) to go!→380 to go!Reads 0 once the goal is met.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.tips.pct)

How far along the tips goal is, as a percentage.

Example
$(goal.tips.pct)→24
In a response
We are $(goal.tips.pct)% of the way there→We are 24% of the way thereA whole number, with no percent sign, so add your own.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.raids)

How many raids your raids goal has so far.

Example
$(goal.raids)→3
In a response
Raids goal: $(goal.raids) of $(goal.raids.target)→Raids goal: 3 of 500The everyday goal reply.
$(goal.raids Sub Drive) so far on Sub Drive→3 so far on Sub DriveName the widget when you have more than one goal for this.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one

Renders empty when you have no raids Goal widget on any overlay.

Looking forTotals for the whole channel are under total.*, and this stream's under session.*.

$(goal.raids.target)

The target you set on your raids goal.

Example
$(goal.raids.target)→500
In a response
Aiming for $(goal.raids.target) raids!→Aiming for 500 raids!The number the goal is set to.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.raids.remaining)

How many more raids the goal needs.

Example
$(goal.raids.remaining)→380
In a response
$(goal.raids.remaining) to go!→380 to go!Reads 0 once the goal is met.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.raids.pct)

How far along the raids goal is, as a percentage.

Example
$(goal.raids.pct)→24
In a response
We are $(goal.raids.pct)% of the way there→We are 24% of the way thereA whole number, with no percent sign, so add your own.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.redemptions)

How many redemptions your redemptions goal has so far.

Example
$(goal.redemptions)→27
In a response
Redemptions goal: $(goal.redemptions) of $(goal.redemptions.target)→Redemptions goal: 27 of 500The everyday goal reply.
$(goal.redemptions Sub Drive) so far on Sub Drive→27 so far on Sub DriveName the widget when you have more than one goal for this.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one

Renders empty when you have no redemptions Goal widget on any overlay.

Looking forTotals for the whole channel are under total.*, and this stream's under session.*.

$(goal.redemptions.target)

The target you set on your redemptions goal.

Example
$(goal.redemptions.target)→500
In a response
Aiming for $(goal.redemptions.target) redemptions!→Aiming for 500 redemptions!The number the goal is set to.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.redemptions.remaining)

How many more redemptions the goal needs.

Example
$(goal.redemptions.remaining)→380
In a response
$(goal.redemptions.remaining) to go!→380 to go!Reads 0 once the goal is met.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.redemptions.pct)

How far along the redemptions goal is, as a percentage.

Example
$(goal.redemptions.pct)→24
In a response
We are $(goal.redemptions.pct)% of the way there→We are 24% of the way thereA whole number, with no percent sign, so add your own.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.pluspoints)

How many Plus Points your Plus Points goal has so far.

Example
$(goal.pluspoints)→812
In a response
Plus Points goal: $(goal.pluspoints) of $(goal.pluspoints.target)→Plus Points goal: 812 of 500The everyday goal reply.
$(goal.pluspoints Sub Drive) so far on Sub Drive→812 so far on Sub DriveName the widget when you have more than one goal for this.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one

Renders empty when you have no Plus Points Goal widget on any overlay.

Looking forTotals for the whole channel are under total.*, and this stream's under session.*.

$(goal.pluspoints.target)

The target you set on your Plus Points goal.

Example
$(goal.pluspoints.target)→500
In a response
Aiming for $(goal.pluspoints.target) Plus Points!→Aiming for 500 Plus Points!The number the goal is set to.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.pluspoints.remaining)

How many more Plus Points the goal needs.

Example
$(goal.pluspoints.remaining)→380
In a response
$(goal.pluspoints.remaining) to go!→380 to go!Reads 0 once the goal is met.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one
$(goal.pluspoints.pct)

How far along the Plus Points goal is, as a percentage.

Example
$(goal.pluspoints.pct)→24
In a response
We are $(goal.pluspoints.pct)% of the way there→We are 24% of the way thereA whole number, with no percent sign, so add your own.
Takes
Sub Drivethat Goal widget, by its name
leave it out when you only have one

Subathon & timers

$(subathon.remaining)

How much time is left on your subathon clock.

Example
$(subathon.remaining)→1h 15m
In a response
Subathon: $(subathon.remaining) left!→Subathon: 1h 15m left!The everyday subathon reply.
$(if $(subathon.paused) == yes)Clock is paused$(else)$(subathon.remaining) to go$(endif)→1h 15m to goThe clock stops while you are offline, so say so.
Takes
Subathonthat Subathon widget, by its name
leave it out when you only have one

Renders empty when you have no Subathon widget on any overlay.

Looking forA plain countdown to a date is $(countdown Dec 25 2026 6pm). A Countdown widget is $(countdown.remaining).

$(subathon.remaining.seconds)

How many seconds are left on the subathon clock, as a plain number.

Example
$(subathon.remaining.seconds)→4530
In a response
$(if $(subathon.remaining.seconds) < 600)Under ten minutes!$(endif)→Under ten minutes!A number you can compare in a condition.
Takes
Subathonthat Subathon widget, by its name
leave it out when you only have one
$(subathon.added)

All the time added to the subathon clock so far.

Example
$(subathon.added)→30m
In a response
You have added $(subathon.added) so far!→You have added 30m so far!Counts every contribution since the last reset.
Takes
Subathonthat Subathon widget, by its name
leave it out when you only have one
$(subathon.paused)

Reads yes while the subathon clock is paused and no while it is running.

Example
$(subathon.paused)→no
In a response
$(if $(subathon.paused) == yes)Paused while I am away$(else)Running!$(endif)→Running!The clock pauses when you go offline.
Takes
Subathonthat Subathon widget, by its name
leave it out when you only have one
$(subathon.last.user)

Who last added time to the subathon.

Example
$(subathon.last.user)→ninja
In a response
Thanks $(subathon.last.user) for the extra time!→Thanks ninja for the extra time!Empty until someone adds time this subathon.
Takes
Subathonthat Subathon widget, by its name
leave it out when you only have one
$(countdown.remaining)

How much time is left on a Countdown widget.

Example
$(countdown.remaining)→5m
In a response
Back in $(countdown.remaining)!→Back in 5m!Reads the timer that is on your overlay.
Takes
Break Timerthat Countdown widget, by its name
leave it out when you only have one

Renders empty when you have no Countdown widget, or when the timer has not been started yet.

Looking forCounting down to a date you type is $(countdown Dec 25 2026 6pm). The subathon clock is $(subathon.remaining).

$(countdown.remaining.seconds)

How many seconds are left on a Countdown widget, as a plain number.

Example
$(countdown.remaining.seconds)→305
In a response
$(if $(countdown.remaining.seconds) < 60)Nearly back!$(endif)→Nearly back!A number you can compare in a condition.
Takes
Break Timerthat Countdown widget, by its name
leave it out when you only have one
$(countdown.finished)

Reads yes once a Countdown widget has reached zero.

Example
$(countdown.finished)→no
In a response
$(if $(countdown.finished) == yes)Break over!$(else)$(countdown.remaining) left$(endif)→5m leftSwitch the reply when the timer runs out.
Takes
Break Timerthat Countdown widget, by its name
leave it out when you only have one

Merch

$(merch.sales)

How many merch orders have come in this stream.

Example
$(merch.sales)→12
In a response
$(merch.sales) orders so far this stream!→12 orders so far this stream!Resets when the stream ends.

Needs a Fourthwall shop connected under Integrations; renders empty otherwise.

Looking forAll-time orders are $(merch.total.sales).

$(merch.revenue)

How much merch has sold for this stream.

Example
$(merch.revenue)→349.50
In a response
$(merch.revenue) in merch this stream, thank you!→349.50 in merch this stream, thank you!A plain amount with no currency symbol, so add your own.

Looking forAll-time revenue is $(merch.total.revenue).

$(merch.latest)

The most recent product someone bought.

Example
$(merch.latest)→Logo Hoodie
In a response
Someone just grabbed the $(merch.latest)!→Someone just grabbed the Logo Hoodie!The first item on the most recent order.
$(merch.total.sales)

How many merch orders you have had all time.

Example
$(merch.total.sales)→47
In a response
$(merch.total.sales) orders and counting!→47 orders and counting!Never resets.

Looking forOrders this stream are $(merch.sales).

$(merch.total.revenue)

How much merch has sold for all time.

Example
$(merch.total.revenue)→1230.75
In a response
Merch has raised $(merch.total.revenue) so far!→Merch has raised 1230.75 so far!A plain amount with no currency symbol, so add your own.

Looking forRevenue this stream is $(merch.revenue).

Module tokens need their module on

Tokens like $(quote), $(count.deaths), $(queue.next), $(media.current) and $(watchtime) only return a value when the matching module is enabled. The League tokens need the Riot integration turned on for the platform.

Clip tokens

$(clip.url) and $(clip.editurl) are not in the table above because they only resolve right after a clip is created, either in the !clip response or a Create a clip flow action. $(clip.url) is the public link to the clip; $(clip.editurl) opens Twitch's clip editor on it.

Related

  • Conditionals
  • Commands
  • Recipes
  • Getting started
Previous Commands Next Conditionals
On this page
Ask the docs
Have a question?
Thinking it through...
Answer
Get an answer instantly; our model is trained on every feature of our streaming suite.
ESC
Get started
More than overlaysOverlayThing is an all-in-one toolkit for your Twitch channel: a visual overlay … Get started From zero to liveThe fastest path to a working overlay on your stream. Sign in, build something, … Get started Add to your streamOne overlay, one URL, one browser source. OverlayThing works with any streaming … Get started
Overlays
OverlaysYour overlays live on the Overlays page, a gallery of every canvas you have buil… Overlays The editorWhere overlays are built. A canvas in the middle, your layer stack on the left, … Overlays Overlay URLsEach overlay has its own private URL. Add it to your streaming software once and… Overlays Alert queueWhen events pile up (a gifted-sub train, a hype raid), you usually want alerts t… Overlays Share, export & importMove overlays and individual widgets between your own overlays, back them up as … Overlays
Widgets
Widgets overviewWidgets are the building blocks of an overlay. Some fire on an event and leave (… Widgets AlertsThe moment something happens, an alert fires on screen with motion, sound and yo… Widgets VariationsOne event, different reactions. Variations let a single alert play a bigger vers… Widgets Hype TrainWhen a Hype Train rolls on your channel, OverlayThing can fire an on-screen aler… Widgets Text to speechHave alerts read messages aloud: a tip note, a resub message, a redemption. Text… Widgets GoalsA progress bar with a target. It fills itself as events come in, and you can cel… Widgets Countdown & subathonTwo timer widgets. A countdown runs down to a time or for a set duration. A suba… Widgets Chat boxPut your Twitch chat on stream, great for handheld, IRL or face-cam layouts wher… Widgets Data labelsSmall live readouts that keep your channel numbers on screen: latest follower, l… Widgets CounterPut a live number on your overlay: deaths, wins, fails, anything you keep a runn… Widgets Text, image & videoThe plain building blocks. Use them for backgrounds, frames, logos, panels and l… Widgets
Chatbot
The chatbotA Twitch chat bot built into OverlayThing: custom commands, timers, counters, qu… Chatbot Getting startedTurn the bot on, make it a moderator, and pick your command prefix. Three small … Chatbot CommandsCommands are the heart of the bot. A viewer types a trigger, the bot replies wit… Chatbot VariablesVariables are $( … ) tokens you drop into a command response. They fill in with … Chatbot ConditionalsConditionals let one command react differently to different viewers and situatio… Chatbot RecipesCopy-ready command responses for the trickier variables: shoutouts, weather, dic… Chatbot API commandsPower-user territory. Wire a command to an external API and pull a live value in… Chatbot IntegrationsBuilt-in connections to outside services that add ready-made variables. Today th… Chatbot Command API & Copy-URLFire bot commands and module actions from outside chat: a Stream Deck button, a … Chatbot Chat moderationWhen the bot is a moderator it can keep chat clean automatically: tunable spam f… Chatbot Bot accountChoose which Twitch account the bot posts as: the shared OverlayThing bot, your … Chatbot Bot settingsThe channel-wide behavior of the bot: your prefix, how it replies, how cooldowns… Chatbot
Chatbot modules
ModulesThe bot is built from modules you switch on one at a time. Turn on only what you… Chatbot modules TimersPost recurring messages on a schedule: rules, your socials, a sponsor plug. Time… Chatbot modules CountersTrack a number from chat: deaths, wins, fails, anything you want to tally live.… Chatbot modules QuotesA searchable quote book your chat builds with you, one memorable line at a time.… Chatbot modules Chat alertsPost a chat message when someone follows, subscribes, resubs, gifts, cheers or r… Chatbot modules WelcomeGreet people automatically: first-time chatters, returning regulars, and incomin… Chatbot modules Ad BreaksHave the bot speak up around your ad breaks: a heads-up before they hit, a line … Chatbot modules GiveawaysRun a giveaway and draw a winner from chat, by keyword entry or passive presence… Chatbot modules QueueLet viewers line up to play with you. They join, you pull people up in order.… Chatbot modules Song requestsViewers request YouTube songs by name or link and the bot builds a play queue, w… Chatbot modules LoyaltyTrack how long your viewers watch, so you can spot and reward your most loyal re… Chatbot modules
Flows
FlowsFlows let you wire your channel together with no code. Pick something that happe… Flows Build a flowYou build a flow on a canvas: add nodes, connect them in the order they should r… Flows TriggersA trigger is the event that starts a flow. Every flow has at least one. Most tri… Flows ConditionsConditions are the rules in a flow. They decide whether the run keeps going and … Flows ActionsActions are the things a flow does. Most of what the rest of the platform can do… Flows Using dataThe best flows feel personal because they use the real details of the event. Dro… Flows ExamplesFour flows from simple to advanced, drawn as the real graphs you build on the ca… Flows
Channel Rewards
Channel RewardsCreate channel-point rewards through OverlayThing and your flows can do things T… Channel Rewards
Remote Control
Remote ControlDrive your local OBS Studio or Meld Studio straight from OverlayThing. Switch sc… Remote Control Connect OBS StudioAdd the Remote Control URL as a dock or browser source, enable the OBS WebSocket… Remote Control Connect Meld StudioAdd the blank Remote Control source to every Meld scene. There is no password to… Remote Control Bindings & triggersA binding is one or more actions plus the trigger that fires them. Build them on… Remote Control Security & accessThe Remote Control URL is a key to your streaming software, and your OBS passwor… Remote Control
OBS Dock
OBS DockChat, activity, media requests and stream controls in a panel docked inside OBS.… OBS Dock Layouts & displayBuild the dock out of panes, save arrangements as layouts, and open a second doc… OBS Dock Chat & Needs YouRead and send chat as yourself, moderate from the message row, and clear AutoMod… OBS Dock Activity & mediaEvery channel event in one filterable feed, and full control of the media queue … OBS Dock Stream info & controlsEdit your title, category and tags without leaving OBS, and run markers, clips, … OBS Dock
Companion
CompanionA native desktop app for macOS and Windows that pairs with your OverlayThing acc… Companion Install & pairDownload the Companion for your operating system, open it, and approve one short… Companion Feed, chat & channelThe Companion mirrors the parts of your dashboard you touch mid-stream, on your … Companion ScriptingWrite small scripts that react to your stream and do things only a local app can… Companion The scripting APIThe complete ot surface: every event you can listen to, every action you can tak… Companion Permissions & securityScripts run in a sandbox and start with zero powers. You grant each capability p… Companion
Monetize
Your tip pageA branded donation page viewers can reach from a single link in your panels or c… Monetize Tip settingsEverything behind your tip page: the payment connections, your branding, the amo… Monetize Merch with FourthwallConnect your Fourthwall shop and merch sales fire alerts on stream, the same way… Monetize
Build your own
Describe & BuildDescribe the widget you want in plain language and OverlayThing builds a styled,… Build your own Custom widgetsFor when you want to break the mold. Write your own HTML, CSS and JavaScript, re… Build your own Widget SDKThe API your custom widgets use to receive live events and persist state. It is … Build your own
Your data
DashboardYour home base. The numbers that matter at a glance, a chart to spot trends, and… Your data Stream dataThe numbers behind your overlay. Labels, goals and leaderboards all read from he… Your data Chat logA searchable archive of your chat, events and moderation actions. Look up what a… Your data ModerationEvery chat message, tip note and alert message runs through a moderation pipelin… Your data
Account
Settings & connectionsYour account, your connected services, and the controls that protect your access… Account Export your dataYour data is yours. From Settings, under Data and privacy, you can take it with … Account Import from StreamElementsAlready set up elsewhere? Bring your overlays, alert settings, goals and history… Account
Reference
Label tokensTokens are {placeholders} you drop into alert text, label templates and goal lab… Reference Keyboard shortcutsThe editor is built for the keyboard. These are the ones worth learning.… Reference FAQShort answers to the questions we hear most. For step-by-step fixes when somethi… Reference TroubleshootingQuick fixes for the things that trip people up most.… Reference
↑↓ navigate ⏎ open esc close