Skip to main content

Edge Handle Reference

Every input and output handle on a flow node has a type, and edges in the flow editor are colored by that type so you can see at a glance what's wired where. This page lists every built-in type, its color, a short description, and — for object types — the shape of the data that travels through the edge.

tip

When you hover a handle in the editor, the tooltip shows the same label and color shown here. If two handles are the same color, they're compatible.

Primitive Types

string Text values — usernames, messages, URLs, IDs.
number Numeric values — counts, costs, timestamps, durations.
bool True / false values.

Special Types

⚡ pulse A signal with no payload — just means "something happened". Used to trigger effect nodes that don't need an input value.
any Accepts any type of data. Use sparingly — specific types let the editor catch wiring mistakes and color-code edges.

Object Types

These types carry structured data. Use an Extract node to pull individual fields out of an object.

User

A Twitch user.

FieldTypeNotes
user_idstringTwitch user ID
user_loginstringUsername (lowercase)
user_namestringDisplay name
colorstring?Chat color (hex)
profile_image_urlstring?Profile image URL
typestring?"staff", "admin", "global_mod", or ""
broadcaster_typestring?"partner", "affiliate", or ""
note

Trigger executors only guarantee user_id, user_login, and user_name. Other fields may be absent depending on the trigger source.

Event

A generic event envelope used when a flow processes multiple event kinds through the same wire.

FieldTypeNotes
typestringEvent type identifier
timestampnumberWhen the event occurred (unix ms)
payloadobjectEvent-specific data
metadataobject?Optional metadata

Message

A simplified chat message — just text, fragments, and badges. Use this when you only need the message body.

FieldTypeNotes
textstringFull message text
fragmentsarrayText, emote, mention, and cheermote fragments
badgesarraySender's chat badges

Chat Message

The full Twitch chat-message payload — broadcaster + chatter info, message content, color, badges, cheer info, and shared-chat source fields.

FieldTypeNotes
broadcaster_user_id / _login / _namestringChannel where the message landed
chatter_user_id / _login / _namestringWho sent it
message_idstringUnique message ID
message.textstringPlain text
message.fragmentsarrayParsed fragments (text / emote / mention / cheermote)
colorstringChatter's color (hex)
badgesarray{ set_id, id, info }[]
message_typestring"text", "channel_points_highlighted", "power_ups_message_effect", etc.
cheerobject | null{ bits } when the message includes bits
channel_points_animation_idstring | null"simmer", "rainbow-eclipse", "cosmic-abyss"
channel_points_custom_reward_idstring | nullSet when this message redeemed a custom reward
source_broadcaster_user_*string | nullPopulated for shared-chat messages

Redeem

A channel-point custom reward. Core fields are always present from EventSub; the optional settings populate when fetched from the Twitch REST API.

FieldTypeNotes
idstringTwitch custom-reward ID
titlestringReward title
costnumberPoint cost
promptstringDescription shown to viewers
is_enabledboolean?Settings (REST only)
background_colorstring?Hex
is_pausedboolean?
is_user_input_requiredboolean?
max_per_stream_settingobject?{ is_enabled, max_per_stream }
max_per_user_per_stream_settingobject?{ is_enabled, max_per_user_per_stream }
global_cooldown_settingobject?{ is_enabled, global_cooldown_seconds }
should_redemptions_skip_request_queueboolean?

Power-up

A custom Power-up — a viewer-funded Bits redemption configured in the Twitch dashboard. Streamerly reads these; Twitch's API doesn't expose create/edit/delete or a redemption queue, so unlike Redeem there's no fulfill/cancel flow.

FieldTypeNotes
idstringTwitch power-up ID
titlestringPower-up title
bitsnumberCost in Bits
promptstringDescription shown to viewers
redemptionIdstring?Set only on trigger payloads; absent on the data node
is_enabledboolean?Settings (data node only)
is_pausedboolean?
is_in_stockboolean?
is_user_input_requiredboolean?
background_colorstring?Hex
max_per_stream_settingobject?{ is_enabled, max_per_stream }
max_per_user_per_stream_settingobject?{ is_enabled, max_per_user_per_stream }
global_cooldown_settingobject?{ is_enabled, global_cooldown_seconds }

Alert Types

These types are created by Alert Builder nodes and consumed by Alert Activator nodes.

SubAlert

Subscription alert payload — { type: "sub", name, tier, months, message, voice?, extra?, assets, display_message?, tts_message? }.

GiftSub

Gifted subscription alert — { type: "gift-subs", name | null, recipient | null, tier, quantity, assets, display_message? }. name is null when the gift is anonymous; recipient is null for bulk announcements.

Cheer

Cheer/bits alert — { type: "cheer", name | null, bits, message, voice?, extra?, assets, display_message?, tts_message? }.

Custom

Custom alert — { type: "custom", name?, data: Record<string, unknown>, assets, display_message? }. Used for alerts you build yourself.

Chatbox Event Payload Types

Each Twitch chatbox event emits its full payload as a single typed object so downstream check nodes / Select Event Variant can branch on it. Field naming is camelCase (matches site convention; normalized from Twitch's snake_case at the backend boundary).

Subscription

New subscription (no message).

FieldTypeNotes
userIdnumber?Local user ID, when resolved
twitchUserIdstringTwitch user ID
usernamestring
tier1 | 2 | 3Mapped from Twitch's 1000/2000/3000
isGiftboolean

Resub

Resubscription with a message.

FieldTypeNotes
userIdnumber?
twitchUserIdstring
usernamestring
messagestringUser-written resub message
tier1 | 2 | 3
cumulativeMonthsnumber
streakMonthsnumber

Gift Sub

Gift sub batch (one or many subs at once).

FieldTypeNotes
gifterUserIdnumber?Absent when anonymous
gifterTwitchUserIdstring?Absent when anonymous
gifterUsernamestring"Anonymous" when isAnonymous is true
isAnonymousboolean
giftCountnumberNumber of subs in this batch
tier1 | 2 | 3
cumulativeTotalnumberLifetime gifts to this channel; 0 when anonymous

Raid

Incoming raid.

FieldTypeNotes
raiderUserIdnumber?
raiderTwitchUserIdstring
raiderUsernamestring
viewerCountnumber

Follow

New follower.

FieldTypeNotes
userIdnumber?
twitchUserIdstring
usernamestring

Channel Point Redeem

A custom-reward redemption event.

FieldTypeNotes
userIdnumber?
twitchUserIdstring
usernamestring
rewardIdstringTwitch reward UUID — used by redeem-id-equals checks
rewardTitlestring
rewardCostnumber
rewardPromptstring
userInputstringStreamer-provided text input; "" when the reward has no input

Dynamic Types

In addition to the built-in types above, the flow editor supports two dynamically-derived families:

Array Types

Any Array<T> is rendered as a lightened version of the inner type's color, and labeled T[].

string[] Lightened blue — a list of strings.
number[] Lightened purple — a list of numbers.
User[] Lightened orange — a list of users.

Arrays don't nest — there is no Array<Array<X>>.

Custom Types

Custom:Name types get a deterministic HSL color derived from a hash of the name, and are labeled with just Name. Two flows that both define a custom type called WheelEntry will render that handle in the same color, but pick a different name and you'll get a different hue.

Type Compatibility

When you draw an edge between two handles, the types have to be compatible:

  • A handle can connect to another handle of the same type.
  • Any output can connect to an input of type any.
  • A pulse output can connect to most inputs (it acts as a trigger signal).
  • Array<T> connects to Array<T> — arrays do not auto-unwrap.
  • Custom:Foo only connects to Custom:Foo.

The editor blocks incompatible connections and surfaces an inline error if the types don't match.

Where these come from

The canonical color and label registry is packages/frontend/src/flow/edges/edgeTypeUtils.ts (EDGE_TYPE_COLORS and EDGE_TYPE_LABELS). The data shapes live in:

  • packages/frontend/src/flow/types/data-structures.tsFlowUser, FlowMessage, FlowEvent, FlowRedeem
  • packages/shared/src/types/socket.tsChatbox*Payload interfaces
  • packages/frontend/src/types/Alerts.tsIAlertSub, IAlertGiftedSubs, IAlertCheer, IAlertCustom
  • packages/shared/src/flow/type-utils.ts — the DataType union and array/custom helpers

When you add a new built-in type, update the registry and this page.