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
| Path | Type | Description |
|---|---|---|
source.now | string | ISO timestamp of the current timer run. |
source.timestampMs | number | Unix timestamp in milliseconds for the current timer run. |
EVM Event
| Path | Type | Description |
|---|---|---|
source.address | address | Contract address that emitted the event. |
source.blockNumber | number | Block number where the event was found. |
source.blockHash | string | Block hash where the event was found. |
source.transactionHash | string | Transaction hash that contained the event. |
source.transactionIndex | number | Transaction index inside the block. |
source.index | number | Event/log index inside the transaction or block. |
source.data | string | Raw encoded event data. |
source.topics | array<string> | Topics from EVM log. |
source.args | array | Decoded ABI arguments in positional order. If ABI is known, the wizard additionally suggests source.args[index] with argument names. |
EVM Call
| Path | Type | Description |
|---|---|---|
source.address | address | Contract address linked to the matched call. |
source.blockNumber | number | Block number where the call was found. |
source.blockHash | string | Block hash where the call was found. |
source.transactionHash | string | Transaction hash that contained the call. |
source.transactionIndex | number | Transaction index inside the block. |
source.index | number | Call/source item index. |
source.from | address | Caller address. |
source.to | address | Target contract address. |
source.data | string | Raw encoded calldata. |
source.args | array | Decoded ABI arguments in positional order. If ABI is known, the wizard additionally suggests source.args[index] with argument names. |
EVM Block
| Path | Type | Description |
|---|---|---|
source.number | number | Block number. |
source.hash | string | null | Block hash. |
source.timestamp | number | Block timestamp. |
source.transactionsCount | number | Number of transactions in the block. |
source.gasLimit | string | null | Block gas limit in raw units, if source provides it. |
source.gasUsed | string | null | Gas used by all block transactions, if source provides it. |
source.baseFeePerGas | string | null | Base fee per gas for the block, if source provides it. |
source.blobGasUsed | string | null | Blob gas used by the block, if source provides it. |
source.excessBlobGas | string | null | Excess blob gas of the block, if source provides it. |
EVM Transaction
| Path | Type | Description |
|---|---|---|
source.block.number | number | Block number where the transaction was included. |
source.block.hash | string | null | Block hash where the transaction was included. |
source.block.timestamp | number | Block timestamp. |
source.index | number | Transaction index inside the block. |
source.hash | string | Transaction hash. |
source.type | string | Normalized transaction type, for example legacy or eip1559. |
source.from | address | Sender address. |
source.to | address | null | Recipient address or null for contract creation. |
source.nonce | number | Transaction account nonce. |
source.gasLimit | string | Gas limit in raw units. |
source.gasPrice | string | Gas price in raw units. |
source.maxPriorityFeePerGas | string | null | EIP-1559 max priority fee, if available. |
source.maxFeePerGas | string | null | EIP-1559 max fee, if available. |
source.maxFeePerBlobGas | string | null | Blob gas fee, if available. |
source.input | string | Raw transaction input calldata. |
source.value | string | Native token amount in raw base units. |
source.methodId | string | null | First 4 bytes of calldata selector, if present. |
Substrate Event
| Path | Type | Description |
|---|---|---|
source.block.number | number | Block number where the event was found. |
source.block.hash | string | Block hash where the event was found. |
source.block.timestamp | number | Block timestamp in milliseconds. |
source.index | number | Event index inside the block. |
source.module | string | Pallet/module name. |
source.event | string | Event name inside pallet. |
source.type | string | null | Event phase type. |
source.extrinsic | number | null | Extrinsic index for ApplyExtrinsic events. |
source.data | array | Decoded event data in positional order. The wizard additionally suggests source.data[index] with argument names from metadata. |
Substrate Extrinsic
| Path | Type | Description |
|---|---|---|
source.block.number | number | Block number where the extrinsic was found. |
source.block.hash | string | Block hash where the extrinsic was found. |
source.block.timestamp | number | Block timestamp in milliseconds. |
source.index | number | Extrinsic index inside the block. |
source.module | string | Pallet/module name. |
source.call | string | Extrinsic method name. |
source.args | array | Decoded extrinsic arguments in positional order. The wizard additionally suggests source.args[index] with argument names from metadata. |
source.result | string | null | Execution result of the matched extrinsic. |
source.sender | address | null | Origin account that sent the extrinsic. |
source.signature | object | null | Extrinsic signature data. |
source.signature.nonce | number | Nonce from signature. |
source.signature.digest | string | Signature digest. |
source.path | string | Nested call path for the matched extrinsic. |
Substrate Block
| Path | Type | Description |
|---|---|---|
source.number | number | Block number. |
source.hash | string | Block hash. |
source.parentHash | string | Parent block hash. |
source.timestamp | number | Block timestamp in milliseconds. |
source.stateRoot | string | Block state root. |
source.extrinsicsRoot | string | Block 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 asproviders.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:
{
"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 rawand 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.
Links
Array of links.
Each row contains:
Title;Url;- delete button;
Add itemto 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.
format - formats raw integer amount using token decimals. For example, value 1000000000000000000 with decimals=18 becomes 1.
substr - returns part of a string. start defines start position; negative start counts from the end of the string; len limits length.
address - formats blockchain address for notification. If the address exists in workspace address book, returns alias; otherwise shortens known address to compact form.
make - recursively replaces addresses inside object, array, or string with values from address book where possible. Useful for displaying structures with several addresses.
includes - checks whether array contains the specified string value. Usually used inside if.
lowercase - converts string to lowercase.
uppercase - converts string to uppercase.
titlecase - converts string to Title Case.
oneline - replaces line breaks with spaces.
yaml - serializes object/array into YAML string.
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 resultorInvalid resultstatus;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.