Skip to main content

Using Event Data in Actions

Created 4 Mar 2026·Updated 31 Jul 2026

When an alert fires, TipLink has information about the event that triggered it, like the viewer's name, the donation amount, or the message they included. You can insert this information directly into your action text using a simple {{ }} syntax.

No coding needed. Just curly braces around a field name.


The Easy Way: The Placeholder Picker

You do not have to remember any field names.

Click the {{ }} button next to any text field in an action. This opens the Placeholder Picker, a searchable list of everything available for that alert. Click an entry and it is inserted at your cursor.

The picker groups entries by where they come from:

GroupWhat it holds
Platform → EventFields from the event that triggers this alert, such as the viewer's name and the tip amount. Only the platforms and events you selected are shown.
ViewerThe viewer's tracked points balance.
Rate LimitsHow long is left on a cooldown.
Global VariablesEvery variable you have created.
Other actionsResults produced by earlier actions on the same alert, such as the final PiShock intensity.
A few trigger sources are not listed yet

The picker does not currently cover DonationAlerts, Points Redemptions, OBS Studio, VRChat, Custom OSC, TipLink Countdowns or Webhooks. Their placeholders still work, you just have to type them in.

To find the field names, fire the event once and open it on the Activity page. Anything under metadata can be used as {{ fieldName }}.

The rest of this page explains the syntax, for when you would rather type it yourself.


How It Works

Anywhere you can type text in an action (overlay message, Discord message, chat message, etc.), you can use a placeholder to insert live event data.

Basic format:

{{ fieldName }}

Example - Overlay message:

{{ username }} just donated {{ value }}!

If username is "CoolViewer42" and value is 10, TipLink sends:

CoolViewer42 just donated 10!


Common Event Fields

These fields are available in most events. Exact availability depends on the platform and event type.

FieldWhat it containsExample output
{{ username }}The viewer's username or display nameCoolViewer42
{{ value }}The numeric value of the event (donation amount, sub count, bits)10
{{ message }}The message the viewer includedKeep it up!
{{ currency }}The currency of a donationUSD
{{ type }}The event typedonation
{{ platform }}The platform the event came fromtwitch
Finding all available fields

Open the Activity page, find an event, and click the magnifying glass icon to view its full details. All fields listed under metadata can be used in the format {{ fieldName }}.

For example, if you see metadata.id, you can access it with {{ id }}.


Always-Available Placeholders

These work on every alert, whatever platform triggered it.

Viewer points

PlaceholderWhat it contains
{{ user_points }}The points balance of the viewer who triggered the alert. Empty if that viewer is not tracked yet.
{{ user_points | "0" }}The same, but shows 0 instead of nothing for untracked viewers.

This is all you need to build a !points command. Create an alert on Chat Message, filter for !points, then add your platform's chat message action with:

@{{ username }} you have {{ user_points | "0" }} points

Global variables

Any variable you have created is available as {{ var.name }}:

Deaths today: {{ var.death_count }}

Variable names are case-sensitive, and any character that is not a letter, number or underscore becomes an underscore.

Cooldown information

Useful for telling a viewer how long is left when an alert is on cooldown.

PlaceholderExample output
{{ rate_limit.remaining_seconds }}150
{{ rate_limit.remaining_seconds | auto }}2 minutes 30 seconds
{{ rate_limit.remaining_seconds | secs }}150 seconds
{{ rate_limit.remaining_seconds | mins }}3 minutes
{{ rate_limit.remaining_seconds | hrs }}1 hour
{{ rate_limit.is_rate_limited }}true
{{ rate_limit.cooldown_type }}Which cooldown was hit

The mins and hrs options always round up, so a partial minute reads as a whole one.


Fallback Values

If a field doesn't exist in the event data, TipLink will output nothing (an empty string) by default.

To show a different value when a field is missing, add a fallback using |:

{{ username | "Anonymous" }}
  • If username exists: shows the actual username.
  • If username is missing: shows Anonymous.

Examples:

{{ message | "No message provided" }}
{{ currency | "USD" }}
{{ value | 0 }}

Nested Fields

If the field you want is nested (e.g. metadata.profilePicture), TipLink automatically flattens event data so you can access it directly.

Example: To access root.data.metadata.id, you write {{ id }}.


Using Action Output Data

You can also use the result of one action in another action on the same alert. This is useful for showing calculated values, like the final shock intensity.

Format:

{{ actionType.operationKey.fieldName }}

Examples:

{{ pishock.main_op.intensity }}     ← PiShock intensity %
{{ pishock.main_op.duration }} ← PiShock duration (seconds)

To see what fields an action exposes, look at the action's documentation page, or open the Placeholder Picker on a later action in the same alert.

Actions must run in order

This only works when actions run one after another. If the alert has Execute All Actions At Once turned on, a later action cannot read an earlier one's result, because they all start at the same time. Turn that toggle off if one action needs to feed another.


Practical Examples

Show the donor name and amount

{{ username }} donated {{ value }} {{ currency }}! Thank you!

With a fallback for anonymous donations

{{ username | "Someone" }} tipped {{ value | "an amount" }}. Thank you!

Discord webhook message

**{{ username }}** donated **${{ value }}**
Message: {{ message | "*(no message)*" }}

Variable-based death counter in overlay

Deaths today: {{ var.death_count }}

Math Transforms

Numeric placeholder values support inline mathematical operations using the pipe (|) syntax. This lets you convert raw event values into the units you actually want - for example, converting bits to dollars, or formatting a value to two decimal places.

Place the operation after the field name, separated by a pipe:

{{ fieldName | operator }}

Available operators:

OperatorWhat it does
* NMultiply by N
/ NDivide by N
+ NAdd N
- NSubtract N
toFixed:NRound to N decimal places

Examples:

{{ value | * 100 }}
{{ tokens | / 100 }}
{{ amount | + 5 }}
{{ amount | - 3 }}
{{ amount | toFixed:2 }}

Chaining Transforms

You can chain multiple transforms together. They apply left to right:

{{ bits | * 0.01 | toFixed:2 }}

If bits is 1337, the result is 13.37.

{{ tokens | / 100 | toFixed:2 }}

If tokens is 999, the result is 9.99.

{{ amount | * 2 | + 1 }}

If amount is 5, the result is 11.

Chaining with a Fallback

A fallback string can be placed at the end of a transform chain:

{{ value | * 0.01 | toFixed:2 | "0.00" }}

If value is missing, shows 0.00. If present, the math transforms apply first.

Safety Notes

  • If the value is not a number, the math transforms are skipped and the original value passes through unchanged.
  • Division by zero returns the original value unchanged.

Tips

  • Template variables work in all text fields across all action types - overlay messages, Discord messages, chat messages, HTTP request bodies, and more.
  • Field names are case-sensitive. username and Username are different.
  • You can mix static text and template variables freely in the same field.
  • If you see a blank output when testing, check the event's detail view (Activity → magnifying glass) to confirm the field name and spelling.