Skip to content

Add Trigger / Edit Trigger

Add trigger opens the detailed trigger creation wizard. This wizard defines the full event lifecycle: from reading source item to final notification defaults.

Editing an existing trigger uses the same wizard, but with already filled values.

If you need to quickly create many similar triggers from ABI or metadata, use Import triggers. It is a simplified bulk scenario built on top of the general trigger creation idea.

Step 1. Description

At this step, trigger receives a clear name and a short explanation of what it does. This helps later quickly recognize the trigger in the project, templates, subscriptions, and other places where the correct scenario needs to be selected or checked.

Title

Required visible trigger name. It is shown in the interface wherever the user selects, views, or checks trigger, so it is better to keep it short and clear.

ID

System trigger slug inside the project. It is generated automatically from the title and shown in the form as a disabled field, so the user can see the future identifier but cannot change it manually.

Description

Optional trigger description. It is worth enabling when title alone does not make it obvious which event is tracked, which data is used, or in which scenario this trigger is needed.

Category

Required trigger category. It helps group triggers in tables, templates, and rules so large projects remain understandable and easy to search.

Step 2. Source

At this step, you choose what starts the trigger: a regular timer or an event from a blockchain data source. The selected type determines the set of following panels.

Trigger Type

Required selection of the base trigger type.

timer is used for regular interval-based activations. blockchain is used for events, extrinsics, calls, blocks, or transactions from Data sources.

Timer

Interval

Required interval with which the timer trigger should activate.

Interval format: number and time unit, for example:

  • 30s;
  • 5m;
  • 1h;
  • 1d.

Blockchain

Source

Required data source selection from which trigger will read blockchain/runtime data.

The list shows project sources that are available. If there is no suitable source, you can go to Add new source.

The selected source determines the next configuration branch: EVM or Substrate.

Blockchain - EVM

Source Item

Required selection of the data type that trigger receives from EVM source: event, call, block, or transaction.

For event and call, the wizard additionally configures ABI and signature. For block and transaction, ABI and signature are not required.

ABI Contract Address

Contract address by which the wizard tries to load ABI and suggest available events or calls.

If Use as trigger filter is enabled, trigger will activate only for this contract address. If the switch is disabled, the address is used only to load ABI, and the trigger itself can match any contract with the selected signature.

Event Signature / Call Signature

Required signature of the event or method that should start the trigger.

If ABI is loaded successfully, signature can be selected from the list. If ABI is not found, the contract is dynamic, or the required signature is missing from the list, the value can be entered manually.

Blockchain - Substrate

Source Item

Required selection of Substrate item type: event, call/extrinsic, or block.

For event and call, the wizard additionally suggests selecting pallet and concrete entry. For block, pallet and event/extrinsic are not required.

Pallet

Required pallet from runtime metadata of the selected Substrate source.

The list is loaded from metadata source. It is available only for event and call/extrinsic selection modes.

Event / Extrinsic

Required entry inside the selected pallet.

For event, a pallet event is selected. For call/extrinsic, an extrinsic is selected. The wizard shows runtime version so it is clear which metadata provided the available options.

Source Payload

The selected source item defines the source.* structure that will be available later in the wizard: in inputs/templates, providers, activation condition, filters, data transform, and defaults.

Timer

PathTypeDescription
source.nowstringISO timestamp of the current timer run.
source.timestampMsnumberUnix timestamp in milliseconds for the current timer run.

EVM Event

PathTypeDescription
source.addressaddressContract address that emitted the event.
source.blockNumbernumberBlock number where the event was found.
source.blockHashstringBlock hash where the event was found.
source.transactionHashstringTransaction hash that contained the event.
source.transactionIndexnumberTransaction index inside the block.
source.indexnumberEvent/log index inside the transaction or block.
source.datastringRaw encoded event data.
source.topicsarray<string>Topics from EVM log.
source.argsarrayDecoded ABI arguments in positional order. If ABI is known, the wizard additionally suggests source.args[index] with argument names.

EVM Call

PathTypeDescription
source.addressaddressContract address linked to the matched call.
source.blockNumbernumberBlock number where the call was found.
source.blockHashstringBlock hash where the call was found.
source.transactionHashstringTransaction hash that contained the call.
source.transactionIndexnumberTransaction index inside the block.
source.indexnumberCall/source item index.
source.fromaddressCaller address.
source.toaddressTarget contract address.
source.datastringRaw encoded calldata.
source.argsarrayDecoded ABI arguments in positional order. If ABI is known, the wizard additionally suggests source.args[index] with argument names.

EVM Block

PathTypeDescription
source.numbernumberBlock number.
source.hashstring | nullBlock hash.
source.timestampnumberBlock timestamp.
source.transactionsCountnumberNumber of transactions in the block.
source.gasLimitstring | nullBlock gas limit in raw units, if source provides it.
source.gasUsedstring | nullGas used by all block transactions, if source provides it.
source.baseFeePerGasstring | nullBase fee per gas for the block, if source provides it.
source.blobGasUsedstring | nullBlob gas used by the block, if source provides it.
source.excessBlobGasstring | nullExcess blob gas of the block, if source provides it.

EVM Transaction

PathTypeDescription
source.block.numbernumberBlock number where the transaction was included.
source.block.hashstring | nullBlock hash where the transaction was included.
source.block.timestampnumberBlock timestamp.
source.indexnumberTransaction index inside the block.
source.hashstringTransaction hash.
source.typestringNormalized transaction type, for example legacy or eip1559.
source.fromaddressSender address.
source.toaddress | nullRecipient address or null for contract creation.
source.noncenumberTransaction account nonce.
source.gasLimitstringGas limit in raw units.
source.gasPricestringGas price in raw units.
source.maxPriorityFeePerGasstring | nullEIP-1559 max priority fee, if available.
source.maxFeePerGasstring | nullEIP-1559 max fee, if available.
source.maxFeePerBlobGasstring | nullBlob gas fee, if available.
source.inputstringRaw transaction input calldata.
source.valuestringNative token amount in raw base units.
source.methodIdstring | nullFirst 4 bytes of calldata selector, if present.

Substrate Event

PathTypeDescription
source.block.numbernumberBlock number where the event was found.
source.block.hashstringBlock hash where the event was found.
source.block.timestampnumberBlock timestamp in milliseconds.
source.indexnumberEvent index inside the block.
source.modulestringPallet/module name.
source.eventstringEvent name inside pallet.
source.typestring | nullEvent phase type.
source.extrinsicnumber | nullExtrinsic index for ApplyExtrinsic events.
source.dataarrayDecoded event data in positional order. The wizard additionally suggests source.data[index] with argument names from metadata.

Substrate Extrinsic

PathTypeDescription
source.block.numbernumberBlock number where the extrinsic was found.
source.block.hashstringBlock hash where the extrinsic was found.
source.block.timestampnumberBlock timestamp in milliseconds.
source.indexnumberExtrinsic index inside the block.
source.modulestringPallet/module name.
source.callstringExtrinsic method name.
source.argsarrayDecoded extrinsic arguments in positional order. The wizard additionally suggests source.args[index] with argument names from metadata.
source.resultstring | nullExecution result of the matched extrinsic.
source.senderaddress | nullOrigin account that sent the extrinsic.
source.signatureobject | nullExtrinsic signature data.
source.signature.noncenumberNonce from signature.
source.signature.digeststringSignature digest.
source.pathstringNested call path for the matched extrinsic.

Substrate Block

PathTypeDescription
source.numbernumberBlock number.
source.hashstringBlock hash.
source.parentHashstringParent block hash.
source.timestampnumberBlock timestamp in milliseconds.
source.stateRootstringBlock state root.
source.extrinsicsRootstringBlock extrinsics root.

Step 3. Inputs Schema

Inputs schema describes parameters that the user provides when creating a subscription.

Inputs are similar to filters, so they are easy to confuse. The key difference: inputs are required and define base data without which the subscription cannot work. Filters are optional and are used for additional personalization after required inputs are filled.

The editor supports two modes:

  • UI mode - fields are added through the visual Schema editor;
  • JSON mode - schema is edited as JSON.

Schema Editor

Schema editor is used in several wizard steps. In Inputs schema, it describes fields that the user fills when creating a subscription; in Filters schema and Output schema, the same editing principle is used.

In UI mode, schema consists of properties. Each property can be expanded, collapsed, deleted, and configured through a set of panels.

Property

Name - technical field name inside schema. It is used in paths, templates, and JavaScript code, so it should be short, stable, and clear. For object properties, name becomes the object key. For array item, name is not used because array describes one common item type.

Type - value type. The selected type determines which additional panels appear below.

Source path - optional link to the original source.* path. It is needed when the schema field is named differently from the source item field, but engine should understand which source value to use for early filtering. Most often Source path is needed in filters, sometimes it can be useful in inputs, but it is not used in output schema.

Property Types

string - string value.

number - numeric value.

boolean - boolean value true/false.

null - explicit empty value.

address - blockchain address. It requires selecting Address type: EVM or SS58 (Substrate). For SS58 address, SS58 prefix can be specified so the interface and downstream logic know the address format.

object - object with nested properties. After selecting this type, the Properties panel appears and uses the same schema editor inside.

array - array of items of one type. After selecting this type, the nested Item editor appears, where the type of each array element is defined.

tuple - array with a fixed set of positions. After selecting this type, the Items panel appears, where each position is described separately.

balance and currency can appear in imported Substrate schemas as additional hints from the metadata layer. For manual schema description, it is usually easier to think about the actual value type: amount can be string or number, asset/currency id can also be string or number. The schema itself does not have to decide how to format the value for notification: raw data comes from source, and the trigger owner performs the needed transformation in transform or providers.

enum - set of variants, where each variant has a name and its own type. This type is available in output schema, but disabled for trigger inputs and filters. Inputs and filters need to define a concrete value by which subscription can compare or filter source item; enum variants are too ambiguous for this scenario.

lookup - reference to a type from Substrate metadata. It requires selecting Lookup ref. This type is useful when you need to preserve a relation to runtime type rather than describe the structure manually.

Step 4. Data Providers

Data providers is an optional step. Providers run from top to bottom and let you enrich source item with external or runtime data before transform.

In templates and provider fields, you can use:

  • {{source.*}} - data of the source event;
  • {{inputs.*}} - subscription values;
  • {{providers.providerId.*}} - result of previous providers.

Each provider has weight. When trigger is saved, the service calculates the total weight of all providers and checks it against the trigger limit. Limits are described in detail in Limits.

Common fields of each provider:

  • Type - provider type;
  • ID - name by which the result is available as providers.ID;
  • provider test button;
  • provider delete button.

All providers use a 10 second timeout.

Available provider types:

  • HTTP;
  • GraphQL;
  • RPC;
  • Chain State;
  • Value history;
  • JavaScript.

HTTP

Weight: 2.

Method

HTTP method. Currently selected from supported methods.

URL

Endpoint to which provider sends HTTP request.

Headers

Key-value list of headers. Values support template substitutions.

Query Params

Key-value list of query parameters. Values support template substitutions.

Body

Optional JSON/template body for POST request. Body supports template substitutions.

GraphQL

Weight: 2.

Endpoint

GraphQL endpoint URL.

Headers

Key-value headers. Values support template substitutions.

Variables

Key-value variables for GraphQL query. Values support template substitutions.

Query

GraphQL query document.

Chain State

Chain State reads state data from blockchain source and adds the result to provider output.

Weight: 1.

State Type

Read type: EVM contract or Substrate storage.

EVM Contract

Source

EVM source. By default, trigger source is used.

Target Contract

Contract address for the actual read-call. Supports template, for example {{ source.address }}.

ABI Contract Address

Contract address whose ABI should be used to load methods. Needed when target contract is dynamic.

Read Method

Read method selection mode: Auto or Manual.

In Auto, the wizard loads view/pure methods from ABI and suggests selecting a method. In Manual, signature and ABI fragment can be inserted manually; args and output schema are synchronized from ABI fragment.

Method Arguments

Argument fields appear if the selected method accepts args.

Substrate Storage

Source

Substrate source. By default, trigger source is used.

Module

Pallet/module.

Storage Entry

Storage item inside module.

If storage entry has args, the wizard creates a separate panel for each arg. Optional args can be enabled and disabled with the Optional switch.

Storage Arguments

Argument fields of the selected storage entry.

Block

Optional block number/hash/template.

Value History

Value history stores a window of recent values and calculates aggregates.

Weight: 1.

Partition By

Optional key that splits history into independent windows. For example, if {{ source.address }} is specified, provider stores a separate value history for each address instead of one shared history for all source items.

Dedupe By

Required unique id of the current item so the same event is not counted twice.

Keep Last

Window size.

Value Type

Type of value in the window.

Value

Value added to history. You can specify a simple template string, for example {{ source.amount }}, or a JSON value: object, array, string, number, boolean/null.

Template substitutions can be used inside JSON values. For example, object can combine several source item fields into one value:

json
{
  "account": "{{ source.account }}",
  "amount": "{{ source.amount }}",
  "asset": "{{ source.asset }}"
}

If Value type is selected as number, the final value must be convertible to a number; for object/array, usually select the corresponding Value type.

Aggregates

Additional aggregates for numeric values.

RPC

Weight: 1 if source runtime transport is used. Weight: 2 if direct endpoint transport is used.

Transport

How to send RPC request: through source runtime or through direct endpoint.

If transport goes through source runtime, direct endpoint is not needed.

Method

RPC method name.

Endpoint

URL, if endpoint transport is selected.

Headers

JSON object headers for endpoint transport.

Params

JSON array params.

Custom Body

Optional full JSON-RPC body for endpoint transport.

JavaScript

Weight: 2.

Variables

Key-value variables for the function.

Source

JavaScript function source.

JavaScript provider is used when an additional value is easier to calculate with code based on source, inputs, and previous providers.

Test Provider

Provider has a Test Provider dialog.

In it, fill only the template values that provider really uses. Values of previous providers can be passed manually through providers.* paths. If provider does not contain template references, the test can be run immediately.

Step 5. Activation Condition

Activation condition is an optional JavaScript condition.

It is enabled with the Optional switch. If the condition is disabled, it returns true by default: trigger is considered active for all source items that passed source matching.

If the condition is enabled, code must return a value by which engine decides whether to activate further processing. This is useful for logic that cannot be expressed only with filters schema or template rules.

For example, a custom trigger can be based on a source event that technically catches a broad set of events. The source can provide the needed data, but cannot fully describe the business logic of activation: several fields need to be checked, values compared, provider result considered, or some events skipped by an additional rule. In such case, source matching remains broad, and Activation condition describes the final condition under which the trigger should actually activate.

Step 6. Filters Schema

Filters schema describes fields by which subscriptions can filter trigger output.

Filters are similar to inputs, but used differently. The user can leave filters empty if the base subscription scenario is enough. If more precise personalization is needed, filters allow narrowing or refining activation conditions.

The editor supports:

  • UI mode;
  • JSON mode;
  • Add property;
  • the same schema editor as in Inputs schema.

Source path is needed when the output field is named differently from the original source item field. Engine applies filters in two stages: early pre-filter by source data and then conditions by formed output. If names differ, specify the path to the original field here.

Step 7. Output Schema

Output schema consists of two panels:

  • Raw output;
  • Human output.

Raw output describes the machine result of trigger transform. These fields are used in rules, filters, templates, and downstream logic.

Human output describes the human-readable result for notifications. It can be:

  • left as Use same as raw;
  • switched off from Use same as raw and configured with a custom schema.

Schema editor supports UI mode and JSON mode.

For Raw output and Human output, the same schema editor as in Inputs schema is used, but without Source path: output schema describes the already formed trigger result, not matching by original source item. Unlike inputs and filters, output schema can use enum.

Step 8. Transform

This step contains two JavaScript panels:

  • Raw transform;
  • Human transform.

Raw transform receives source, inputs, and providers, and returns an object matching Raw output.

Human transform receives source, inputs, providers, and raw output, and returns an object matching Human output.

The editor suggests available context and shows validation error if JavaScript is invalid.

Step 9. Defaults

Defaults defines recommended default notification templates. This is advice from the trigger creator to the user who will create a subscription: how to title the notification, which data to show in short and long text, which icon, cover, or links to use.

These values are not required. When creating a subscription, the user can keep defaults as is or fully override notification appearance and text for their scenario.

All panels are optional and enabled with separate switches.

Title

Notification title.

Short

Short markdown text.

Long

Long markdown text.

Icon

Icon URL.

Cover

Cover URL.

Avatar

Notification avatar URL. By default, the same URL as in Icon is used.

Array of links.

Each row contains:

  • Title;
  • Url;
  • delete button;
  • Add item to add a link.

On save, each link must have both title and URL.

Fields use autocomplete and Handlebars/template helpers. Defaults are rendered from trigger output, so source, inputs, or providers context is not used here.

Autocomplete suggests:

  • block - block number, if it exists in output;
  • index - item/event index, if it exists in output;
  • hash - transaction/block hash, if it exists in output;
  • meta - trigger metadata: description, name, kind, scope;
  • raw.* - raw output fields;
  • human.* - human output fields.

Handlebars Helpers

Defaults use Handlebars syntax: {{human.amount}}, {{#if human.amount}}...{{/if}}, {{round human.price digits=2}}. General rules for expressions, blocks, paths, and sub-expressions are described in the official Handlebars documentation: Built-in Helpers.

Built-in Helpers

if - conditional block. Renders content if value is not falsy.

unless - reverse if. Renders content if value is falsy.

each - iterates over array/object. Inside the block, you can use this, and Handlebars service values like @index for array and @key for object.

with - changes current context inside the block. Useful when you need to reference the same nested object several times.

lookup - dynamically takes value by key. Useful when field name or index is stored in another variable.

Web3alert Helpers

round - rounds a number or numeric string. The digits parameter defines number of decimal places; fixed=true returns a string with a fixed number of decimal places.

handlebars
{{round human.price digits=2}}
{{round human.price digits=2 fixed=true}}

format - formats raw integer amount using token decimals. For example, value 1000000000000000000 with decimals=18 becomes 1.

handlebars
{{format raw.value decimals=18}}

substr - returns part of a string. start defines start position; negative start counts from the end of the string; len limits length.

handlebars
{{substr hash start=0 len=10}}
{{substr hash start=-8}}

address - formats blockchain address for notification. If the address exists in workspace address book, returns alias; otherwise shortens known address to compact form.

handlebars
{{address raw.from}}

make - recursively replaces addresses inside object, array, or string with values from address book where possible. Useful for displaying structures with several addresses.

handlebars
{{yaml (make raw.participants)}}

includes - checks whether array contains the specified string value. Usually used inside if.

handlebars
{{#if (includes raw.tags "whale")}}Whale transfer{{/if}}

lowercase - converts string to lowercase.

handlebars
{{lowercase meta.name}}

uppercase - converts string to uppercase.

handlebars
{{uppercase meta.scope}}

titlecase - converts string to Title Case.

handlebars
{{titlecase meta.name}}

oneline - replaces line breaks with spaces.

handlebars
{{oneline human.summary}}

yaml - serializes object/array into YAML string.

handlebars
{{yaml human}}

Step 10. Test & Save

The last step lets you check trigger before saving.

If trigger has inputs schema, test inputs fields are shown first.

For blockchain trigger, specify:

  • Block - block number for simulation;
  • Item index - optional item index, if several matching events were found in the block.

For timer trigger, current timestamp is used.

After test run, the interface shows:

  • Valid result or Invalid result status;
  • Source items on block;
  • list of issues, if result is invalid;
  • Source input;
  • Trigger output;
  • Debug.

After a successful check or conscious skip of the check, trigger can be saved. Test run availability can depend on pricing plan/account tier.