ManualTrigger NodeTypeCode: manual-trigger
Start a workflow on demand — from a button click in FlowStudio, a direct API call from an application, or a developer test invocation with custom input data. Zero configuration required.
When to Use
- HR-initiated onboarding: An HR manager clicks "Run" in FlowStudio, supplies a new hire's name, role, department, and start date, and the workflow automatically provisions accounts, sends welcome emails, and schedules orientation meetings — without touching any downstream system manually.
- Ad-hoc invoice generation: An accounts manager needs to generate an out-of-cycle invoice for a project milestone. They trigger the invoice workflow via the portal API from the internal billing tool, supply client ID and line items, and the workflow creates the PDF, emails the client, and logs it in the ERP.
- On-demand report runs: A regional director needs a custom revenue report before a board meeting. They trigger the report workflow via the FlowStudio UI, specify date ranges and regions, and receive the formatted Excel and PDF reports within minutes.
- Developer testing and debugging: A developer building a new notification workflow triggers it manually during development, passing synthetic customer data as the input body. They inspect each node's output in real time on the canvas without needing a full integration test environment.
- Application-embedded triggers: An internal procurement portal has a "Submit Purchase Request" button that calls the workflow API endpoint directly, passing the purchase details. BizFirst initiates the approval chain immediately.
Configuration
The ManualTrigger node requires no configuration. There are no settings fields. It is the simplest trigger node in the system.
Output Ports
| Port | When It Fires |
|---|---|
main |
Always. Fires immediately when the workflow is triggered. The port routes to the next node unconditionally. There is no error path for a ManualTrigger — if the workflow cannot start, the API returns an error to the caller before execution begins. |
Output Fields
The ManualTrigger passes InputData through unchanged. All fields in the JSON body posted to the trigger API (or provided in the FlowStudio "Run" dialog) are available as output fields on the main port.
| Field | Type | Description |
|---|---|---|
(any field from input body) | any | Every top-level key in the posted JSON body is passed through directly as an output field. Downstream nodes access these via {{ $output.manualTrigger.fieldName }}. |
__triggered_by | string | The user ID or API key identifier of the actor who triggered the workflow, injected automatically by the platform. |
__triggered_at | string | ISO 8601 UTC timestamp of when the trigger was invoked. |
Sample Configuration
Example API invocation
POST https://app.bizfirstai.com/api/workflows/{workflowId}/execute
Authorization: Bearer <api_token>
Content-Type: application/json
{
"employeeId": "EMP-00293",
"firstName": "Sarah",
"lastName": "Mitchell",
"department": "Engineering",
"role": "Senior Software Engineer",
"startDate": "2026-06-02",
"managerId": "EMP-00105"
}
Sample Output
Success Port — Workflow Triggered
{
"triggeredBy": {
"userId": "usr_admin_001",
"name": "Sarah Kim",
"email": "s.kim@company.com",
"role": "WorkflowAdmin"
},
"triggeredAt": "2025-03-15T08:00:00Z",
"triggerMethod": "manual",
"inputData": {
"targetMonth": "2025-03",
"reportType": "monthly_summary",
"includeSubsidiaries": true
},
"executionId": "exec_20250315_001",
"workflowId": "wf_monthly_report"
}
Expression Reference
| Expression | Value |
|---|---|
{{ $output.manualTrigger.employeeId }} | The employeeId field from the posted JSON body. |
{{ $output.manualTrigger.department }} | The department value supplied at trigger time. |
{{ $output.manualTrigger.__triggered_by }} | The user or system that invoked the trigger. |
{{ $output.manualTrigger.__triggered_at }} | ISO timestamp of when the workflow was started. |
Node Policies & GuardRails
| Policy | Rationale |
|---|---|
| Use ManualTrigger for all development and testing workflows | Its zero-config nature and ability to accept arbitrary input JSON makes it the fastest way to test any workflow during development without configuring event sources. |
| Add a DataMapping or IfCondition node immediately after | Since the input body is unconstrained, validate and normalize the incoming data before passing it to downstream nodes. This prevents null-reference errors deep in complex workflows. |
| Protect the trigger API endpoint with authentication | The workflow execution API requires a Bearer token. Always store this token in your application's secret manager and never expose it in client-side code. |
| Use ManualTrigger for workflows that run <100 times per day | For high-frequency automated workflows, use ScheduledTrigger or WebhookTrigger instead. ManualTrigger is optimized for human-or-application-initiated execution, not bulk event processing. |
Pattern Examples
Pattern 1 — Employee Onboarding from HR Portal
The HR system calls the workflow API when a new hire is added. The ManualTrigger receives the employee record and routes it through provisioning, notifications, and HR system updates.
// API call from HR system
POST /api/workflows/wf-onboarding-v2/execute
{
"employeeId": "EMP-00412",
"firstName": "James",
"lastName": "Okafor",
"email": "james.okafor@company.com",
"role": "Product Manager",
"department": "Product",
"startDate": "2026-06-09",
"managerId": "EMP-00088",
"officeLocation": "London"
}
// Downstream VariableAssignment — build display name
{
"VariableName": "employeeFullName",
"ValueExpression": "{{ $output.manualTrigger.firstName }} {{ $output.manualTrigger.lastName }}"
}
Pattern 2 — On-Demand Report Generation
A director triggers a custom revenue report from the FlowStudio UI, specifying the reporting period and regions. The workflow queries the data warehouse, formats the report, and emails it.
// FlowStudio Run dialog input
{
"reportType": "revenue_summary",
"dateFrom": "2026-04-01",
"dateTo": "2026-06-30",
"regions": ["EMEA", "APAC"],
"recipientEmail": "director@company.com",
"format": "pdf"
}
// Downstream IfCondition — validate date range
{
"Condition": "{{ $output.manualTrigger.dateFrom }} < {{ $output.manualTrigger.dateTo }}"
}
Pattern 3 — Debugging a New Workflow with Synthetic Data
A developer triggers a payment processing workflow with a synthetic payload to test the happy path, then again with a missing field to verify the error port behaviour.
// Test case 1 — happy path
{
"paymentId": "PAY-TEST-001",
"amount": 9500,
"currency": "USD",
"customerId": "CUST-TEST-099",
"orderId": "ORD-TEST-555"
}
// Test case 2 — missing customerId to test validation
{
"paymentId": "PAY-TEST-002",
"amount": 500,
"currency": "GBP"
}