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.
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.
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).
!followage → your own follow age
!followage @cohh → @cohh's follow ageOther 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.
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.
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.
we've got $(month.daysleft) days to get $(pluspoints.next) more!$(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.
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.
$(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.
$(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.
$(user)ninjaHi $(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.
$(user.id)44322889$(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).
$(chatter)ninjaThanks 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).
$(chatter.id)44322889Your 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.
$(user.followers)1,530$(user) has $(user.followers) followers on their own channelninja 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.
$(user.status)live playing Fortnite$(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.
$(user.title)ranked grind to Champion$(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).
$(user.viewers)212$(user) has $(user.viewers) viewers right nowninja 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.
$(user.url)https://twitch.tv/ninjaGo 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.
$(user.tags)English, FPS$(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.
$(user.game)Fortnite$(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.
$(touser)cohhcarnage$(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).
$(followage.days)412You'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.
$(followage.months)13$(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.
$(accountage.days)2190Your Twitch account is $(accountage.days) days oldYour 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.
$(user.avatar)https://static-cdn.jtvnw.net/jtv_user_pictures/ninja-profile_image-300x300.png$(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).
$(touser.avatar)https://static-cdn.jtvnw.net/jtv_user_pictures/cohhcarnage-profile_image-300x300.png$(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.
$(touser.accountage)11 years, 4 months$(touser)'s account is $(touser.accountage) oldcohhcarnage'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.
$(touser.followage)1 year, 2 months$(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.
$(random.chatter)pokimane$(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).
$(userlevel)moderator$(user), you are a $(userlevel) hereninja, 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).
$(touser.id)26610234$(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.
$(touser.followers)1,850,000Go 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.
$(touser.status)live playing Path of Exile 2$(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.
$(touser.title)Chill Tuesday | PoE2$(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).
$(touser.viewers)4,120$(touser) has $(touser.viewers) viewers right nowcohhcarnage 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.
$(touser.url)https://twitch.tv/cohhcarnageGo 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.
$(touser.tags)English, RPG$(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.
$(channel)doxmiaWelcome 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).
$(streamer)doxmiaThanks 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.
$(game)Just ChattingWe are playing $(game) todayWe 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.
$(title)building the overlay platformToday: $(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.
$(viewers)342$(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.
$(uptime)2h 14m$(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.
$(chatters)312$(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).
$(uptime.minutes)134Live for $(uptime.minutes) minutes so farLive 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.
$(followers)12,480We are at $(followers) followers, thank you all!We are at 12,480 followers, thank you all!Your total follower count.$(followers) followers! Goal: 15,00012,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.
$(pluspoints)39Plus 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.
$(pluspoints.level)1We 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.
$(pluspoints.next)47$(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.
$(pluspoints.threshold)100$(pluspoints)/$(pluspoints.threshold) Plus Points53/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.
$(status)live playing Just Chatting$(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.
$(tags)English, Software & Game DevCurrent 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.
$(channel.url)https://twitch.tv/doxmiaShare 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.
$(channel.id)99288217Channel ID: $(channel.id)Channel ID: 99288217The number behind your channel name.Most replies want $(channel).
$(livesince)The date your current stream went live.
$(livesince)Jun 9, 2026Live 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.
$(touser.game)Path of Exile 2$(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.
$(query)best loadout?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.
$(message)!loadout best loadout?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.
$(match.1)12Wow, $(match.1) deaths already?Wow, 12 deaths already?A regex keyword like ^(\d+) deaths captures the number into $(match.1)..1the first capture group.0the whole matchOnly regex keywords fill this; $(match.0) is the whole match.
$(querystring)Everything typed after the command, URL-encoded (for use inside API URLs).
$(querystring)best%20loadout%3FSearch 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.
$(1|stranger)bestRolling 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.|strangerfallback when the word is missing..this word and every word after itEverything 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.
$(time 24h Europe/London)21:42It is $(time) for meIt is 9:42 PM for meChannel timezone, 12-hour clock.London: $(time 24h Europe/London)London: 21:42Another zone, 24-hour clock.24h24-hour clockEurope/Londonanother timezone24h America/TorontobothToday'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.
$(countdown Dec 25 2026 6pm)3 days, 4 hoursBlizzCon 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.2027-12-11 18:00year first, optional timeDec 11 2027 6pmmonth name, either order12/11/2027 America/Torontoslash date, zone at the end overrides yoursCounting 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).
$(countup 2024-06-05)2 years, 3 monthsThis 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.2024-06-05year firstJun 5 2024month nameTime until a date is $(countdown).
Looking forTime until a date: $(countdown).
$(date)Today's date in your configured format and timezone.
$(date)Jun 9, 2026Today 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).
$(month)SeptemberSub goal for $(month): 50 new subsSub 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.
$(month.short)Sep$(month.short) $(month.day) and we are still hereSep 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.
$(month.number)9$(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.
$(month.day)8Day $(month.day) of $(month), let us goDay 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.
$(month.daysin)30$(month) has $(month.daysin) days and we are streaming most of themSeptember 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.
$(month.daysleft)22$(month.daysleft) days left in $(month) to hit the sub goal22 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 todayThat 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).
$(year)2026Stream 200 of $(year), thanks for being hereStream 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.
$(year.day)251Day $(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.
$(year.daysin)365$(year) has $(year.daysin) days in it2026 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.
$(year.daysleft)114$(year.daysleft) days left in $(year), plenty of time114 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 todayThat 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.
$(year.week)37Week $(year.week) of $(year), same time same placeWeek 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.
$(year.weeksleft)16$(year.weeksleft) more weeks of streams this year16 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.
$(random 1-6)4$(user) rolls a $(random 1-6)ninja rolls a 4A range, low to high.$(touser) is $(random 1-100)% coolcohhcarnage 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.1-6a dice roll1001 to 1001-100a percent rollRandom 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.
$(pick heads;tails)tailsMagic 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.yes;no;maybeoptions separated by semicolonsheads;tailsa coin flipNumbers 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.
$(math $(count.deaths) * 2)24Deaths 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.$(count.deaths) * 2a counter times two15000 - $(followers)distance to a goalround($(uptime.minutes) / 60)hours, roundedFor 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.
$(command !so $(touser))Go follow CohhCarnage at twitch.tv/cohhcarnage$(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.!so $(touser)run !so for the mentioned user!deathspaste another command's replyThe 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.
$(api){"temp":21,"humidity":72}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.
$(api.main.temp)21It 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..main.tempa nested field.results.0.titlefirst item of a listThe whole reply as text: $(api).
$(url.commands)A public link to your channel’s command list.
$(url.commands)https://overlaything.com/c/doxmiaAll 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.
$(urlfetch https://wttr.in/London?format=3)London: ⛅ +14°CWeather: $(urlfetch https://wttr.in/$(querystring)?format=3)Weather: Tokyo: 🌧 +12°C"!weather Tokyo" puts Tokyo in the address, encoded.https://wttr.in/$(querystring)?format=3weather for whatever the viewer typedA 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.
$(upper $(user))NINJA$(upper $(user)) IS HERE!NINJA IS HERE!Shouting a name.HYPE: $(upper $(query))HYPE: lets goUppercase whatever the viewer typed.$(user)the viewer name$(query)whatever was typedThe opposite is $(lower …).
$(lower)The text in lower case. Other tokens can appear inside it.
$(lower $(touser))cohhcarnagetwitch.tv/$(lower $(touser))twitch.tv/cohhcarnageLowercase for a hand-built link.$(touser)the mentioned nameThe opposite is $(upper …). A ready-made link is $(touser.url).
$(len)How many characters the text has. Other tokens can appear inside it.
$(len $(query))13That message was $(len $(query)) characters longThat 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.$(query)whatever was typedNumber 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.
$(followage @cohhcarnage)2 years, 3 monthsThanks 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.@cohhcarnagesomeone else, by mention$(touser)whoever was typed after the commandWant 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.
$(watchtime @cohhcarnage)38h 12m$(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 timecohhcarnage has 12h 40m of watch timeSomeone else's, by the name typed after the command.@cohhcarnagesomeone else, by mention$(touser)whoever was typed after the commandPlain 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.
$(watchtime.minutes)2292Watch time: $(watchtime.minutes) minutesWatch 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.
$(watchtime.hours)38$(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.
$(accountage @cohhcarnage)11 years$(user), your Twitch account is $(accountage) oldninja, your Twitch account is 6 years oldThe viewer's own account age.$(touser)'s account: $(accountage $(touser))cohhcarnage's account: 11 yearsSomeone else's.@cohhcarnagesomeone else, by mention$(touser)whoever was typed after the commandThe 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.
$(accountdate)Mar 14, 2015$(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).
$(subscribers)486We have $(subscribers) subs, thank you!We have 486 subs, thank you!Your current subscriber count.$(subscribers) subs! Next goal: 500486 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.
$(subscriber)486Sub 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.
$(subcount)486Sub 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.
$(quote)dont feed the trolls"$(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.
$(quote.text)dont feed the trollsQuote: $(quote.text)Quote: dont feed the trollsSame as $(quote).Same as $(quote).
Looking forSame as $(quote).
$(quote.author)The author of the random quote.
$(quote.author)doxmia"$(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.
$(quote.id)42Quote #$(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).
$(count)128This command has been used $(count) timesThis 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.
$(count.deaths)7$(channel) has died $(count.deaths) times this streamdoxmia 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.deathsthe counter nameCounters 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.
$(queue.current)ninjaNow 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.
$(queue.next)shroudUp 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.
$(queue.count)5$(queue.count) people waiting to play5 people waiting to playA plain number.Where the viewer stands: $(queue.position).
$(queue.list)Up to the next 5 waiting viewers, comma-separated.
$(queue.list)shroud, pokimane, tfue, myth, sykkunoQueue: $(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.
$(queue.position)3$(user), you're number $(queue.position) in the queueninja, 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.
$(media.current)Darude - Sandstorm (requested by ninja)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.
$(media.current.title)Darude - SandstormSong: $(media.current.title)Song: Darude - SandstormTitle only.With the requester: $(media.current).
$(media.current.artist)The channel / artist of the now-playing song.
$(media.current.artist)DarudeBy $(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.
$(media.current.url)https://youtu.be/y6120QOlsfUListen: $(media.current.url)Listen: https://youtu.be/y6120QOlsfUA YouTube link.Title: $(media.current.title).
$(media.requester)Who requested the now-playing song.
$(media.requester)ninjaThanks $(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.
$(media.next)Never Gonna Give You UpComing 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.
$(media.queue)Never Gonna Give You Up, Megalovania, SandstormUp 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.
$(media.count)3$(media.count) songs in the queue3 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.
$(lol.rank Faker#KR1 kr)Challenger 1,487 LP (412W / 388L)$(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".Faker#KR1 krRiot ID, then the region$(query)let viewers type a Riot ID and regionRecent results: $(lol.recent …); top champions: $(lol.champs …).
$(lol.recent)A League player's last 5 ranked-solo results plus today's win/loss record.
$(lol.recent Faker#KR1 kr)WWLWW · today 3-1Last games: $(lol.recent Faker#KR1 kr)Last games: WWLWW · today 3-1Last five results plus today.Faker#KR1 krRiot ID, then the region$(query)let viewers type a Riot ID and regionCurrent rank: $(lol.rank …).
$(lol.champs)A League player's top 3 most-played ranked-solo champions with win rates.
$(lol.champs Faker#KR1 kr)Azir 62%, Ahri 58%, Orianna 55%Most played: $(lol.champs Faker#KR1 kr)Most played: Azir 62%, Ahri 58%, Orianna 55%Top three with win rates.Faker#KR1 krRiot ID, then the region$(query)let viewers type a Riot ID and regionCurrent rank: $(lol.rank …).
Conditionals
$(if)Show text only when a condition is true. Pair with $(endif).
$(if subscribed)thanks for subbing!$(endif)thanks for subbing!$(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.
$(if mod)hi boss$(else)hi$(endif)hi boss$(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.
$(if vip)VIP$(endif)VIP$(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.
$(if subscribed)thanks for the support!$(endif)thanks for the support!$(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).
$(if founder)OG sub!$(endif)OG sub!$(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.
$(if mod)mod tools ready$(endif)mod tools ready$(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.
$(if vip)VIP in the house$(endif)VIP in the house$(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.
$(if broadcaster)hey boss$(endif)hey boss$(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).
$(if bits >= 100)big cheer!$(endif)big cheer!$(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.
$(if is_cheer)thanks for the bits!$(endif)thanks for the bits!$(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.
$(if emote_count >= 3)so many emotes$(endif)so many emotes$(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.
$(if first_time)welcome!$(endif)welcome!$(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).
$(if returning)welcome back!$(endif)welcome back!$(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.
$(if streams_seen >= 10)regular!$(endif)regular!$(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).
$(if hour >= 22)late-night crew$(endif)late-night crew$(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).
$(if day == "fri")happy Friday!$(endif)happy Friday!$(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).
$(if tier >= 2)Tier 2+ perk unlocked$(endif)Tier 2+ perk unlocked$(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.
$(if follower)thanks for following!$(endif)thanks for following!$(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.
$(if followage_days >= 30)1+ month follower$(endif)1+ month follower$(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.
$(if followage_months >= 12)1-year follower!$(endif)1-year follower!$(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.
$(if watchtime_minutes >= 60)1+ hour watched$(endif)1+ hour watchedIn hours: watchtime_hours.
Looking forIn the reply rather than the condition: $(watchtime.minutes).
$(watchtime_hours)The viewer’s total watch time in hours.
$(if watchtime_hours >= 100)100-hour club!$(endif)100-hour club!$(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.
$(if live)we’re live!$(endif)we’re live!$(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.
$(if uptime_minutes >= 120)2+ hours in$(endif)2+ hours in$(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.
$(if accountage_days < 7)welcome, new account!$(endif)welcome, new account!$(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.
$(if user_level == "moderator")thanks for modding!$(endif)thanks for modding!$(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).
$(entries)42$(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).
$(prize)a Steam keyWe'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.
$(if $(hypetrain.active) == "yes")train is live!$(endif)train is live!$(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).
$(hypetrain.level)5Hype 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).
$(hypetrain.progress)9500$(hypetrain.progress) / $(hypetrain.goal) to the next level9500 / 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).
$(hypetrain.goal)15000Need $(hypetrain.goal) points for the next levelNeed 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.
$(hypetrain.total)14250This 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).
$(hypetrain.conductor)PixelPaladinAll 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).
$(hypetrain.type)golden_kappa$(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.
$(ad.nextin)4m 30sNext ad in $(ad.nextin), grab a drinkNext 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.
$(ad.lastago)12mLast ad was $(ad.lastago) agoLast 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.
$(ad.duration)1 min 30 secsAds 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.
$(ad.snoozecount)2$(ad.snoozecount) ad snoozes left2 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.
$(ad.prerollfree)300Preroll-free for another $(ad.prerollfree) secondsPreroll-free for another 300 secondsEmpty when there is no schedule.The next ad: $(ad.nextin).
Stream data
$(latest.follower)The most recent follower.
$(latest.follower)cdnkifferLatest 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.
$(latest.sub)MmiwoLatest 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).
$(latest.sub.tier)1Latest 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.
$(latest.sub.months)7Latest 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.
$(latest.sub.gifter)blakkrazor69Latest 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.
$(latest.sub.giftcount)5Latest 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.
$(latest.cheerer)blakkrazor69Latest 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.
$(latest.cheer.bits)5000Latest 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.
$(latest.cheer.message)lets goooLatest 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.
$(latest.raider)sheikhyabootieLatest 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.
$(latest.raid.viewers)412Latest 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.
$(latest.tipper)MmiwoLatest 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.
$(latest.tip.amount)8.00Latest 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.
$(latest.tip.message)keep it upLatest 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.
$(latest.redemption)ninjaLatest 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.
$(latest.redemption.reward)HydrateLatest 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.
$(latest.redemption.cost)500Latest 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.
$(session.topcheerer)blakkrazor69Top 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.
$(session.topcheer)5000Top 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.
$(session.toptipper)MmiwoTop 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.
$(session.toptip)8.00Top 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.
$(session.topchatter)DoxmiaTop 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.
$(session.topchatter.count)57Top 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.
$(session.messages)412Chat 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.
$(session.followers)12Follows 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.
$(session.subs)4Subs 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.
$(session.giftsubs)5Gift 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.
$(session.bits)5000Bits 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.
$(session.tips)42.50Tips 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.
$(session.tipcount)3Tip 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.
$(session.raidviewers)412Raid 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.
$(session.redemptions)27Redemptions 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.
$(today.followers)12Follows 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.
$(today.subs)4Subs 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.
$(today.giftsubs)5Gift 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.
$(today.bits)5000Bits 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.
$(today.tips)42.50Tips 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.
$(today.tipcount)3Tip 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.
$(today.raidviewers)412Raid 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.
$(today.redemptions)27Redemptions 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.
$(week.followers)12Follows 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.
$(week.subs)4Subs 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.
$(week.giftsubs)5Gift 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.
$(week.bits)5000Bits 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.
$(week.tips)42.50Tips 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.
$(week.tipcount)3Tip 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.
$(week.raidviewers)412Raid 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.
$(week.redemptions)27Redemptions 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.
$(month.followers)12Follows 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.
$(month.subs)4Subs 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.
$(month.giftsubs)5Gift 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.
$(month.bits)5000Bits 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.
$(month.tips)42.50Tips 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.
$(month.tipcount)3Tip 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.
$(month.raidviewers)412Raid 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.
$(month.redemptions)27Redemptions 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.
$(total.followers)12Follows 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.
$(total.subs)4Subs 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.
$(total.giftsubs)5Gift 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.
$(total.bits)5000Bits 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.
$(total.tips)42.50Tips 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.
$(total.tipcount)3Tip 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.
$(total.raidviewers)412Raid 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.
$(total.redemptions)27Redemptions 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.
$(goal.subscribers)42Subscribers goal: $(goal.subscribers) of $(goal.subscribers.target)Subscribers goal: 42 of 500The everyday goal reply.$(goal.subscribers Sub Drive) so far on Sub Drive42 so far on Sub DriveName the widget when you have more than one goal for this.Sub Drivethat Goal widget, by its nameleave it out when you only have oneRenders 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.
$(goal.subscribers.target)500Aiming for $(goal.subscribers.target) subscribers!Aiming for 500 subscribers!The number the goal is set to.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.subscribers.remaining)How many more subscribers the goal needs.
$(goal.subscribers.remaining)380$(goal.subscribers.remaining) to go!380 to go!Reads 0 once the goal is met.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.subscribers.pct)How far along the subscribers goal is, as a percentage.
$(goal.subscribers.pct)24We are $(goal.subscribers.pct)% of the way thereWe are 24% of the way thereA whole number, with no percent sign, so add your own.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.followers)How many followers your followers goal has so far.
$(goal.followers)120Followers goal: $(goal.followers) of $(goal.followers.target)Followers goal: 120 of 500The everyday goal reply.$(goal.followers Sub Drive) so far on Sub Drive120 so far on Sub DriveName the widget when you have more than one goal for this.Sub Drivethat Goal widget, by its nameleave it out when you only have oneRenders 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.
$(goal.followers.target)500Aiming for $(goal.followers.target) followers!Aiming for 500 followers!The number the goal is set to.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.followers.remaining)How many more followers the goal needs.
$(goal.followers.remaining)380$(goal.followers.remaining) to go!380 to go!Reads 0 once the goal is met.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.followers.pct)How far along the followers goal is, as a percentage.
$(goal.followers.pct)24We are $(goal.followers.pct)% of the way thereWe are 24% of the way thereA whole number, with no percent sign, so add your own.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.bits)How many bits your bits goal has so far.
$(goal.bits)5000Bits goal: $(goal.bits) of $(goal.bits.target)Bits goal: 5000 of 500The everyday goal reply.$(goal.bits Sub Drive) so far on Sub Drive5000 so far on Sub DriveName the widget when you have more than one goal for this.Sub Drivethat Goal widget, by its nameleave it out when you only have oneRenders 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.
$(goal.bits.target)500Aiming for $(goal.bits.target) bits!Aiming for 500 bits!The number the goal is set to.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.bits.remaining)How many more bits the goal needs.
$(goal.bits.remaining)380$(goal.bits.remaining) to go!380 to go!Reads 0 once the goal is met.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.bits.pct)How far along the bits goal is, as a percentage.
$(goal.bits.pct)24We are $(goal.bits.pct)% of the way thereWe are 24% of the way thereA whole number, with no percent sign, so add your own.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.tips)How many tips your tips goal has so far.
$(goal.tips)42.50Tips goal: $(goal.tips) of $(goal.tips.target)Tips goal: 42.50 of 500The everyday goal reply.$(goal.tips Sub Drive) so far on Sub Drive42.50 so far on Sub DriveName the widget when you have more than one goal for this.Sub Drivethat Goal widget, by its nameleave it out when you only have oneRenders 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.
$(goal.tips.target)500Aiming for $(goal.tips.target) tips!Aiming for 500 tips!The number the goal is set to.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.tips.remaining)How many more tips the goal needs.
$(goal.tips.remaining)380$(goal.tips.remaining) to go!380 to go!Reads 0 once the goal is met.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.tips.pct)How far along the tips goal is, as a percentage.
$(goal.tips.pct)24We are $(goal.tips.pct)% of the way thereWe are 24% of the way thereA whole number, with no percent sign, so add your own.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.raids)How many raids your raids goal has so far.
$(goal.raids)3Raids goal: $(goal.raids) of $(goal.raids.target)Raids goal: 3 of 500The everyday goal reply.$(goal.raids Sub Drive) so far on Sub Drive3 so far on Sub DriveName the widget when you have more than one goal for this.Sub Drivethat Goal widget, by its nameleave it out when you only have oneRenders 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.
$(goal.raids.target)500Aiming for $(goal.raids.target) raids!Aiming for 500 raids!The number the goal is set to.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.raids.remaining)How many more raids the goal needs.
$(goal.raids.remaining)380$(goal.raids.remaining) to go!380 to go!Reads 0 once the goal is met.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.raids.pct)How far along the raids goal is, as a percentage.
$(goal.raids.pct)24We are $(goal.raids.pct)% of the way thereWe are 24% of the way thereA whole number, with no percent sign, so add your own.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.redemptions)How many redemptions your redemptions goal has so far.
$(goal.redemptions)27Redemptions goal: $(goal.redemptions) of $(goal.redemptions.target)Redemptions goal: 27 of 500The everyday goal reply.$(goal.redemptions Sub Drive) so far on Sub Drive27 so far on Sub DriveName the widget when you have more than one goal for this.Sub Drivethat Goal widget, by its nameleave it out when you only have oneRenders 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.
$(goal.redemptions.target)500Aiming for $(goal.redemptions.target) redemptions!Aiming for 500 redemptions!The number the goal is set to.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.redemptions.remaining)How many more redemptions the goal needs.
$(goal.redemptions.remaining)380$(goal.redemptions.remaining) to go!380 to go!Reads 0 once the goal is met.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.redemptions.pct)How far along the redemptions goal is, as a percentage.
$(goal.redemptions.pct)24We are $(goal.redemptions.pct)% of the way thereWe are 24% of the way thereA whole number, with no percent sign, so add your own.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.pluspoints)How many Plus Points your Plus Points goal has so far.
$(goal.pluspoints)812Plus 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 Drive812 so far on Sub DriveName the widget when you have more than one goal for this.Sub Drivethat Goal widget, by its nameleave it out when you only have oneRenders 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.
$(goal.pluspoints.target)500Aiming for $(goal.pluspoints.target) Plus Points!Aiming for 500 Plus Points!The number the goal is set to.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.pluspoints.remaining)How many more Plus Points the goal needs.
$(goal.pluspoints.remaining)380$(goal.pluspoints.remaining) to go!380 to go!Reads 0 once the goal is met.Sub Drivethat Goal widget, by its nameleave it out when you only have one$(goal.pluspoints.pct)How far along the Plus Points goal is, as a percentage.
$(goal.pluspoints.pct)24We are $(goal.pluspoints.pct)% of the way thereWe are 24% of the way thereA whole number, with no percent sign, so add your own.Sub Drivethat Goal widget, by its nameleave it out when you only have oneSubathon & timers
$(subathon.remaining)How much time is left on your subathon clock.
$(subathon.remaining)1h 15mSubathon: $(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.Subathonthat Subathon widget, by its nameleave it out when you only have oneRenders 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.
$(subathon.remaining.seconds)4530$(if $(subathon.remaining.seconds) < 600)Under ten minutes!$(endif)Under ten minutes!A number you can compare in a condition.Subathonthat Subathon widget, by its nameleave it out when you only have one$(subathon.added)All the time added to the subathon clock so far.
$(subathon.added)30mYou have added $(subathon.added) so far!You have added 30m so far!Counts every contribution since the last reset.Subathonthat Subathon widget, by its nameleave it out when you only have one$(subathon.paused)Reads yes while the subathon clock is paused and no while it is running.
$(subathon.paused)no$(if $(subathon.paused) == yes)Paused while I am away$(else)Running!$(endif)Running!The clock pauses when you go offline.Subathonthat Subathon widget, by its nameleave it out when you only have one$(subathon.last.user)Who last added time to the subathon.
$(subathon.last.user)ninjaThanks $(subathon.last.user) for the extra time!Thanks ninja for the extra time!Empty until someone adds time this subathon.Subathonthat Subathon widget, by its nameleave it out when you only have one$(countdown.remaining)How much time is left on a Countdown widget.
$(countdown.remaining)5mBack in $(countdown.remaining)!Back in 5m!Reads the timer that is on your overlay.Break Timerthat Countdown widget, by its nameleave it out when you only have oneRenders 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.
$(countdown.remaining.seconds)305$(if $(countdown.remaining.seconds) < 60)Nearly back!$(endif)Nearly back!A number you can compare in a condition.Break Timerthat Countdown widget, by its nameleave it out when you only have one$(countdown.finished)Reads yes once a Countdown widget has reached zero.
$(countdown.finished)no$(if $(countdown.finished) == yes)Break over!$(else)$(countdown.remaining) left$(endif)5m leftSwitch the reply when the timer runs out.Break Timerthat Countdown widget, by its nameleave it out when you only have oneMerch
$(merch.sales)How many merch orders have come in this stream.
$(merch.sales)12$(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.
$(merch.revenue)349.50$(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.
$(merch.latest)Logo HoodieSomeone 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.
$(merch.total.sales)47$(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.
$(merch.total.revenue)1230.75Merch 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).
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.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.