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.
| Trigger | Description | Optional conditions |
|---|---|---|
| Follow | A viewer follows the channel | — |
| Subscribe | A viewer subscribes (new or resub) | Tier (1 / 2 / 3) |
| Subscribe / Member (with message) | A viewer (re)subscribes with a resub message attached | Tier (1 / 2 / 3) |
| Gift Sub | A viewer gifts subscriptions | — |
| Cheer (bits) | A viewer cheers bits in chat | Min bits |
| Raid | An incoming raid arrives | Min viewers |
| Channel Point Redeem | A viewer redeems a channel point reward | Reward (select from dropdown — matched by ID) |
| Bot Command | A viewer types a !command in chat | Command name (without !) |
| Watch Streak Milestone | A viewer hits a watch-streak milestone | Min/max streak count |
| Entrance | A viewer's first chat message of the current stream session (resets when the stream goes live) | — |
| Hype Train Begin | A hype train starts | — |
| Hype Train End | A hype train ends | — |
| Stream Goes Live | The channel goes live | — |
| Stream Goes Offline | The 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.
| Trigger | Description | Optional 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 | — |
| Entrance | A viewer's first chat message of the current stream session (resets when the stream goes live) | — |
| Stream Goes Live | An active live broadcast is found | — |
| Stream Goes Offline | The live broadcast ends | — |
StreamHub
| Trigger | Description | Optional conditions |
|---|---|---|
| StreamHub Post Published | StreamHub successfully sends a post (e.g. a Discord webhook message) | — |
| StreamHub Post Failed | StreamHub fails to send a post | — |
Conditions
Conditions are optional filters evaluated before a rule fires. All specified conditions must match:
| Condition | Applies to | Behaviour |
|---|---|---|
| Min viewers | Raid | Raid must arrive with at least this many viewers |
| Min bits | Cheer | Cheer must contain at least this many bits |
| Tier | Subscribe, Subscribe / Member (with message) | Subscription must be the specified tier |
| Reward | Channel Point Redeem | Pick from a dropdown — matched by reward ID (stable across renames) |
| Command name | Bot Command | Command keyword without ! (e.g. cat fires on !cat) |
| Min/max streak | Watch Streak Milestone | Streak 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:
| Variable | Value |
|---|---|
{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.
| Variable | Value |
|---|---|
{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):
- Trigger: Bot Command, command name =
so - Action: Send Chat Message —
Go 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:
| Syntax | Example | Description |
|---|---|---|
{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):
| Variable | Value |
|---|---|
{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
| Action | Parameters | Scope | Notes |
|---|---|---|---|
| Send Chat Message | message | (bot account) | Sent by the connected bot account. Supports all variables. |
| Send Announcement | message, color | moderator:manage:announcements | Posts a colored announcement banner in chat. Colors: primary, blue, green, orange, purple. |
| Update Chat Mode | mode, enabled, value | moderator:manage:chat_settings | Toggles slow mode (with optional delay), subscribers-only, emote-only, followers-only (with optional duration), or unique chat. |
| Clear Chat | (none) | moderator:manage:chat_messages | Deletes all messages from chat. |
OBS
All OBS actions require OBS to be connected (Triggers → Integrations → OBS Studio). OBS 28+ is required.
| Action | Parameters | Notes |
|---|---|---|
| Switch Scene | sceneName | Switches the program scene (what viewers see). |
| Show / Hide Source | sceneName, sourceName, visible | Shows or hides a source within a scene. |
| Enable / Disable Filter | sourceName, filterName, enabled | Toggles any filter on any source (blur, chroma key, color correction, etc.). |
| Mute / Unmute Input | inputName, muted | Mutes or unmutes an audio input (e.g. Mic/Aux). |
| Set Input Volume | inputName, volumePct | Sets volume 0–200 %. 100 % = unity, above 100 % is a boost. |
| Set Text Source Content | sourceName, text | Rewrites a Text (GDI+) or FreeType 2 source. Supports {user} and other variables. Useful for "Latest Follower" overlays. |
| Control Media Source | sourceName, action | Plays, pauses, stops, or restarts a media source (video, audio, GIF). |
| Start / Stop Stream | action | Starts or stops the OBS stream output. |
| Start / Stop Recording | action | Starts, stops, pauses, or resumes a recording. |
| Trigger OBS Hotkey | hotkeyName | Fires 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.
| Action | Parameters | Scope | Notes |
|---|---|---|---|
| Post via StreamHub | targetId, 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.
| Action | Parameters | Notes |
|---|---|---|
| Send Chat Message | message | Sent to the active broadcast's live chat by the connected account. Supports variables. |
| Ban User | targetChannelId? | Bans a channel from chat. Leave the channel ID blank to use the viewer who fired the triggering event. |
| Timeout User | targetChannelId?, durationSecs | Times out a channel for up to 86,400 seconds (24h). |
| Add Moderator | targetChannelId? | Adds a channel as a moderator of the live chat. |
| Remove Moderator | moderatorEntryId | Removes 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 / Timeout | banEntryId | Removes a ban or timeout. Identified by the entry ID returned when the ban/timeout was issued, same caveat as above. |
| Delete Chat Message | messageId? | Deletes a specific chat message. Leave blank to delete the message that fired the triggering event. |
| Update Stream Title | title | Updates 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.
| Action | Parameters | Notes |
|---|---|---|
| Send Chat Message | message | Sent by the connected account. Supports variables. |
| Update Title / Category | title?, categoryName? | Leave either field blank to keep the current value. |
| Ban User | targetUserId, reason? | Requires the target's numeric Kick user ID — Kick has no live chat to resolve a user from. |
| Timeout User | targetUserId, durationMins, reason? | Same numeric-ID requirement as above. |
| Unban User | targetUserId | Same 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.
| Action | Parameters | Scope | Notes |
|---|---|---|---|
| Update Title / Category | title, categoryName | channel:manage:broadcast | Updates the stream title and/or category. Leave either field blank to keep the current value. Supports variables. |
| Create Clip | (none) | clips:edit | Creates a clip of the current stream automatically. |
| Raid Channel | targetLogin | channel:manage:raids | Raids another channel by login name. |
| Cancel Raid | (none) | channel:manage:raids | Cancels any outgoing raid. |
| Run Commercial | length | channel:edit:commercial | Runs a commercial of 30, 60, 90, 120, 150, or 180 seconds. Channel must be Affiliate or Partner. |
Twitch – Channel Points
| Action | Parameters | Scope | Notes |
|---|---|---|---|
| Enable / Disable Reward | rewardId (dropdown), enabled | channel:manage:redemptions | Enables or disables a reward. Pick from the dropdown — matched by ID, stable across renames. |
| Rename Reward | rewardId (dropdown), newName | channel:manage:redemptions | Renames a reward. |
| Update Reward Cost | rewardId (dropdown), cost | channel:manage:redemptions | Changes how many channel points a reward costs. |
| Pause / Unpause Reward | rewardId (dropdown), paused | channel:manage:redemptions | Pauses (grays out) or unpauses a reward without disabling it. |
| Fulfill Redemption | (none) | channel:manage:redemptions | Marks the redemption that fired this trigger as fulfilled. Only valid on Channel Point Redeem triggers. |
| Reject Redemption | (none) | channel:manage:redemptions | Cancels the redemption that fired this trigger, refunding the viewer's points. Only valid on Channel Point Redeem triggers. |
Twitch – Polls & Predictions
| Action | Parameters | Scope | Notes |
|---|---|---|---|
| Create Poll | title, choices (comma-sep), durationSecs | channel:manage:polls | Creates a poll with 2–5 choices. Duration 15–1800 seconds. |
| Create Prediction | title, outcomes (comma-sep), windowSecs | channel:manage:predictions | Creates 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).
| Action | Parameters | Scope | Notes |
|---|---|---|---|
| Ban User | useEventUser, targetLogin?, reason? | moderator:manage:banned_users | Permanently bans a user. |
| Timeout User | useEventUser, targetLogin?, durationSecs, reason? | moderator:manage:banned_users | Times out a user for the specified duration (max ~14 days). |
| Unban User | useEventUser, targetLogin? | moderator:manage:banned_users | Removes a ban or timeout early. |
| Warn User | useEventUser, targetLogin?, reason | moderator:manage:warnings | Sends an official Twitch warning to a viewer. |
| Add VIP | useEventUser, targetLogin? | channel:manage:vips | Grants VIP status. Useful to auto-VIP raiders above a viewer threshold. |
| Remove VIP | useEventUser, targetLogin? | channel:manage:vips | Removes VIP status. |
| Add Moderator | useEventUser, targetLogin? | channel:manage:moderators | Adds a moderator. |
| Remove Moderator | useEventUser, targetLogin? | channel:manage:moderators | Removes a moderator. |
Twitch – Other
| Action | Parameters | Scope | Notes |
|---|---|---|---|
| Shoutout User | (none) | moderator:manage:shoutouts | Gives a Twitch shoutout to the viewer who triggered the event. Best used on Raid triggers. |
| Create Stream Marker | description? | channel:manage:broadcast | Creates a bookmark in the VOD at the current position. Supports variables. |
| Get User Clips | username, featuredOnly?, responseVar | Looks 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
| Action | Parameters | Notes |
|---|---|---|
| Play Sound | filePath, 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
| Action | Parameters | Notes |
|---|---|---|
| If-Condition | leftOperand, operator, rightOperand, skipCount | Evaluates 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:
- Trigger: Raid
- Action 1: If-Condition —
{viewers}>=10, skipCount = 1 - Action 2: Send Chat Message —
Welcome raid from {user} with {viewers} viewers! 🎉(skipped if condition is false)
Other
| Action | Parameters | Notes |
|---|---|---|
| API Call | url, method, headersRaw (JSON), bodyRaw (JSON), responseVar, jsonPath | Makes 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 Variable | varName, value | Stores 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 Event | eventName, 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 List | listVar, outputVar | Picks 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 Number | min, max, outputVar | Stores 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 Length | listVar, outputVar | Stores 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 Index | listVar, index, outputVar | Stores 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 Text | input, mode (trim/upper/lower/truncate), maxLength?, outputVar | Applies 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
- Trigger: Raid, min viewers = 10
- Action: Add VIP, target = "Viewer who triggered this event"
Auto-fulfill a channel point redemption
- Trigger: Channel Point Redeem, reward name =
"!special" - Action: Fulfill Redemption (uses
{redemptionId}from event data automatically)
Disable a limited reward after first use
- Trigger: Channel Point Redeem, reward name =
"VIP for a Day" - Action: Enable / Disable Reward, reward name =
"VIP for a Day", state = Disabled
Auto-create a poll when hype train begins
- Trigger: Hype Train Begin
- 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
- Trigger: Raid, min viewers = 5
- 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
- Trigger: Bot Command, command =
cat - Action 1: API Call — URL =
https://catfact.ninja/fact, Variable name =catResult, JSON path =fact - Action 2: Send Chat Message — message =
{var:catResult}
Announce a YouTube Super Chat in Twitch chat (Pro)
- Trigger: Platform = YouTube, event = Cheer (bits)
- 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:
| Status | Meaning |
|---|---|
pending | Waiting for the entry ahead of it in the same queue |
running | Currently executing |
done | Completed successfully |
failed | The 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
failedwith 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
403error 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.