Template variables
Every variable you can put in a step's text, what it holds and which triggers fill it
Write a variable in curly braces, like {name}, and Vfinity fills it in when the
step runs: "Thanks {name} for the {gift}!" becomes "Thanks Mika for the
Rose!".
Variables for every trigger
| Variable | Holds | Filled by |
|---|---|---|
{name} | The viewer's display name, or their @handle when they have none | Any trigger that names a viewer |
{nickname} | The viewer's display name | Any trigger that names a viewer |
{uniqueId} | The viewer's @handle, without the @ | Any trigger that names a viewer |
{points} | The viewer's points balance, after any points cost | Any trigger that names a viewer |
{trigger} | The API trigger's name, or else the trigger's type, such as gift or chat | Every trigger |
{gift} | The gift's name | Gift |
{count} | The combo's count for a gift, or the number of likes | Gift, Like |
{diamonds} | What one gift is worth | Gift |
{totalDiamonds} | What the whole combo is worth: diamonds × count | Gift |
{likes} | The likes in this one event | Like |
{totalLikes} | The room's running like total | Like, Room like milestone |
{comment} | The chat message, or the message that came with a gift or a reward | Chat message, First chat this stream, Gift, Twitch channel points |
{args} | Everything after the command, as one piece of text | Chat message |
{arg1} to {arg9} | The first to ninth word after the command, or a regular expression's captures | Chat message |
A viewer's points balance is per platform, so the same name on TikTok LIVE and Twitch has two balances.
Variables from one trigger
| Variable | Holds | Trigger |
|---|---|---|
{months} | Months subscribed, or months a YouTube member | Subscription |
{rewardName}, {rewardCost} | The reward's title, and what it cost in channel points | Twitch channel points |
{rewardId}, {redemptionId} | Twitch's ID for the reward, and for this one redemption | Twitch channel points |
{viewers} | Viewers who came along on the raid, or viewers in the room | Raid, Viewer count milestone |
{followers} | Your follower count | Follower count milestone |
{coins} | The coins the sender put in the treasure box | Treasure box |
{emoteUrl} | The address of the first emote's picture | Subscriber emote |
{questionText} | The question | LIVE question |
{phase}, {level}, {total} | The hype train's phase, level and total | Hype train |
{value}, {target}, {cycle} | Where the goal stands, its target, and which round a repeating goal is on | Overlay goal reached |
{result} | The option the wheel landed on | Wheel result |
{winner}, {tickets}, {entrants} | The winner's name, their tickets, and how many entered | Giveaway winner |
{team}, {score}, {otherScore} | The winning team, its score, and the other team's | Tug of war win |
{level}, {levelName} | The level reached, as a number and by name | Hype level reached |
Giveaway winner also names the winner as the viewer, so {name} works there
too. On a Gift, {comment} holds the message sent with a Twitch cheer, a
Kicks gift or a YouTube Super Chat, or the text a viewer typed for a reward.
API trigger fields
An API trigger turns each top-level field of the data it was sent into a
variable, if the field holds text, a number, or true or false. Up to 50 fields
count, and nested objects are left out. Sent {"name":"raid_alert","data":{"user":"Mika"}},
a step can say {user}.
Battle, TikTok LIVE goal, LIVE question and Super Fan expose
TikTok's own top-level fields the same way, such as {outcome} on a battle, or
{description} and {progress} on a LIVE goal.
Where you can use them
| Step or place | Field | How values go in |
|---|---|---|
| Speak a custom line | Text to speak | As spoken text, after the TTS moderation filters |
| Control OBS, Write into a text source | Text | As plain text |
| HTTP webhook | URL / action ID | Percent-encoded, in the path and query only |
| HTTP webhook | JSON body / arguments | Inside the JSON's text values |
| Streamer.bot action | JSON body / arguments | Inside the JSON's text values |
| App command | Value or Value (JSON) | Inside text values |
A webhook always goes to the host you typed: a variable can change the path and the query, never the server. In JSON, only text values are filled, so a viewer's message can never add a field or break the structure.
How values are filled
- A variable with nothing behind it, like
{gift}on a follow, becomes empty. - A name Vfinity does not know, like
{banana}, stays exactly as written. - In spoken and plain text, line breaks become spaces and control characters are removed. One value is cut at 500 characters.
- Filling happens once. A viewer whose name is literally
{name}is shown as{name}, never filled a second time. - Names are case-sensitive:
{Name}is not{name}.
Alert text
Alert cards have their own placeholders for Custom message, filled from the alert rather than from an event.
| Placeholder | Holds |
|---|---|
{name} | The sender, drawn in the accent color |
{gift}, {count} | The gift and its count |
{diamonds}, {totalDiamonds} | One gift's value, and the whole combo's |
{likes}, {totalLikes} | The like milestone crossed, and the room's total |
{months} | Months subscribed, on a subscription alert |
{viewers} | Viewers who came along, on a raid alert |
A placeholder with nothing behind it on an alert shows as 0 or empty. Text to speech reads the same text the card shows.
