A trigger starts a run: it has no input and sends a message when its event happens. A flow may have several triggers. This page lists every trigger with its outputs and settings, as the blocks define them. The editor’s Help tab shows the same reference for the selected block.
Messages are delivered at least once: after a crash a message can be delivered again, marked msg.metadata.redelivered = true, with the same message ids, so blocks that call out send the same idempotency keys. The time-based and webhook triggers have a setting skip_redelivered (off by default): on, a redelivered message does not start the flow again.
Flow input
The entry of messages another flow hands over with Run flow, and, in a root flow, of the device messages of the root’s scope. Every flow has exactly one; it cannot be deleted.
| Output | out: the message as it was handed over, in the same run. In an IoT root, each device message, telemetry one message per record. |
| Settings | None. The flow itself is the address. |
| Notes | The flow must be switched on and running to receive messages. A root is never run by another flow. Data comes only through the message; set fields before Run flow. |
Device message (IoT host)
Starts on messages of devices. Device messages (telemetry, attributes, connect, disconnect, activity, inactivity, rpc_request, rpc_response) go to one root flow only; in a root whose Flow input is wired, the Flow input is their entry. alarm and attributes_updated messages go to every flow with a Device message trigger that names them, root or not. A trigger with no types ticked hears the device message types only: tick alarm or attributes_updated by name to hear them.
| Setting | Meaning | Default | Values |
|---|---|---|---|
| types | The message types that start it | every type | telemetry, attributes, connect, disconnect, activity, inactivity, rpc_request, rpc_response, attributes_updated, alarm |
| profiles | Only devices of these profiles | every profile | your device profiles |
| skip_redelivered | A redelivered message does not start it | off | on, off |
Outputs: out (telemetry one message per record, with msg.metadata.recordTs), error (bad_payload: telemetry that gave no record; msg.error.drops says why each value was left out).
Read-only metadata: msgType, deviceId, profileId, deviceName, profileName, transport (mqtt or http), ts (receive time), recordTs, topic (custom-topic data only), gatewayDeviceId, and others. Metadata is never stored.
Inject
Starts a flow by hand (the button on the block), once shortly after the flow starts, or repeatedly.
| Setting | Meaning | Default | Values |
|---|---|---|---|
| payload | What goes into msg.payload | the time now (epoch seconds) | a number, text, yes/no, JSON, the time now, nothing, an environment variable or an expression |
| topic | msg.topic | empty | up to 256 characters |
| repeat_ms | Fire again every this long; 0 = no repeat | 0 | up to 7 days; at least 60 s on the cloud (your plan’s minimum) |
| once_after_ms | Fire once this long after the flow starts | empty | 0 to 24 h |
| originator | Who the message is from | the organisation | the organisation, or this flow (its own lane) |
| msg_type | The message type | inject | one of the host’s message types |
| metadata | Extra msg.metadata entries | none | up to 16 rows |
| times | Stop after this many repeats | 0 (no end) | needs a repeat |
| catch_up | After a downtime | once | once (one run for the most recent missed tick), skip |
Output: out. The payload is worked out each time it fires.
Schedule
Starts a flow by the wall clock.
| Setting | Meaning | Default | Values |
|---|---|---|---|
| mode | How the time is given | daily | daily, cron, sun |
| time | Time of day (daily) | 08:00 | HH:MM, 24 hours |
| weekdays | Days it fires (daily) | none ticked = every day | Mon to Sun |
| cron | Cron expression | 0 8 * * 1-5 | 5 fields: minute, hour, day of month, month, weekday |
| sun | Sunrise or sunset | set | rise, set |
| offset_min | Minutes after (+) or before (−) the sun event | 0 | −720 to 720 |
| lat, lon | Position for sun times | empty | −90 to 90, −180 to 180; required for mode sun |
| tz | Time zone | the organisation’s default zone | an IANA name such as Europe/Istanbul |
| originator | Who the message is from | the organisation | the organisation, or this flow |
| msg_type | The message type | schedule | one of the host’s types |
| payload | Replaces the standard payload | { event: "due", mode, at, time } | any value or expression |
| catch_up | After a downtime | once | once, skip |
Output out: msg.payload { "event": "due", "mode": "daily", "at": …, "time": … }, msg.topic schedule/<mode>.
- Cron fields accept numbers,
*, ranges (1-5), lists (1,15) and steps (*/10); weekday 0 and 7 are Sunday; names such asMONare not understood. When day of month and weekday are both restricted, either one is enough. - A time skipped by a daylight-saving change does not fire. A day with no sunrise or sunset (polar regions) is skipped.
- Show the next runs in the block’s settings lists the next fire times in its zone.
- A schedule’s message has no device: blocks that need a device message (Save telemetry, Raise alarm, Send command) refuse it with
not_a_device.
Named timer
Starts a flow when a named timer runs out. The Timer action block starts, restarts or cancels it, from any flow of the organisation.
| Setting | Meaning | Values |
|---|---|---|
| name | The timer to listen to | required |
Output out: msg.payload { "event": "fired", "name", "ms", "time" }, msg.topic timer/<name>, msg.text “Timer name ran out”. Timers survive edits of the flows and are kept by the platform. A timer that falls due during an outage longer than the time-to-live becomes a failed message you can replay.
Webhook
An HTTP POST to the block’s address starts the flow. The address is shown in the editor’s Webhooks dialog once the flow is deployed and switched on.
| Setting | Meaning | Default | Values |
|---|---|---|---|
| auth | How callers prove themselves | token | token (Authorization: Bearer <secret>), hmac (X-Automation-Signature: hex HMAC-SHA256 of timestamp.rawBody, and X-Automation-Timestamp within 300 s), session (a signed-in member of your organisation) |
| permission | Session only: a permission the caller must also hold | empty | a permission id |
| originator | Who the message is about | the organisation | the organisation, or an entity of your organisation |
| max_body | Largest body | 16 KiB | at most 256 KiB |
| parse | How the body is read | json | json, text |
| reply | When the caller gets its answer | accepted | accepted (202 with an id at once), response (an HTTP response block answers) |
| timeout_ms | How long a synchronous caller waits | 10,000 | 1,000 to 10,000 |
Output out: msg.payload is the body; msg.metadata.http has method, query and the headers content-type, user-agent and x-request-id (never authorization or cookies). For a session hook, msg.metadata.user.id is the caller.
Answers: 202 accepted, 401 wrong token, signature or session, 403 refused session, 404 unknown hook, 413 body too large, 429 rate limit or quota, 503 busy. A synchronous hook answers 204 when the flow sends no response, 500 on an uncaught error, 504 at the deadline. See Connections and secrets for secrets and rotation.
Event
Starts on an event chosen by source and kind, such as one another flow sent with Emit event.
| Setting | Meaning | Default | Values |
|---|---|---|---|
| source | The event source | any | a source, e.g. flow; * = any |
| kind | The event kind | any | exact, *, or a prefix ending in * (tank.*) |
| filter | An expression that must be true | none | over msg, up to 512 characters |
Output out: msg.payload is the event’s data, msg.topic <source>/<kind>. Error invalid_value when the filter does not compile. Except for the sources flow and platform, you must name a kind or a prefix.
Catch
Receives errors of blocks in the same flow whose own error output is not wired.
| Setting | Meaning | Default |
|---|---|---|
| scope | The blocks whose errors are caught | every block of the flow |
| uncaught_only | Only errors no other Catch takes | off |
Output out: a copy of the failing message with msg.error { message, code, source: { id, type, flow, name } }.
Status
Starts whenever a block of the same flow changes the status line under it.
| Setting | Meaning | Default |
|---|---|---|
| scope | The blocks watched | every block of the flow |
Output out: msg.payload the status text, msg.status { fill, shape, text, ts, source }. Do not watch every block and wire into a block that sets its own status (such as Debug): it starts itself again without end.
Complete
Starts when selected blocks of the same flow finish a message without an error.
| Setting | Meaning | Values |
|---|---|---|
| nodes | The blocks watched | up to 64; none = never fires |
Output out: a copy of the finished message with msg.complete { id, type, name }.
Link in
A named entry that Link out and Link call blocks send to, from this or another flow of the same host.
| Setting | Meaning | Values |
|---|---|---|
| name | The name link blocks use | 1 to 32 characters: letters, digits, _, ., -; unique |
Output out: every arriving message, unchanged and in the same run.
Comment
A Comment block is a note on the canvas (up to 2,048 characters). It does nothing when the flow runs.
See also Routing and timing blocks for Link call, and Action blocks for Link out, Emit event, Timer and Run flow.

