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. Community 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​

You can define your own object types — a name plus a set of primitive fields (text, number, boolean, or color) — and use them anywhere edges carry data. Define them from the Custom Types page or the flow editor's New Type button; each type then gets its own Create and Break Apart nodes in the add-node menu, and every variable store (flow, overlay, streamer, and viewer variables) can hold single values or lists of them. See Custom Types for the full guide.

Custom:Name types get a deterministic HSL color derived from a hash of the name, and are labeled with just Name. Your WheelEntry type renders the same hue on every handle that carries it; pick a different name and you'll get a different hue. Lists of custom types (Array<Custom:Name>) follow the usual lightened-array convention.

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.ts — FlowUser, FlowMessage, FlowEvent, FlowRedeem
  • packages/shared/src/types/socket.ts — Chatbox*Payload interfaces
  • packages/frontend/src/types/Alerts.ts — IAlertSub, 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.