Trigger Nodes
Trigger nodes start a workflow. Every workflow must have exactly one active trigger node. Triggers produce a root payload that downstream nodes can reference.
| Node | Type | Output | Environments |
|---|---|---|---|
| Manual Trigger | manual_trigger | json | browser, worker |
| Schedule Trigger | schedule_trigger | json | scheduled, worker, server |
| Webhook Trigger | webhook_trigger | json | server, worker |
| Event Trigger | event_trigger | json | worker, server |
| Form / Input Trigger | form_input_trigger | json | browser |
Manual Trigger
Type: manual_trigger · Category: Trigger
Start a workflow manually with optional root inputs. Used for on-demand runs, ad hoc queries, and development testing.
When to Use
Use Manual Trigger when you want a human to initiate a workflow from the Studio interface or CLI, optionally supplying a typed payload (e.g. a search query, a document id, a set of parameters).
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
trigger | void | No | No upstream input required — this node starts the graph. |
Outputs
| Name | Type | Description |
|---|---|---|
rootInputs | json | Root inputs supplied by the user: { query: text, payload: json } |
Optional Config
| Field | Type | Default | Description |
|---|---|---|---|
inputSchema | json | — | JSON schema describing the expected input payload. When provided, the Studio renders a typed form. |
Example
{
"inputSchema": { "query": { "type": "string", "required": true } }
}Expected input: (empty — user fills the form)
Expected output: { "rootInputs": { "query": "Which battle strategy won most often this week?" } }
Downstream: → rag_retrieval with { "query": "$.rootInputs.query" }
Valid Connections
→ Any node that accepts json or any input: Logic, Data, AI Primitive, Battle, Storage, Communication.
Invalid Connections
✗ Cannot be a downstream node — triggers must be the graph root.
✗ Cannot connect to another trigger.
Execution Notes
- The trigger fires once per manual invocation.
inputSchemais validated before the workflow starts; mismatched types fail early.
Troubleshooting
- "No input form shown" — add an
inputSchemato enable the typed form. - "Schema validation failed" — check that your input matches the declared types and required fields.
Related Nodes
Schedule Trigger · Webhook Trigger · Event Trigger · Workflow Studio · Node Catalog
Schedule Trigger
Type: schedule_trigger · Category: Trigger
Start a workflow on a cron schedule or interval. Used for periodic digest generation, data sync, alerting, and automation.
When to Use
Use Schedule Trigger for any recurring workflow — weekly digests, hourly data pulls, daily leaderboard refreshes, or monthly reports.
Inputs
| Name | Type | Required |
|---|---|---|
trigger | void | No — no upstream input |
Outputs
| Name | Type | Shape |
|---|---|---|
schedule | json | { firedAt: text, timezone: text } |
Required Config
| Field | Type | Description |
|---|---|---|
cron | string | Cron expression defining the schedule (e.g. 0 8 * * MON). |
Optional Config
| Field | Type | Default | Description |
|---|---|---|---|
timezone | string | UTC | IANA timezone name (e.g. Europe/Istanbul). |
Example
{
"cron": "0 8 * * MON",
"timezone": "Europe/Istanbul"
}Scenario: Generate a Monday morning arena digest.
Expected output: { "firedAt": "2026-05-18T08:00:00+03:00", "timezone": "Europe/Istanbul" }
Downstream: → supabase_query with { "since": "$.firedAt" }
Execution Notes
- Runs in the
scheduled/worker/serverenvironment — not available in browser-only execution. $.firedAtis an ISO 8601 string you can use in downstream date filters.- Cron uses standard five-field syntax (minute, hour, day-of-month, month, day-of-week).
Troubleshooting
- "Invalid cron expression" — validate with a tool like crontab.guru.
- "Workflow did not fire" — check that the workflow is published and the cron worker is running.
Related Nodes
Manual Trigger · Event Trigger · Wait / Delay · Workflow Studio
Webhook Trigger
Type: webhook_trigger · Category: Trigger
Start a workflow from an inbound HTTP request. Used for GitHub webhooks, CI pipeline hooks, payment events, and any external service that can POST data.
Inputs
| Name | Type | Required |
|---|---|---|
trigger | void | No |
Outputs
| Name | Type | Shape |
|---|---|---|
request | json | { body: json, headers: json, method: text } |
Required Config
| Field | Type | Description |
|---|---|---|
path | string | Public webhook path (e.g. /hooks/github-pr-review). Must be unique per workflow. |
Optional Config
| Field | Type | Default | Options |
|---|---|---|---|
method | select | POST | POST, GET, PUT |
Example
{
"path": "/hooks/github-pr-review",
"method": "POST",
"secretRef": "github-webhook-secret"
}Scenario: Receive a GitHub webhook and route pull request events.
Expected output: { "body": { "action": "opened", "pull_request": { "number": 42 } }, "headers": { "x-github-event": "pull_request" } }
Downstream: → github_pr_review with { "prNumber": "$.body.pull_request.number" }
Execution Notes
- Runs in
server/workerenvironments only. - The webhook URL is exposed after the workflow is published.
- Use
secretRefto verify HMAC signatures from services like GitHub.
Troubleshooting
- "404 on webhook path" — ensure the workflow is published and the path matches exactly.
- "Payload not received" — check
methodsetting; GitHub PRs usePOST.
Related Nodes
Event Trigger · HTTP Request · Switch
Event Trigger
Type: event_trigger · Category: Trigger
Start a workflow from a LenserFight domain event (e.g. battle.completed, lens.published, agent.failed).
Inputs
| Name | Type | Required |
|---|---|---|
trigger | void | No |
Outputs
| Name | Type | Shape |
|---|---|---|
event | json | { eventType: text, entityId: text, payload: json } |
Required Config
| Field | Type | Description |
|---|---|---|
eventType | string | Domain event name to subscribe to (e.g. battle.completed). |
Example
{
"eventType": "battle.completed",
"workspaceId": "{{workspace.id}}"
}Expected output: { "eventType": "battle.completed", "entityId": "battle_123", "payload": { "winner": "contender-a" } }
Downstream: → slack_notify with { "text": "$.payload.winner" }
Execution Notes
- Runs in
worker/serverenvironments. - One trigger per event type per workflow.
- The
payloadshape varies by event type — check the event schema for each domain event.
Related Nodes
Webhook Trigger · Battle Execute · Slack Notify
Form / Input Trigger
Type: form_input_trigger · Category: Trigger
Start a workflow from a rendered form and expose submitted fields. The Studio renders a form based on the fields schema and passes validated submission data downstream.
Inputs
| Name | Type | Required |
|---|---|---|
trigger | void | No |
Outputs
| Name | Type | Shape |
|---|---|---|
submission | json | { fields: json, submittedBy: text } |
Required Config
| Field | Type | Description |
|---|---|---|
fields | json | Form fields and validation rules. Each field: { key, type, required, label? }. |
Example
{
"fields": [
{ "key": "prompt", "type": "textarea", "required": true },
{ "key": "contenders", "type": "array", "required": true }
]
}Scenario: Collect contender names before running a judged battle.
Expected output: { "fields": { "prompt": "Debate RAG answer style", "contenders": ["concise", "thorough"] } }
Downstream: → battle_execute with { "prompt": "$.fields.prompt", "contenders": "$.fields.contenders" }
Troubleshooting
- "Form not rendering" — ensure
fieldsis valid JSON with at least one field. - "Validation error on submit" — check
requiredflags and field types.
Related Nodes
Manual Trigger · Battle Execute · Workflow Studio
See also: Node Reference Index · Workflow Concepts · Execution Engine