Input & Output
Understand the data structure produced when a user submits the form, and how to reference field values in downstream nodes.
The Form Trigger Has Two Execution Phases
Phase 1 (form generation) produces no output data — the workflow is suspended while waiting. Phase 2 (form submission) resumes the workflow and produces the full output described on this page. All downstream nodes connected to the
main output port receive this data when the user submits the form.
Output Ports
| Port Name | When Triggered | Description |
|---|---|---|
main |
When the user successfully submits the form | Primary output port. Carries all form field values as a structured key-value object, along with submitter metadata and any file attachment URLs. |
expired |
When the form expires before submission and on_expiry is set to escalate |
Escalation output port. Carries form metadata and expiry information. Connect escalation logic (e.g., reassign, notify manager) to this port. Not present if on_expiry is cancel. |
Output Data (main port)
| Key | Type | Description |
|---|---|---|
form_data |
Object | All submitted form field values as a flat key-value object. Keys match the property names from the form_schema. Values are typed according to their schema definition (string, number, boolean, array). This is the primary data used by downstream processing nodes. |
submitted_by |
Object | Identity of the user who submitted the form. Contains user_id, email, display_name, and roles. For anonymous submissions (when assigned_to is not set), only email may be present if the user provided it. |
submitted_at |
ISO 8601 String | UTC timestamp of when the form was submitted. Example: 2024-06-15T10:42:15.000Z. |
form_url |
String | The URL of the form that was submitted. Useful for audit logging and for including in confirmation communications. |
execution_id |
String | Unique identifier for this workflow execution, assigned when the form was first generated. Consistent across both Phase 1 and Phase 2. |
attachments |
Array of Objects | List of uploaded file metadata when allow_file_uploads is true. Each entry contains filename, mime_type, size_bytes, and url (a signed, time-limited download URL). Empty array if no files were uploaded. |
form_title |
String | The title configured for the form, as shown to the user. Useful for generating confirmation emails and audit records. |
Data Flow Example
Below is the complete output object produced when an employee submits a leave request form. This is the data available to all downstream nodes after the form is submitted.
{
"form_data": {
"leave_type": "Annual Leave",
"start_date": "2024-07-15",
"end_date": "2024-07-19",
"reason": "Family vacation — pre-booked",
"covering_colleague": "alex.morgan@acmecorp.com"
},
"submitted_by": {
"user_id": "usr_P9nKmRt4",
"email": "priya.sharma@acmecorp.com",
"display_name": "Priya Sharma",
"roles": ["employee"]
},
"submitted_at": "2024-06-15T10:42:15.000Z",
"form_url": "https://forms.bizfirstai.com/f/leave-request-wf9Kx2mN",
"execution_id": "exec_form_7Hk9mNpRt2Wz",
"attachments": [],
"form_title": "Employee Leave Request"
}
Accessing Form Data in Downstream Nodes
Reference submitted field values using BizFirst expressions:
| Expression | Returns |
|---|---|
{{ $trigger.form_data.leave_type }} | "Annual Leave" |
{{ $trigger.form_data.start_date }} | "2024-07-15" |
{{ $trigger.form_data.end_date }} | "2024-07-19" |
{{ $trigger.submitted_by.email }} | "priya.sharma@acmecorp.com" |
{{ $trigger.submitted_by.display_name }} | "Priya Sharma" |
{{ $trigger.submitted_at }} | "2024-06-15T10:42:15.000Z" |
{{ $trigger.attachments[0].url }} | Download URL of the first attachment |
Optional Fields May Be Absent
If a field in
form_schema is not marked as required and the user leaves it blank, the key will be absent from form_data entirely (not present as null). Always use conditional expressions in downstream nodes when accessing optional fields, e.g., {{ $trigger.form_data.covering_colleague || "not specified" }}.