Skip to content

Form Triggers

Form triggers let you create hosted forms that trigger a workflow when submitted. QuickFlo includes a full drag-and-drop form builder with live preview, field validation, branding options, and optional password protection — no external form tools needed.

Each form gets a unique public URL that you can share with anyone. When someone submits the form, QuickFlo starts the workflow with the submitted values as input data.

There are two ways to add a form trigger:

  1. Navigate to the Triggers page and click New Trigger

  2. Select Form as the trigger type

  3. Choose an existing workflow or click + to create a new one

  4. Optionally name the trigger and import a form definition JSON file

  5. Click Create Trigger — you’ll be taken directly to the form builder

New Trigger dialog on the Triggers page with Form selected as the trigger type, a target workflow picker, and an optional form definition import section
  1. Open a workflow in the builder

  2. In the Library sidebar under Triggers, click Form

  3. A form trigger node appears on the canvas — click it to configure

Workflow builder showing the Form trigger option in the Library sidebar and a Form node on the canvas

Once added, you should provide a unique form name. QuickFlo will generate a unique URL for the form using the name you provide. Click the trigger node to see the URL, edit the form, or open it in a new tab.

Edit Form Trigger dialog showing the form name, public URL, title, and field count
FieldDescription
NameHuman-readable identifier for the trigger (optional)
Form URLThe public URL where the form is hosted — share this with users
TitleThe form title shown at the top of the page
FieldsSummary of configured fields

Click Edit Form to open the form builder.

The form builder is a visual drag-and-drop editor with three panels:

Form builder with field palette on the left, form layout in the center, and live preview on the right

Fields palette (left) — drag field types onto the form:

CategoryField Types
Basic InputsText, Long Text, Number, Email, Phone, Password
SelectionDropdown, Multi-Select, Checkbox
SpecialFile Upload, Date

Form layout (center) — arrange fields, set labels, mark fields as required, and configure field IDs. The field ID is the key used to access the value in your workflow (e.g., a field with ID first_name is accessed as {{ initial.first_name }}).

Live preview (right) — see exactly what the form looks like to end users as you build it. The preview updates in real-time as you add and configure fields.

Click any field in the form layout to configure it:

  • Label — the display name shown to users
  • Field ID — the key used in template expressions (auto-generated from the label, or set manually)
  • Required — whether the field must be filled before submission
  • Placeholder — hint text shown inside the input
  • Default value — pre-filled value (optional)

For Dropdown and Multi-Select fields, you also define the list of options.

The form builder’s Options menu (vertical dots icon in the header) lets you export and import form definitions as JSON files:

  • Export Definition — Downloads a .json file containing the form’s schema, metadata, and auth configuration. Use this to back up a form, share it with a teammate, or duplicate it across workflows.
  • Import Definition — Upload a previously exported .json file to replace the current form’s fields and settings. You can also import a form definition during trigger creation from the Triggers page.

Click the settings gear icon in the form builder toolbar to open Form Settings.

Form Settings showing branding options, access control with credential authentication, bulk upload toggle, and error handling

Customize the look of your hosted form page:

FieldDescription
Logo URLURL of an image displayed at the top of the form
Page TitleCustom browser tab title (defaults to the form title)
Favicon URLCustom favicon for the hosted form page
LayoutContainer width preset — narrow, standard, wide, or full. Use narrow for short auth forms, wide or full for forms with many sections or wide tables.
  • Success message — shown to users after a successful submission (or use a Return step to control the response dynamically)
  • Error message — custom message shown when submission fails

Enable bulk upload mode to let users upload a CSV file to submit multiple entries at once. Each row in the CSV becomes a separate workflow execution.

Toggle Expose detailed error messages to control whether users see the actual error message from the workflow or a generic error. Keep this off in production to avoid leaking internal details.


By default, forms are public — anyone with the URL can submit them. To restrict access, you can require users to sign in with credentials before seeing the form.

Form users are managed as Form Auth connections. Each connection represents a username/password credential.

  1. Navigate to Connections in the QuickFlo sidebar

  2. Click New Connection and select Form Auth

  3. Fill in the credentials:

    Form Auth connection dialog with username, password, and optional metadata fields
    FieldDescription
    UsernameThe user’s identifier (email, username, etc.)
    PasswordPassword for form access
    MetadataOptional key-value pairs passed to the workflow on submission (e.g., department, role, permissions)
  4. Click Save

You can create as many Form Auth connections as you need — each represents a different user who can access the form.

  1. Open the form builder and click the settings gear icon

  2. Under Access Control, change Authentication to Require credentials

  3. In Authorized Users, select the Form Auth connections that should have access

  4. Optionally add a Login Hint — a message displayed on the sign-in screen (e.g., “Use your company email and the password provided by your admin”)

  5. Close settings and save the workflow

Now when someone visits the form URL, they’ll see a login screen before the form loads. Only users with matching Form Auth credentials can access it.


For longer forms, group fields into sections that render as a tabbed interface. Each section is a labelled tab the user can flip between, with its own subset of fields.

Open the form trigger config and add sections to the form config. Each section defines the keys of the fields it contains (the fields must already exist in the form):

{
"sections": [
{
"key": "contact-info",
"label": "Contact Info",
"icon": "user",
"description": "How can we reach you?",
"fields": ["first_name", "last_name", "email", "phone"]
},
{
"key": "company",
"label": "Company",
"icon": "building",
"fields": ["company_name", "company_size", "industry"]
},
{
"key": "details",
"label": "Use Case",
"fields": ["use_case", "timeline"]
}
]
}
FieldDescription
keyStable identifier — exposed to the workflow as {{ initial.form.section }}
labelTab label shown to the user
iconOptional icon name displayed next to the tab label
descriptionOptional helper text shown above the section’s fields
fieldsArray of field names from the form to include in this section. Fields not assigned to any section render outside the tabs.

Inside the workflow, the section the user submitted from is available at {{ initial.form.section }}, which is useful for routing or analytics.


A prefill workflow runs before the form renders and returns initial values for the form fields. Use it to look up a customer record by query string and pre-populate name/email/phone, prefill default values pulled from your CRM, or seed a form from a token in the URL.

Configure it on the form trigger by pointing prefill.workflowId at another workflow:

{
"prefill": {
"workflowId": "wf_lookup_customer",
"timeoutMs": 10000
}
}
FieldDescription
workflowIdThe workflow to run before rendering the form. Receives the page query string as initial, plus any prefill context the form provides.
timeoutMsHard timeout for the prefill workflow (1,000–30,000 ms, default 10,000).

The prefill workflow’s Return step writes a formPrefill object whose fields map carries partial JSON Schema overrides per field. The most common override is default (which pre-populates a value), but you can also restrict dropdown options via enum, hide fields via visible: false, or mark them read-only:

{
"formPrefill": {
"fields": {
"first_name": { "default": "Jane" },
"email": { "default": "jane@acme.com", "readonly": true },
"region": { "enum": ["US", "CA"], "default": "US" },
"internal_notes": { "visible": false }
}
}
}

See Return Step — Form Prefill Response for the full list of supported overrides.


A confirmation workflow runs after the user clicks Submit but before the main workflow runs. It returns a summary that QuickFlo shows to the user in a confirmation dialog — the user has to explicitly approve before the main workflow executes. Use it for showing a quote, calculated total, or any “review and confirm” UX.

{
"confirmation": {
"workflowId": "wf_calculate_quote",
"timeoutMs": 10000
}
}
FieldDescription
workflowIdThe workflow to run before final submission. Receives the form values as initial.
timeoutMsHard timeout for the confirmation workflow (1,000–30,000 ms, default 10,000).

The confirmation workflow’s Return step should return a formConfirmation summary object:

{
"formConfirmation": {
"title": "Confirm your order",
"summary": "You're about to submit this for review.",
"items": [
{ "label": "Plan", "value": "Pro" },
{ "label": "Total", "value": "$99/mo" }
],
"warningMessage": "Cancellation is subject to our refund policy."
}
}

QuickFlo shows the title, summary, items, and any warning to the user before they confirm. If the user cancels at the confirmation step, the main workflow never runs.


When a form is submitted, the field values are available in the workflow via {{ initial.* }}:

{{ initial.first_name }}
{{ initial.email }}
{{ initial.group }}

The form context object provides submission metadata:

{{ initial.form.formName }}
{{ initial.form.submittedAt }}
{{ initial.form.triggerId }}

For authenticated forms, the user’s identity is also available:

{{ initial.form.authenticatedUser.username }}
{{ initial.form.authenticatedUser.connectionName }}
{{ initial.form.authenticatedUser.metadata.department }}

For sectioned forms, the key of the section the user submitted from is exposed as:

{{ initial.form.section }} // e.g. "contact-info" or "billing"

By default, users see a generic success message after submitting. To customize the response, add a Return step to your workflow — the step editor shows a Form Response tab when the workflow has a form trigger.

Return step Form Response tab showing response type, message, description, redirect URL, response details, and action buttons
FieldDescriptionExample
Response TypeThe visual style of the response screenSuccess, Error, Warning, Info
MessageMain heading shown to the user — supports templatesThanks, {{ initial.name }}! Your submission was received.
DescriptionOptional subtitle below the headingWe'll review your submission and get back to you shortly.
Redirect URLIf set, redirects the user instead of showing a message — supports templateshttps://example.com/thank-you?ref={{ initial.email }}

All text fields support template expressions, so you can personalize the response with the submitted form data or values from earlier workflow steps.

The Response Type dropdown controls the icon and color theme of the response screen:

Response Type dropdown showing Success, Error, Warning, and Info options with colored icons
TypeIconUse Case
SuccessGreen checkmarkSubmission processed successfully
ErrorRed exclamationSubmission failed or was rejected
WarningYellow triangleSubmission accepted with caveats
InfoBlue infoInformational acknowledgment

Add key-value pairs that are displayed below the message as a structured data table. This is useful for showing the user results from the workflow — like a reference number, a summary of what was processed, or data fetched from an API.

LabelValue
leads{{ http-get-leads.body }}
Reference ID{{ $util.uuid }}

Click + Add Detail to add more rows. Objects and arrays are rendered as formatted tables automatically.

Add buttons to the response screen for follow-up actions. Each button has a label, URL, mode, and style.

Action Buttons configuration showing two buttons with label, URL, mode, and style fields
FieldDescription
LabelButton text — supports templates
URLThe target URL — supports templates (e.g., https://my-crm.com/orders/{{ http-create-order.body.orderId }})
ModeOpen Link opens the URL in a new tab. Send Request fires an HTTP request to the URL without navigating away — useful for triggering another webhook or workflow. In Send Request mode the button shows loading and success/error states based on the request outcome, so users get immediate feedback without leaving the response screen.
StylePrimary (filled), Secondary (neutral filled), or Outline (bordered)

Click + Add Action Button to add more. Buttons appear at the bottom of the response screen in the order you define them.

Successful submission — the response screen shows the message, response details as a formatted table, action buttons, and a “Make Another Submission” link:

Form success response showing a green checkmark, thank you message, Leads data table, and View Order Details and Submit Notification action buttons

Failed submission — if the workflow errors and “Expose detailed error messages” is enabled in form settings, the user sees the error message along with the execution ID for debugging:

Form error response showing a red icon, Submission Failed heading, error message, execution ID, and Try Again button