Form Nodes
Every form is a graph of nodes connected on a canvas. Structure nodes define the entry point and group fields into screens; message nodes display content; data collection nodes create form fields and save their answers to variables. This page lists every node and its configuration, as it exists in the builder today. For how pages, channels, and publishing work, see the Forms Builder overview.
Each data collection node saves to a variable with an automatic type suffix:
| Node | Variable Suffix | Data Type |
|---|---|---|
| Text Input | _response | string (number when bound to a numeric variable) |
| Email Input | _email | string |
| Phone Input | _phone | string |
| Date Picker | _date | string |
| Location Input | _location | string |
| File Upload | _file | string |
| Password Input | _password | string |
| Opt-In Checkbox | _opt_in | boolean |
| Checkbox Group | _checkbox | array |
| Radio Buttons | _radio | string |
Structure
Start
The entry point of the form. It has no configuration — just a single outgoing connection to the first node. Every form needs exactly one Start node.
Page Start
Opens a page: a group of nodes rendered together as a single screen with one submit action. Carries the screen's presentation.
| Option | Description |
|---|---|
title | Screen title |
innerTitle | Inner title shown inside the screen body |
description | Description text under the title |
imageUrl | Optional header image for the screen |
Page End
Closes a page and defines how the customer submits it.
| Option | Description |
|---|---|
buttonText | Label of the submit button for the page |
message | Message shown with the page footer |
isTerminal | Marks the page as the end of the form |
Messages
Message
Displays one or more text messages without collecting data.
| Option | Description |
|---|---|
messages | List of text messages to display |
Send Image
Displays an image, optionally with a title and a continue button.
| Option | Description |
|---|---|
imageUrl | URL of the image |
altText | Alternative text for the image |
title | Optional title shown with the image |
buttonText | Optional label for the continue button |
width / height | Image dimensions |
aspectRatio | Aspect ratio of the image |
scaleType | contain or cover |
Interactive Options
Presents a set of options and branches the form: each option creates its own outgoing connection on the canvas, and the customer's choice decides the path. It controls navigation only — it does not save the selection as data (use Radio Buttons for that).
| Option | Description |
|---|---|
header | Optional header text |
text | Main body text of the prompt |
footer | Optional footer text |
buttonTitle | Label of the button that opens the options |
interactiveType | button or list presentation |
| Options | Each option has a label and its own outgoing connection |
Data Collection
All data collection nodes share a Save to Variable section where you bind the answer to a form variable (the type suffix from the table above is appended automatically).
Text Input
Free-text question. If the bound variable's data type is number, the field becomes numeric: WhatsApp renders it with input type number (numeric keyboard and validation) and the web renderer validates that the value is a valid number.
| Option | Description |
|---|---|
messages | Question text shown above the field |
selectedVariable | Variable that stores the answer (_response) |
selectedVariableType | Data type of the variable; number turns the field numeric |
Email Input
Email question with email-specific validation on both surfaces.
| Option | Description |
|---|---|
messages | Question text |
selectedVariable | Variable that stores the answer (_email) |
isMainEmail | Mark this as the borrower's main email |
isPointOfContact | Mark this address as a point of contact |
Phone Input
Phone number question.
| Option | Description |
|---|---|
messages | Question text |
countryCode | Default country code |
selectedVariable | Variable that stores the answer (_phone) |
isMainPhone | Mark this as the borrower's main phone |
isPointOfContact | Mark this number as a point of contact |
Date Picker
Native date selector with optional range constraints.
| Option | Description |
|---|---|
messages | Question text |
minDate | Earliest selectable date |
maxDate | Latest selectable date |
selectedVariable | Variable that stores the answer (_date) |
Location Input
Collects an address as text, with flags to integrate it into the borrower's profile.
| Option | Description |
|---|---|
messages | Question text |
selectedVariable | Variable that stores the answer (_location) |
saveAsAddress | Save the value directly as a borrower address |
isMainAddress | Mark this as the borrower's main address |
File Upload
Photo/file upload. On WhatsApp it renders the native photo picker and requires a server round-trip (data exchange) before the flow advances.
| Option | Description |
|---|---|
messages | Instruction text |
numberOfFiles | Number of files the customer must upload (min and max) |
selectedVariable | Variable that stores the result (_file) |
Password Input
Masked text input for sensitive values.
| Option | Description |
|---|---|
messages | Question text |
selectedVariable | Variable that stores the answer (_password) |
Opt-In Checkbox
A consent checkbox that stores true/false. On the web the value is seeded to false, so the variable is always present in the response even if the customer never touches the checkbox.
The checkbox label works in one of two exclusive modes:
- Static: a single
label, used on both WhatsApp and web. - Per-state (web only): two labels —
checkedLabelshown while checked,uncheckedLabelwhile unchecked — and the static label is not shown. These per-state labels only exist on the web; WhatsApp's native Opt-In has a single label, so it uses the checked text (the builder mirrorscheckedLabelintolabelfor this).
Switching back to static mode clears the per-state labels; the two modes are never combined.
| Option | Description |
|---|---|
messages | Opt-in message shown above the checkbox |
url | Optional URL linking to the full terms/policy |
label | Static checkbox label (static mode; on WhatsApp, always the label used) |
checkedLabel | Web-only label shown while the checkbox is checked |
uncheckedLabel | Web-only label shown while the checkbox is unchecked |
selectedVariable | Variable that stores the answer (_opt_in, boolean) |
Checkbox Group
Multi-select list — the answer is an array of the selected option IDs. Up to 20 options.
| Option | Description |
|---|---|
label | Group title above the options (max 30 characters) |
description | Help text below the label (max 300 characters) |
required | Whether at least one selection is mandatory |
minSelectedItems | Minimum number of options the customer must select |
maxSelectedItems | Maximum number of options the customer can select |
| Options | Up to 20; each has a title (max 30), an optional description (max 300), and an enabled state |
selectedVariable | Variable that stores the answer (_checkbox, array) |
The web renderer enforces required, minSelectedItems, and maxSelectedItems before letting the customer advance.
Radio Buttons
Single-select list — the answer is one option ID as a string. Up to 20 options, and each option can carry its own description as help text under the title.
| Option | Description |
|---|---|
label | Group title above the options (max 30 characters) |
description | Help text below the label (max 300 characters) |
required | Whether a selection is mandatory |
| Options | Up to 20; each has a title (max 30), an optional per-option description (max 300), and an enabled state |
selectedVariable | Variable that stores the answer (_radio, string) |
Unlike Interactive Options, Checkbox Group and Radio Buttons save the customer's selection as data instead of branching the flow.