Skip to content

Trigger reference for agents ​

A trigger starts one workflow. It can run on the clock (a cron or interval schedule) or when a message arrives on a queue. save_trigger creates and updates it. For background, see Triggers and Schedules.

Tools ​

ToolRoleWhat it does
list_triggersviewerTriggers of a project: id, name, type, active, workflow, disabledReason. Args: projectId, workflowId, sandboxId, page, search. Triggers on other people's sandboxes are never listed.
get_triggerviewerEvery setting of one trigger.
save_triggercreatorCreate (no triggerId) or update (triggerId).
delete_triggercreatorDeletes the trigger. The workflow stays. Nothing starts it from this trigger again.

Types ​

typeStarts the workflowNeeds
scheduleOn the clock.schedule. Optional timezone.
internalFrom inside Fluxify. It has no clock and no queue.Nothing else.
redisFor each entry of a Redis stream.A Redis KV integration, source.
rabbitmqFor each message of an existing RabbitMQ queue.A RabbitMQ integration, source.
kafkaFor each message on Kafka topics.A Kafka integration, source.
natsFor each message of a NATS JetStream stream.A NATS integration, source.
sqsFor each message of an SQS queue.An SQS integration, source.
plugin:<kind>When a trigger kind a plugin adds reports an event.An approved plugin that is enabled in the environment, and source with that kind's params.

Every built-in trigger type works in every edition, with no licence.

Create a schedule trigger ​

Pass projectId, name, type, schedule and the workflow.

json
{
  "projectId": "<project id>",
  "name": "Nightly report",
  "type": "schedule",
  "schedule": "0 30 2 * * *",
  "timezone": "UTC",
  "workflowId": "<workflow id>",
  "active": true
}

The result is { "id": "<trigger id>", "warnings": [] }.

A new trigger is inactive. Pass active: true, or nothing runs. The workflow must also be active.

Create a queue trigger ​

Pass the integration and a source in the connector's terms. This example reads a Redis stream.

json
{
  "projectId": "<project id>",
  "name": "Orders stream",
  "type": "redis",
  "integrationId": "<Redis integration id>",
  "source": { "stream": "orders" },
  "workflowId": "<workflow id>",
  "batchSize": 10,
  "maxWaitMs": 2000,
  "active": true
}

On create, on enabling, and on any change to source or integrationId, Fluxify contacts the broker. It checks the credentials and that the topic, stream or queue exists. A failure is a 400 with the broker's message and nothing is saved.

warnings lists settings that work but need a look, for example a missing dead-letter queue. Read them.

Create a plugin trigger ​

A plugin can add a trigger kind, and the project creates triggers from it like any other source. The type is plugin: followed by the kind, and the kind's params go in source, not in integrationId:

json
{
  "projectId": "<project id>",
  "name": "Order poller",
  "type": "plugin:acme/shop/orders",
  "source": {
    "database": "<database integration id>",
    "table": "orders",
    "everySeconds": 10
  },
  "workflowId": "<workflow id>",
  "active": true
}
  • The kind is the trigger's name as the plugin declares it, for example acme/shop/orders. The person who installed the plugin knows it, and the trigger wizard lists it.
  • source is checked against the kind's params. A wrong or missing param is a 400 that names the field, such as source.table: param 'table' is required. A number param outside its min/max, or a fraction where it asks for integer, is refused the same way, such as source.everySeconds: param 'everySeconds' must be at least 1, got 0.
  • A secret param holds an App config key as cfg:<KEY>, exactly as an integration stores it.
  • An integration param holds the id of an integration in the same project, of the kind the param takes and one the plugin was granted. A wrong variant is refused with the variants it takes.
  • integrationId is refused for a plugin trigger, with A plugin trigger takes its integrations as params, in source.
  • A kind from a plugin that is not approved is refused with No approved plugin of this project provides trigger <kind>. Creating one while the plugin is disabled is refused with plugin <name> is disabled.
  • batchSize, maxWaitMs, maxBytes, concurrency, commitMode and dead-letter settings do not apply. The plugin owns batching and delivery.
  • maxAttempts and retryDelayMs apply only when the kind declares that Fluxify retries its runs. Otherwise they are unused.

The trigger runs wherever its workflow is live and the plugin is enabled. A trigger Fluxify turned off keeps the reason in disabledReason. Setting active: true clears the reason, re-checks the trigger and its params, and starts a fresh failure count.

Update a trigger ​

Pass triggerId and only the fields that change.

json
{ "triggerId": "<trigger id>", "active": false }
  • type and projectId cannot change. If you pass them they are ignored.
  • workflowId: null detaches the workflow. The trigger then idles.
  • Turning a trigger on clears its disabledReason. The system sets that field when it switches a trigger off itself, for example when its queue was deleted.

Common fields ​

FieldTypeRuleDefault
projectIdstringCreate only.none
namestring2 to 255 characters. Unique in the project.none
descriptionstringUp to 2000 characters.none
typestringOne of the types above. Create only.none
workflowIdstring or nullA workflow of the same project. May be left out: the trigger is then saved and idle.none
sandboxIdstring or nullOne of your own sandboxes, run instead of a workflow, on development workers with development values. Never together with workflowId, never for schedule. Only you see such a trigger. null detaches it.none
groupIdstringA trigger group of the same project. Leave it out for the default group.default group
integrationIdstringBuilt-in queue types only. An integration of the right kind in this project. Never for schedule, internal or plugin:<kind>.none
payloadany JSONStatic data handed to the workflow. Use it for sources that carry none.none
activebooleanOnly active triggers run.false

A group holds at most 5 triggers by default. The operator can change that. The 6th fails with A trigger group holds at most 5 triggers and this one has 5. Create another group for the rest. No tool creates groups, so ask a person.

Schedule fields ​

FieldRuleDefault
scheduleRequired for schedule. Up to 255 characters. Not allowed on other types.none
timezoneAn IANA name such as Asia/Kolkata. A fixed offset such as +05:30 is refused. Up to 64 characters.UTC

Ways to write a schedule ​

You writeIt runs
@every 5mEvery 5 minutes from when it was saved. The shortest is 1s. Units: ns, us, ms, s, m, h. Parts can be joined, as in 1h30m.
@hourly, @daily, @midnight, @weekly, @monthly, @yearly, @annuallyAt the start of the hour, day, week (Sunday), month or year.
0 0 9 * * 1-5Six-field cron: seconds first, then minute, hour, day of month, month, day of week. Weekdays at 09:00.
@at 2026-03-01T02:00:00ZOnce. A time already past never runs.

Five-field cron is refused: A cron expression needs six fields — seconds, minutes, hours, day of month, month, day of week. Got 5. Add a leading 0.

Behaviour ​

  • @every and @at ignore timezone.
  • A timezone with daylight saving can skip a run or run twice on the change days. Use UTC when a run must happen exactly once.
  • Runs are spread over the minute. @daily may run at 00:00:37, and it uses that second every day. Name the seconds field in cron to pin it.
  • A schedule is one run each time, never a batch. The batch settings below do not apply.
  • After downtime, missed runs are dropped, not replayed. Only @at runs late.

Batch and retry fields ​

These apply to the built-in queue triggers. A plugin trigger owns batching and delivery, so its maxAttempts and retryDelayMs matter only when the kind declares that Fluxify retries its runs.

FieldRuleDefaultMeaning
batchSize1 to 100001Events handed to one run. 1 runs the workflow once per event.
maxWaitMs0 to 3000000How long a part-filled batch waits. Values from 1 to 999 act as 1000.
maxBytes1024 to 671088641048576Memory limit of one batch.
concurrency1 to 641Batches running at once. Above 1, order is lost.
commitModeauto or manualautoauto marks a message done after a successful run. manual leaves that to the workflow.
maxAttempts1 to 53Runs of one batch before it is dead-lettered (auto) or handed back (manual).
retryDelayMs0 to 3000001000Delay before a retry. It doubles after each failure.

Source by type ​

source is an object. It is required for queue types and for a plugin trigger.

TypeFieldRule
redisstreamRequired. 1 to 1024 characters, no spaces.
consumerGroupOptional. Default fluxify-<triggerId>.
consumerOptional. Default is the host name.
fromBeginningOptional. A new group starts at the first entry instead of new ones.
claimIdleMsOptional. 1000 to 86400000. How long an entry sits unacknowledged before another consumer takes it.
dlqStreamOptional. Default <stream>:dlq.
rabbitmqqueueRequired. An existing queue, 1 to 255 characters. Fluxify never creates it.
kafkatopicsRequired. 1 to 100 names, each up to 249 characters.
consumerGroupOptional. Letters, digits, ., _, -, up to 200.
fromBeginning, createTopics, allowIdleConsumersOptional booleans. createTopics makes missing topics on save. Off, a missing topic is a 400.
natsstreamRequired. No spaces, ., *, >, / or \. Up to 255.
filterSubjectsOptional. Up to 100 subjects.
consumerGroup, fromBeginningOptional. Group: letters, digits, _, -, up to 200.
sqsqueueUrlRequired. A URL.
waitTimeSecondsOptional. 0 to 20.
visibilityTimeoutSecOptional. 1 to 43200.
plugin:<kind>the kind's paramsEach param the plugin declares, by name under source. A required one must be present, a secret is cfg:<KEY>, and an integration is an integration id of the param's kind.

Common errors ​

MessageCause and fix
Invalid input: schedule: A schedule trigger needs a scheduleAdd schedule.
Invalid input: schedule: A internal trigger is not fired on a scheduleRemove schedule. It is only for type: "schedule".
Invalid input: schedule: ...is not a known shorthand...Use one of the shorthands, @every, @at or six-field cron.
Invalid input: timezone: Use an IANA timezone name like Asia/Kolkata, not a fixed offsetUse a name. Unknown timezone "X" means the name does not exist.
A schedule trigger has no source to authenticateRemove integrationId. Same for internal.
A Redis trigger needs a valid stream keysource is missing or wrong. Same pattern for the other types.
A Redis trigger needs a Redis integration from this projectintegrationId is missing, from another project, or the wrong variant.
Fluxify API error 409: trigger with that name already existsPick another name.
Fluxify API error 400: Workflow belongs to a different projectUse a workflow of the same project.
Not found: Workflow ... not foundWrong workflowId. Use list_workflows.
Broker message, such as a missing stream or queueThe source does not exist or the credentials fail. Fix it and save again.

Nothing runs when the trigger is off, has no workflow, or the workflow is inactive. All three must be right. Check list_triggers for disabledReason. For a worked example see Recipe, workflow with a cron trigger.

Released under the Apache License 2.0. Enterprise features are under the Fluxify Enterprise Edition License.