Skip to content

StreamSync Triggers & Actions — Reference

🍼 ELI5

A trigger is a recipe: "when X happens, do Y, then Z." X might be a follow or a raid; Y and Z might be "play a sound" and "post to Discord." You build these with dropdowns — no coding — and StreamSync runs them the instant the event happens.

Overview

The Triggers & Actions system lets you automate responses to stream events without writing code. Each rule maps one trigger (a stream event) to an ordered list of actions (things StreamSync does in sequence). Rules are assigned to a queue; each queue runs independently with its own FIFO (first-in, first-out) processing loop.

A rule can have any number of actions. They run in the order they are listed, one at a time — the next action starts only after the previous one completes (or its Delay after action timer elapses). Actions within one rule share a variable context so an API Call action can store a result that a later Send Chat Message action reads.


Queues

Queues let you organize actions into independent processing lanes. A rule assigned to a queue will only run after all earlier entries in that queue have finished — queues do not block each other.

Default queue

A Default queue is created automatically and cannot be deleted. If you need no special isolation, assign all rules here.

Creating additional queues

Go to Triggers → Queue tab and use the queue manager at the top. Click + Add Queue, type a name, and press Enter. You can rename any queue (including Default) and delete any non-Default queue.

Common patterns:

  • Alerts queue — all follower/sub/raid alerts; use the "Delay after action" field to space them out
  • OBS queue — scene and source changes; keeps them sequential without blocking chat messages
  • Default queue — everything else

Delay after action

Each rule has a Delay after action (seconds) field. After the action completes (e.g. an alert video finishes playing), the queue waits this many seconds before processing the next entry. This is how you time alert sequences so they don't overlap.

Example: a follow alert plays a 5-second video → set delay to 5 seconds so the next alert waits.


Triggers

A trigger is an event that causes a rule to evaluate. Pick a Platform first (Twitch, YouTube, or StreamHub), which determines which events are available.

🔒 YouTube triggers require StreamSync Pro. Kick has no live event feed yet, so it can't be used as a trigger source at all — use it as an action instead.

Twitch

All Twitch triggers require the streamer account to be connected and EventSub active.

TriggerDescriptionOptional conditions
FollowA viewer follows the channel
SubscribeA viewer subscribes (new or resub)Tier (1 / 2 / 3)
Subscribe / Member (with message)A viewer (re)subscribes with a resub message attachedTier (1 / 2 / 3)
Gift SubA viewer gifts subscriptions
Cheer (bits)A viewer cheers bits in chatMin bits
RaidAn incoming raid arrivesMin viewers
Channel Point RedeemA viewer redeems a channel point rewardReward (select from dropdown — matched by ID)
Bot CommandA viewer types a !command in chatCommand name (without !)
Watch Streak MilestoneA viewer hits a watch-streak milestoneMin/max streak count
EntranceA viewer's first chat message of the current stream session (resets when the stream goes live)
Hype Train BeginA hype train starts
Hype Train EndA hype train ends
Stream Goes LiveThe channel goes live
Stream Goes OfflineThe channel goes offline

YouTube (StreamSync Pro)

These require the YouTube streamer account to be connected and an active live broadcast — see Connecting Platforms for setup and polling caveats.

TriggerDescriptionOptional conditions
Subscribe / Member (with message)A viewer becomes a channel member (new membership)Tier
Cheer (bits)A viewer sends a Super Chat or Super Sticker
EntranceA viewer's first chat message of the current stream session (resets when the stream goes live)
Stream Goes LiveAn active live broadcast is found
Stream Goes OfflineThe live broadcast ends

StreamHub

TriggerDescriptionOptional conditions
StreamHub Post PublishedStreamHub successfully sends a post (e.g. a Discord webhook message)
StreamHub Post FailedStreamHub fails to send a post

Conditions

Conditions are optional filters evaluated before a rule fires. All specified conditions must match:

ConditionApplies toBehaviour
Min viewersRaidRaid must arrive with at least this many viewers
Min bitsCheerCheer must contain at least this many bits
TierSubscribe, Subscribe / Member (with message)Subscription must be the specified tier
RewardChannel Point RedeemPick from a dropdown — matched by reward ID (stable across renames)
Command nameBot CommandCommand keyword without ! (e.g. cat fires on !cat)
Min/max streakWatch Streak MilestoneStreak count must fall within the given bounds (either bound may be left unset)

Actions

Each rule has an ordered list of actions. They execute sequentially; after each action, the queue optionally waits Delay after action milliseconds before starting the next one.

Variables

The following variables are replaced in string fields at the time the action fires:

Event variables

These are replaced with data from the event that fired the trigger:

VariableValue
{user}Display name of the viewer who triggered the event
{userId}Twitch user ID of the viewer
{bits}Number of bits cheered
{viewers}Viewer count (raid)
{tier}Subscription tier (e.g. 1000, 2000, 3000)
{level}Hype train level
{rewardTitle}Name of the channel point reward redeemed
{rewardId}Internal ID of the channel point reward
{redemptionId}ID of the specific redemption instance (use with Fulfill / Reject)
{userInput}Text the viewer typed when redeeming a reward
{commandName}The command keyword that fired a Bot Command trigger (without !)
{args}All arguments after the command name, joined by spaces
{streak}Watch-streak count that fired a Watch Streak Milestone trigger

Note: For Raid triggers, {user} resolves to the raiding broadcaster's display name and {userId} to their Twitch ID.

Command target variables

For a Bot Command trigger, StreamSync automatically resolves the command's first argument as a Twitch user (stripping a leading @ if present, e.g. !so @streamer) and looks them up via the Twitch API — no separate action needed. If the argument doesn't match a real Twitch account, or the command was used with no arguments, these are all empty strings.

VariableValue
{targetUser}Display name of the resolved target user
{targetUserId}Twitch user ID of the resolved target user
{targetUserLogin}Login name (lowercase handle) of the resolved target user
{targetGame}Name of the game/category on the target's channel
{targetGameId}Twitch game/category ID
{targetTitle}Current title of the target's channel

Example — a custom shoutout command (!so @streamername):

  1. Trigger: Bot Command, command name = so
  2. Action: Send Chat MessageGo check out {targetUser}, they were last playing {targetGame}! https://twitch.tv/{targetUserLogin}

Fire-context variables

Actions within the same trigger fire share a variable context. Use these to pass data between actions:

SyntaxExampleDescription
{var:name}{var:catResult}Substitute a stored variable by name
{vars.name.field}{vars.catResult.fact}Substitute a nested field from a stored object

Variables are set by the API Call action (responseVar field) or the Set Variable action. They are cleared when all actions in the trigger fire have finished.

Stream state variables

These are replaced from the live stream state cache (same values as bot command variables):

VariableValue
{viewer_count}Current viewer count (refreshed every 60 s)
{stream_title}Current stream title
{stream_game}Current game / category
{uptime}Elapsed stream time (e.g. 2h 14m), or offline
{follower_count}Total follower count (refreshed every 5 min)
{sub_count}Total subscriber count (refreshed every 5 min)
{latest_follower}Display name of the most recent follower
{latest_sub}Display name of the most recent subscriber
{latest_sub_tier}Tier of the most recent sub (Tier 1 / Tier 2 / Tier 3)
{latest_gifter}Display name of the most recent gift-sub giver
{latest_gift_count}Number of subs gifted in that event
{latest_raider}Display name of the most recent raider
{latest_raid_viewers}Viewer count they brought
{latest_cheerer}Display name of the most recent cheerer
{latest_cheer_bits}Bit count from that cheer

Chat

ActionParametersScopeNotes
Send Chat Messagemessage(bot account)Sent by the connected bot account. Supports all variables.
Send Announcementmessage, colormoderator:manage:announcementsPosts a colored announcement banner in chat. Colors: primary, blue, green, orange, purple.
Update Chat Modemode, enabled, valuemoderator:manage:chat_settingsToggles slow mode (with optional delay), subscribers-only, emote-only, followers-only (with optional duration), or unique chat.
Clear Chat(none)moderator:manage:chat_messagesDeletes all messages from chat.

OBS

All OBS actions require OBS to be connected (Triggers → Integrations → OBS Studio). OBS 28+ is required.

ActionParametersNotes
Switch ScenesceneNameSwitches the program scene (what viewers see).
Show / Hide SourcesceneName, sourceName, visibleShows or hides a source within a scene.
Enable / Disable FiltersourceName, filterName, enabledToggles any filter on any source (blur, chroma key, color correction, etc.).
Mute / Unmute InputinputName, mutedMutes or unmutes an audio input (e.g. Mic/Aux).
Set Input VolumeinputName, volumePctSets volume 0–200 %. 100 % = unity, above 100 % is a boost.
Set Text Source ContentsourceName, textRewrites a Text (GDI+) or FreeType 2 source. Supports {user} and other variables. Useful for "Latest Follower" overlays.
Control Media SourcesourceName, actionPlays, pauses, stops, or restarts a media source (video, audio, GIF).
Start / Stop StreamactionStarts or stops the OBS stream output.
Start / Stop RecordingactionStarts, stops, pauses, or resumes a recording.
Trigger OBS HotkeyhotkeyNameFires any OBS hotkey by name. Find names via Profile → Export (look in "OBSBasic.Hotkeys").

StreamHub

Requires StreamHub to be connected (Triggers → Integrations → StreamHub). See Connecting to StreamHub for setup.

ActionParametersScopeNotes
Post via StreamHubtargetId, message, imageUrl?(none)Sends a message to a destination configured in StreamHub (Discord, Facebook, Instagram, YouTube, X/Twitter, or Threads). targetId is picked from a dropdown populated from StreamHub's Connections list. Supports variables in message.

YouTube (StreamSync Pro)

🔒 Requires StreamSync Pro and a connected YouTube account. Most actions need an active live broadcast — see Connecting Platforms.

ActionParametersNotes
Send Chat MessagemessageSent to the active broadcast's live chat by the connected account. Supports variables.
Ban UsertargetChannelId?Bans a channel from chat. Leave the channel ID blank to use the viewer who fired the triggering event.
Timeout UsertargetChannelId?, durationSecsTimes out a channel for up to 86,400 seconds (24h).
Add ModeratortargetChannelId?Adds a channel as a moderator of the live chat.
Remove ModeratormoderatorEntryIdRemoves a moderator. YouTube identifies moderators by the entry ID returned when they were added — not by channel ID — so this only works after an Add Moderator action has run once for that user.
Lift Ban / TimeoutbanEntryIdRemoves a ban or timeout. Identified by the entry ID returned when the ban/timeout was issued, same caveat as above.
Delete Chat MessagemessageId?Deletes a specific chat message. Leave blank to delete the message that fired the triggering event.
Update Stream TitletitleUpdates the active live broadcast's title. Supports variables.
End Live Stream(none)Ends the active live broadcast immediately.

YouTube has no username lookup, so user-targeting actions work with channel IDs resolved from the triggering event, or pasted in explicitly.


Kick (StreamSync Pro)

🔒 Requires StreamSync Pro and a connected Kick account. Auth + REST only — see Connecting Platforms for what's not supported.

ActionParametersNotes
Send Chat MessagemessageSent by the connected account. Supports variables.
Update Title / Categorytitle?, categoryName?Leave either field blank to keep the current value.
Ban UsertargetUserId, reason?Requires the target's numeric Kick user ID — Kick has no live chat to resolve a user from.
Timeout UsertargetUserId, durationMins, reason?Same numeric-ID requirement as above.
Unban UsertargetUserIdSame numeric-ID requirement as above.

Because Kick can't fire triggers, these actions only make sense fired from a Twitch, YouTube, or StreamHub trigger (e.g. ban a known troublemaker's Kick ID when they raid your Twitch channel).


Twitch – Channel

Twitch actions use the streamer's access token. If a scope is missing, log out and log back in to re-authorize.

ActionParametersScopeNotes
Update Title / Categorytitle, categoryNamechannel:manage:broadcastUpdates the stream title and/or category. Leave either field blank to keep the current value. Supports variables.
Create Clip(none)clips:editCreates a clip of the current stream automatically.
Raid ChanneltargetLoginchannel:manage:raidsRaids another channel by login name.
Cancel Raid(none)channel:manage:raidsCancels any outgoing raid.
Run Commerciallengthchannel:edit:commercialRuns a commercial of 30, 60, 90, 120, 150, or 180 seconds. Channel must be Affiliate or Partner.

Twitch – Channel Points

ActionParametersScopeNotes
Enable / Disable RewardrewardId (dropdown), enabledchannel:manage:redemptionsEnables or disables a reward. Pick from the dropdown — matched by ID, stable across renames.
Rename RewardrewardId (dropdown), newNamechannel:manage:redemptionsRenames a reward.
Update Reward CostrewardId (dropdown), costchannel:manage:redemptionsChanges how many channel points a reward costs.
Pause / Unpause RewardrewardId (dropdown), pausedchannel:manage:redemptionsPauses (grays out) or unpauses a reward without disabling it.
Fulfill Redemption(none)channel:manage:redemptionsMarks the redemption that fired this trigger as fulfilled. Only valid on Channel Point Redeem triggers.
Reject Redemption(none)channel:manage:redemptionsCancels the redemption that fired this trigger, refunding the viewer's points. Only valid on Channel Point Redeem triggers.

Twitch – Polls & Predictions

ActionParametersScopeNotes
Create Polltitle, choices (comma-sep), durationSecschannel:manage:pollsCreates a poll with 2–5 choices. Duration 15–1800 seconds.
Create Predictiontitle, outcomes (comma-sep), windowSecschannel:manage:predictionsCreates a prediction with 2–10 outcomes. Window 30–1800 seconds.

Twitch – Moderation

For user-targeting actions, choose "Viewer who triggered this event" (uses {userId} from event data) or "Specific user" (enter a login name directly).

ActionParametersScopeNotes
Ban UseruseEventUser, targetLogin?, reason?moderator:manage:banned_usersPermanently bans a user.
Timeout UseruseEventUser, targetLogin?, durationSecs, reason?moderator:manage:banned_usersTimes out a user for the specified duration (max ~14 days).
Unban UseruseEventUser, targetLogin?moderator:manage:banned_usersRemoves a ban or timeout early.
Warn UseruseEventUser, targetLogin?, reasonmoderator:manage:warningsSends an official Twitch warning to a viewer.
Add VIPuseEventUser, targetLogin?channel:manage:vipsGrants VIP status. Useful to auto-VIP raiders above a viewer threshold.
Remove VIPuseEventUser, targetLogin?channel:manage:vipsRemoves VIP status.
Add ModeratoruseEventUser, targetLogin?channel:manage:moderatorsAdds a moderator.
Remove ModeratoruseEventUser, targetLogin?channel:manage:moderatorsRemoves a moderator.

Twitch – Other

ActionParametersScopeNotes
Shoutout User(none)moderator:manage:shoutoutsGives a Twitch shoutout to the viewer who triggered the event. Best used on Raid triggers.
Create Stream Markerdescription?channel:manage:broadcastCreates a bookmark in the VOD at the current position. Supports variables.
Get User Clipsusername, featuredOnly?, responseVarLooks up a Twitch user's clips (newest first) and stores them as a list under Variable name. Use {user} as the username to target the raider on a Raid trigger. Each clip has url, embedUrl, title, viewCount, thumbnailUrl, duration, isFeatured, etc. — reference one with {vars.name.0.embedUrl}, or pull a random one first with Pick Random Item from List.

Sound

ActionParametersNotes
Play SoundfilePath, volume (0–100)Plays a local audio file through the app. Click Browse to pick a file (mp3, wav, ogg, flac, m4a, aac). Volume defaults to 100.

Logic

ActionParametersNotes
If-ConditionleftOperand, operator, rightOperand, skipCountEvaluates a comparison. If false, skips the next skipCount actions in the same rule. Operands support all variable substitutions.

Supported operators: ==, !=, >, <, >=, <=, contains, not-contains.

Example — send a message only if the viewer has 10+ viewers in a raid:

  1. Trigger: Raid
  2. Action 1: If-Condition{viewers} >= 10, skipCount = 1
  3. Action 2: Send Chat MessageWelcome raid from {user} with {viewers} viewers! 🎉 (skipped if condition is false)

Other

ActionParametersNotes
API Callurl, method, headersRaw (JSON), bodyRaw (JSON), responseVar, jsonPathMakes an HTTP request and optionally stores the response in the fire context. Set Variable name to name the stored result (e.g. catResult), and JSON path to extract a nested field (e.g. fact extracts response.fact). Leave JSON path blank to store the whole response object and use {vars.catResult.field}. If JSON path is set, use {var:catResult} directly.
Set VariablevarName, valueStores a value in the fire context under varName, readable in later actions via {var:varName}. Supports variable substitution in value.
Webhook (HTTP POST)url, body (JSON)Sends an HTTP POST to any URL with a JSON body. 10-second timeout. Integrates with Make, Zapier, IFTTT, or custom servers.
Custom Overlay EventeventName, data (JSON)Fires an arbitrary event to every connected overlay page. Overlay JS listens with window.addEventListener(eventName, e => e.detail.data). Supports variables in string values of data. See Overlays — Receiving events in overlay JS for a worked example.
Pick Random Item from ListlistVar, outputVarPicks one random element from a list stored by an earlier action (e.g. Get User Clips) and stores it under Output variable name. listVar/outputVar are plain names (not {var:...}) — reference the result afterward with {vars.outputVar.field}.
Random Numbermin, max, outputVarStores a random whole number between Min and Max (inclusive; the bounds are swapped automatically if entered in reverse) under Output variable name. Reference it with {var:outputVar}.
List LengthlistVar, outputVarStores the length of a list stored by an earlier action under Output variable name. Useful with If-Condition to branch on an empty list ({var:outputVar} == 0).
Get Item at IndexlistVar, index, outputVarStores the list item at Index (0 = first, -1 = last) under Output variable name. Fails the action if the index is out of range — guard with List Length + If-Condition first.
Transform Textinput, mode (trim/upper/lower/truncate), maxLength?, outputVarApplies a text transform to Text and stores the result under Output variable name. maxLength (default 100) only applies in truncate mode, and appends when text is cut.

Examples

Auto-VIP raiders with 10+ viewers

  1. Trigger: Raid, min viewers = 10
  2. Action: Add VIP, target = "Viewer who triggered this event"

Auto-fulfill a channel point redemption

  1. Trigger: Channel Point Redeem, reward name = "!special"
  2. Action: Fulfill Redemption (uses {redemptionId} from event data automatically)

Disable a limited reward after first use

  1. Trigger: Channel Point Redeem, reward name = "VIP for a Day"
  2. Action: Enable / Disable Reward, reward name = "VIP for a Day", state = Disabled

Auto-create a poll when hype train begins

  1. Trigger: Hype Train Begin
  2. Action: Create Poll, title = "Hype train goal?", choices = "Keep going!, Slow down!, Let's max it!", duration = 60

Post a raid alert to Discord via StreamHub

  1. Trigger: Raid, min viewers = 5
  2. Action: Post via StreamHub, destination = your Discord webhook, message = "{user} just raided with {viewers} viewers! 🎉"

Fetch a cat fact on !cat command and send it to chat

  1. Trigger: Bot Command, command = cat
  2. Action 1: API Call — URL = https://catfact.ninja/fact, Variable name = catResult, JSON path = fact
  3. Action 2: Send Chat Message — message = {var:catResult}

Announce a YouTube Super Chat in Twitch chat (Pro)

  1. Trigger: Platform = YouTube, event = Cheer (bits)
  2. Action: Send Chat Message (Twitch), message = "Thanks for the Super Chat, {user}!"

Queue tab

The Queue tab shows real-time status for every entry that has fired:

StatusMeaning
pendingWaiting for the entry ahead of it in the same queue
runningCurrently executing
doneCompleted successfully
failedThe action threw an error (error message shown inline)

Use the filter dropdown to show entries from a specific queue. Use Clear to remove displayed history (does not affect pending/running entries).


Tips

  • Rules in different queues run fully independently — an OBS scene switch in the OBS queue does not block a chat message in the Default queue.
  • Rules in the same queue are ordered by the time they were triggered. The oldest pending entry runs first.
  • Use Disable (the ✓ toggle on a rule) to temporarily pause a rule without deleting it.
  • OBS actions fail gracefully if OBS is not connected — the entry shows failed with an error message.
  • The same applies to Post via StreamHub if StreamHub is not connected.
  • Twitch actions that require extra scopes will fail with a 403 error if the token doesn't have them. Log out and log back in to re-grant scopes.
  • YouTube and Kick actions/triggers fail with an error in the Queue tab if the relevant account isn't connected, or (YouTube) if there's no active live broadcast.
  • Webhook requests time out after 10 seconds.

StreamSync and StreamHub documentation.