Portal Community
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:

ExpressionReturns
{{ $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" }}.