Workflow Nodes Reference

This page documents every node available in the Vesbite workflow editor. Nodes are organized into four categories: Triggers (start a workflow), Core Actions (general-purpose logic), Device Actions (interact with devices), and Integration Actions (connect to external services).

Every node produces an output accessible via expressions: {{ output("activityId").property }}.

Here’s an interactive example combining several node types – click Run to see how execution flows through the graph:


Triggers

Triggers determine when and how a workflow starts. Each workflow has exactly one trigger.

Manual Trigger

Starts the workflow on demand via the UI or API.

Category: Core URI: vesbite://triggers/core/manual

Inputs: None.

Outputs:

FieldTypeDescription
triggeredAtstringISO 8601 timestamp of when the trigger fired
triggerTypestringAlways "manual"

When to use: Testing workflows during development, on-demand operations that a user initiates manually, or one-off tasks.


Timer Trigger

Starts the workflow on a recurring interval.

Category: Core URI: vesbite://triggers/core/timer

Inputs:

InputTypeRequiredDefaultDescription
Interval (seconds)numberYes60Seconds between each trigger fire

Outputs:

FieldTypeDescription
triggeredAtstringISO 8601 timestamp
triggerTypestringAlways "timer"
intervalSecondsnumberThe configured interval

When to use: Periodic polling, recurring checks, or any operation that should repeat at a fixed interval. Minimum resolution is 1 second.


Scheduled (Cron) Trigger

Starts the workflow on a cron schedule. Evaluates at each minute boundary.

Category: Core URI: vesbite://triggers/core/cron

Inputs:

InputTypeRequiredDefaultDescription
Cron ExpressionstringYes0 * * * *Standard 5-field cron expression

Cron expression format:

 +------------ minute (0-59)
 | +---------- hour (0-23)
 | | +-------- day of month (1-31)
 | | | +------ month (1-12)
 | | | | +---- day of week (0-6, Sunday=0)
 | | | | |
 * * * * *

Supported syntax:

SyntaxMeaningExample
*Every value* * * * * (every minute)
*/nEvery n-th value*/5 * * * * (every 5 minutes)
nSpecific value0 9 * * * (at 9:00 AM)
a,b,cList of values0 9,12,17 * * * (at 9 AM, noon, 5 PM)
a-bRange of values0 9 * * 1-5 (9 AM, weekdays only)

Common examples:

ExpressionSchedule
*/5 * * * *Every 5 minutes
0 * * * *Every hour, on the hour
0 9 * * *Daily at 9:00 AM UTC
0 9 * * 1-5Weekdays at 9:00 AM UTC
0 0 1 * *First day of every month at midnight
30 8 * * 1Every Monday at 8:30 AM UTC

Outputs:

FieldTypeDescription
triggeredAtstringISO 8601 timestamp (rounded to the minute)
triggerTypestringAlways "cron"
cronExpressionstringThe evaluated cron expression

When to use: Scheduled reports, daily data syncs, maintenance tasks, or any operation tied to clock time.


Device Event Trigger

Starts the workflow when a device emits a specific event type.

Category: Devices URI: vesbite://triggers/devices/{definitionId}/{eventName}

Each device definition generates its own Device Event trigger nodes in the workflow editor – one per event type defined in the device schema.

Inputs:

InputTypeRequiredDescription
DevicedropdownNoSpecific device to listen to. Leave empty for any device of this type.

Outputs:

The output fields match the event’s payload schema. For example, a tagread event trigger outputs:

FieldTypeDescription
epcstringTag EPC
tidstringTag ID
rssinumberSignal strength
antennanumberAntenna port
(additional fields)As defined in the event’s payload schema

How event data is accessed:

{{ output("triggerActivityId").epc }}
{{ output("triggerActivityId").rssi }}

The trigger unwraps the device event payload so fields are available directly on the output object.

When to use: Reacting to device data in real time – logging tag reads to a database, sending alerts on GPIO changes, triggering business logic when a sensor reports a value.


Core Actions

General-purpose nodes for workflow logic.

Set Variable

Stores a value in the workflow context for use by later nodes.

Category: Core URI: vesbite://actions/core/set-variable

Inputs:

InputTypeRequiredDescription
Variable NamestringYesName of the variable to set
ValueexpressionYesThe value to assign (supports Vex expressions)

Outputs:

FieldTypeDescription
variableNamestringThe name that was set
valueanyThe value that was stored

Example use case: Store an intermediate computation result, then reference it in multiple downstream nodes with {{ variables.myVar }}.


Log Message

Writes a message to the workflow execution log for debugging.

Category: Core URI: vesbite://actions/core/log

Inputs:

InputTypeRequiredDefaultDescription
MessagestringYesThe message to log (supports expressions)
Log LeveldropdownNoInformationSeverity: Trace, Debug, Information, Warning, Error, Critical

Outputs:

FieldTypeDescription
messagestringThe rendered message
levelstringThe log level used
timestampstringISO 8601 timestamp

Example use case: Log the EPC of each tag read during development: Tag read: {{ output("trigger").epc }}.


Delay

Pauses workflow execution for a specified duration. The workflow is suspended and resumed after the delay.

Category: Core URI: vesbite://actions/core/delay

Inputs:

InputTypeRequiredDefaultDescription
Duration (seconds)numberYes20Number of seconds to pause

Outputs:

FieldTypeDescription
startedAtstringISO 8601 timestamp when the delay started
completedAtstringISO 8601 timestamp when the delay ended
durationSecondsnumberActual elapsed seconds

Example use case: Wait 5 seconds after starting a reader before checking for tag reads, or add a cooldown between retries.


HTTP Request

Makes an HTTP request to an external URL and returns the response.

Category: Core URI: vesbite://actions/core/http-request

Inputs:

InputTypeRequiredDefaultDescription
URLstringYesTarget URL (supports expressions)
MethoddropdownNoGETHTTP method: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS
Bodycode (JSON)NoRequest body for POST/PUT/PATCH

Outputs:

FieldTypeDescription
bodystringResponse body as text
statusCodenumberHTTP status code (e.g., 200, 404)
isSuccessbooleantrue if status code is 2xx

Example use case: POST tag read data to an external webhook:

  • URL: https://api.example.com/tags
  • Method: POST
  • Body: { "epc": "{{ output("trigger").epc }}" }

Branch

Routes workflow execution down one of two paths based on a boolean condition.

Category: Core URI: vesbite://actions/core/branchHandles: True, False

Inputs:

InputTypeRequiredDescription
Conditionboolean/variableYesThe condition to evaluate

Outputs:

FieldTypeDescription
resultbooleanThe evaluated condition value
branchstring"True" or "False"

The Branch node has two output handles. Connect downstream nodes to the True handle for when the condition is truthy, and the False handle for when it is falsy.

Example use case: Check if a tag’s RSSI is above a threshold, then take different actions for strong vs. weak reads.


Device Actions

Nodes that interact with physical devices. These nodes are dynamically generated from device definitions.

Invoke Device Action

Sends a command to a device and returns the result.

Category: Devices URI: vesbite://actions/devices/{definitionId}/{actionName}

Each device definition generates Invoke Device Action nodes for every action in its schema. They appear in the workflow editor grouped under the device type.

Inputs:

InputTypeRequiredDescription
DevicedropdownYesThe specific device to invoke the action on
Parameterscode (JSON)NoAction parameters as a JSON object (supports expressions)

Outputs:

FieldTypeDescription
successbooleanWhether the action succeeded
deviceIdstringThe target device ID
payloadstringJSON string of the device’s response data

Example use case: Start reading on an RFID reader, then process the response to confirm the session began.


Update Device Settings

Pushes new settings values to a device.

Category: Devices URI: vesbite://actions/devices/{definitionId}/update-settings

Inputs:

InputTypeRequiredDescription
DevicedropdownYesThe device to update
Settingscode (JSON)YesJSON object of settings to apply

Outputs:

FieldTypeDescription
successbooleanWhether the settings update succeeded
messagestringSuccess or error message
deviceIdstringThe target device ID

Example use case: Dynamically adjust reader transmit power based on the time of day or tag population estimates.


Integration Actions

Airtable

Requires an Airtable connection. All Airtable nodes share the Connection and Base ID inputs.

List Bases

Lists all Airtable bases the authenticated user can access.

URI: vesbite://actions/integrations/airtable/list-bases

Inputs:

InputTypeRequiredDescription
ConnectionconnectionYesAirtable OAuth connection
OffsetstringNoPagination offset

Outputs: Airtable API response containing bases array with id, name, and permissionLevel for each base.


Get Base Schema

Returns the schema (tables and fields) for a base.

URI: vesbite://actions/integrations/airtable/get-base-schema

Inputs:

InputTypeRequiredDescription
ConnectionconnectionYesAirtable OAuth connection
Base IDdropdownYesThe base to inspect

Outputs: Airtable API response containing tables array with field definitions.


List Records

Retrieves records from a table with optional filtering and pagination.

URI: vesbite://actions/integrations/airtable/list-records

Inputs:

InputTypeRequiredDescription
ConnectionconnectionYesAirtable OAuth connection
Base IDdropdownYesTarget base
TabledropdownYesTarget table
FieldschecklistNoSpecific fields to return (empty = all)
Filter FormulastringNoAirtable formula (e.g., {Status} = 'Active')
Max RecordsnumberNoMaximum records to return
Page SizenumberNoRecords per page (max 100). Default: 100
OffsetstringNoPagination offset from a previous response
ViewstringNoView ID or name to filter by

Outputs: Airtable API response with records array and optional offset for pagination.


Get Record

Retrieves a single record by ID.

URI: vesbite://actions/integrations/airtable/get-record

Inputs:

InputTypeRequiredDescription
ConnectionconnectionYesAirtable OAuth connection
Base IDdropdownYesTarget base
TabledropdownYesTarget table
Record IDstringYesRecord ID (e.g., recXXXXXXXXXXXXXX)

Outputs: Single record object with id, fields, and createdTime.


Create Record

Creates a single record in a table.

URI: vesbite://actions/integrations/airtable/create-record

Inputs:

InputTypeRequiredDescription
ConnectionconnectionYesAirtable OAuth connection
Base IDdropdownYesTarget base
TabledropdownYesTarget table
Fieldscode (JSON)YesRecord fields as JSON object
TypecastbooleanNoConvert string values to field types. Default: false

Outputs: The created record object with id, fields, and createdTime.

Example use case: Log each RFID tag read to an Airtable table:

{ "EPC": "{{ output('trigger').epc }}", "Antenna": "{{ output('trigger').antenna }}", "Timestamp": "{{ output('trigger').timestamp }}" }

Update Record

Updates a single record.

URI: vesbite://actions/integrations/airtable/update-record

Inputs:

InputTypeRequiredDescription
ConnectionconnectionYesAirtable OAuth connection
Base IDdropdownYesTarget base
TabledropdownYesTarget table
Record IDstringYesRecord to update
Fieldscode (JSON)YesFields to update
TypecastbooleanNoConvert string values to field types

Outputs: The updated record object.


Delete Record

Deletes a single record.

URI: vesbite://actions/integrations/airtable/delete-record

Inputs:

InputTypeRequiredDescription
ConnectionconnectionYesAirtable OAuth connection
Base IDdropdownYesTarget base
TabledropdownYesTarget table
Record IDstringYesRecord to delete

Outputs: Confirmation with id and deleted: true.


Create Records (Batch)

Creates multiple records in a single API call (max 10 per request).

URI: vesbite://actions/integrations/airtable/create-records

Inputs:

InputTypeRequiredDescription
ConnectionconnectionYesAirtable OAuth connection
Base IDdropdownYesTarget base
TabledropdownYesTarget table
Recordscode (JSON)YesArray of { fields: {...} } objects
TypecastbooleanNoConvert string values to field types

Outputs: Array of created records.


Update Records (Batch)

Updates multiple records in a single API call.

URI: vesbite://actions/integrations/airtable/update-records

Inputs:

InputTypeRequiredDescription
ConnectionconnectionYesAirtable OAuth connection
Base IDdropdownYesTarget base
TabledropdownYesTarget table
Recordscode (JSON)YesArray of { id, fields: {...} } objects
TypecastbooleanNoConvert string values to field types

Outputs: Array of updated records.


Delete Records (Batch)

Deletes multiple records in a single API call.

URI: vesbite://actions/integrations/airtable/delete-records

Inputs:

InputTypeRequiredDescription
ConnectionconnectionYesAirtable OAuth connection
Base IDdropdownYesTarget base
TabledropdownYesTarget table
Record IDsstringYesComma-separated record IDs

Outputs: Array of { id, deleted: true } objects.


SendGrid

Send Email

Sends an email through SendGrid.

URI: vesbite://actions/integrations/sendgrid/send-email

Requires a SendGrid connection.

Inputs:

InputTypeRequiredDescription
ConnectionconnectionYesSendGrid API key connection
FromstringYesSender email address
TostringYesRecipient email address
SubjectstringYesEmail subject line
Bodytext (multiline)YesPlain text body
HTML Bodytext (multiline)NoHTML body (optional)

Outputs:

FieldTypeDescription
statusCodenumberHTTP status code from SendGrid
successbooleanWhether the send succeeded
bodystringResponse body from SendGrid

Example use case: Send an alert email when a high-value tag is read, including the tag EPC and timestamp in the email body.


Database Nodes

All database nodes require a connection configured in the Integrations page.

PostgreSQL

Run QueryURI: vesbite://actions/integrations/postgres/run-query

Executes a SELECT query and returns rows.

InputTypeRequiredDescription
ConnectionconnectionYesPostgreSQL connection
Querycode (SQL)YesSQL SELECT statement
Parameterscode (JSON)NoNamed parameters (e.g., {"name": "value"})
OutputTypeDescription
rowCountnumberNumber of rows returned
rowsarrayArray of row objects

Execute Non-QueryURI: vesbite://actions/integrations/postgres/execute-non-query

Executes INSERT, UPDATE, or DELETE and returns the affected row count.

InputTypeRequiredDescription
ConnectionconnectionYesPostgreSQL connection
SQL Statementcode (SQL)YesSQL statement
Parameterscode (JSON)NoNamed parameters
OutputTypeDescription
affectedRowsnumberNumber of rows affected

Execute ScalarURI: vesbite://actions/integrations/postgres/execute-scalar

Executes a query and returns the first column of the first row.

InputTypeRequiredDescription
ConnectionconnectionYesPostgreSQL connection
Querycode (SQL)YesSQL query returning a single value
Parameterscode (JSON)NoNamed parameters
OutputTypeDescription
valueanyThe scalar result

MySQL

Run QueryURI: vesbite://actions/integrations/mysql/run-query

Same interface as PostgreSQL Run Query.

InputTypeRequiredDescription
ConnectionconnectionYesMySQL connection
Querycode (SQL)YesSQL SELECT statement
Parameterscode (JSON)NoNamed parameters
OutputTypeDescription
rowCountnumberNumber of rows returned
rowsarrayArray of row objects

Execute Non-QueryURI: vesbite://actions/integrations/mysql/execute-non-query

InputTypeRequiredDescription
ConnectionconnectionYesMySQL connection
SQL Statementcode (SQL)YesSQL statement
Parameterscode (JSON)NoNamed parameters
OutputTypeDescription
affectedRowsnumberNumber of rows affected

SQL Server

Run QueryURI: vesbite://actions/integrations/sqlserver/run-query

InputTypeRequiredDescription
ConnectionconnectionYesSQL Server connection
Querycode (SQL)YesSQL SELECT statement
Parameterscode (JSON)NoNamed parameters
OutputTypeDescription
rowCountnumberNumber of rows returned
rowsarrayArray of row objects

Execute Non-QueryURI: vesbite://actions/integrations/sqlserver/execute-non-query

InputTypeRequiredDescription
ConnectionconnectionYesSQL Server connection
SQL Statementcode (SQL)YesSQL statement
Parameterscode (JSON)NoNamed parameters
OutputTypeDescription
affectedRowsnumberNumber of rows affected

Oracle

Run QueryURI: vesbite://actions/integrations/oracle/run-query

InputTypeRequiredDescription
ConnectionconnectionYesOracle connection
Querycode (SQL)YesSQL SELECT statement
Parameterscode (JSON)NoNamed parameters
OutputTypeDescription
rowCountnumberNumber of rows returned
rowsarrayArray of row objects

Execute Non-QueryURI: vesbite://actions/integrations/oracle/execute-non-query

InputTypeRequiredDescription
ConnectionconnectionYesOracle connection
SQL Statementcode (SQL)YesSQL statement
Parameterscode (JSON)NoNamed parameters
OutputTypeDescription
affectedRowsnumberNumber of rows affected

Snowflake

Run QueryURI: vesbite://actions/integrations/snowflake/run-query

InputTypeRequiredDescription
ConnectionconnectionYesSnowflake connection
Querycode (SQL)YesSQL SELECT statement
Parameterscode (JSON)NoNamed parameters
OutputTypeDescription
rowCountnumberNumber of rows returned
rowsarrayArray of row objects

Execute Non-QueryURI: vesbite://actions/integrations/snowflake/execute-non-query

InputTypeRequiredDescription
ConnectionconnectionYesSnowflake connection
SQL Statementcode (SQL)YesSQL statement
Parameterscode (JSON)NoNamed parameters
OutputTypeDescription
affectedRowsnumberNumber of rows affected

MongoDB

Find DocumentsURI: vesbite://actions/integrations/mongodb/find-documents

Queries documents from a collection.

InputTypeRequiredDefaultDescription
ConnectionconnectionYesMongoDB connection
DatabasestringYesDatabase name
CollectionstringYesCollection name
Filtercode (JSON)No{}MongoDB query filter (e.g., {"status": "active"})
LimitnumberNo100Maximum documents to return
OutputTypeDescription
countnumberNumber of documents returned
documentsarrayArray of document objects

Insert DocumentURI: vesbite://actions/integrations/mongodb/insert-document

Inserts a document into a collection.

InputTypeRequiredDescription
ConnectionconnectionYesMongoDB connection
DatabasestringYesDatabase name
CollectionstringYesCollection name
Documentcode (JSON)YesJSON document to insert
OutputTypeDescription
insertedIdstringThe _id of the inserted document

Redis

Get ValueURI: vesbite://actions/integrations/redis/get-value

Retrieves a string value by key.

InputTypeRequiredDescription
ConnectionconnectionYesRedis connection
KeystringYesThe key to retrieve
OutputTypeDescription
keystringThe requested key
valuestring or nullThe stored value, or null if the key does not exist
existsbooleanWhether the key exists

Set ValueURI: vesbite://actions/integrations/redis/set-value

Stores a string value at a key.

InputTypeRequiredDescription
ConnectionconnectionYesRedis connection
KeystringYesThe key to set
ValuestringYesThe value to store
Expiration (seconds)numberNoOptional TTL in seconds
OutputTypeDescription
keystringThe key that was set
successbooleanWhether the operation succeeded

Elasticsearch

Search DocumentsURI: vesbite://actions/integrations/elasticsearch/search-documents

Searches an index.

InputTypeRequiredDefaultDescription
ConnectionconnectionYesElasticsearch connection
IndexstringYesIndex name
Querycode (JSON)Nomatch_allSearch query as JSON
SizenumberNo10Maximum results
OutputTypeDescription
totalnumberTotal matching documents
hitsarrayArray of matched documents

Index DocumentURI: vesbite://actions/integrations/elasticsearch/index-document

Indexes (upserts) a document.

InputTypeRequiredDescription
ConnectionconnectionYesElasticsearch connection
IndexstringYesIndex name
Document IDstringNoDocument ID (auto-generated if omitted)
Documentcode (JSON)YesJSON document to index
OutputTypeDescription
idstringThe document ID
indexstringThe index name
resultstringOperation result (e.g., "created", "updated")

See Also