Every step inside a Flusso questionnaire is a node. This reference documents all available node types: what each one does, how to configure it, and what role it plays in a respondent's session. Nodes are connected by edges on the graph canvas to define the flow a respondent follows.
The core building block of every questionnaire. A Question node presents a prompt to the respondent and waits for their reply before advancing the session to the next node. The node's answer type determines what kind of input is accepted and how many output ports the node exposes on the canvas.
| Field | Description |
|---|---|
| Question text | The prompt shown to the respondent. Plain text only. |
| Answer type | Controls what kind of reply is accepted and how output ports are generated. See the Answer Types table below. |
| Options | (Single Choice and Single Choice + Other only) The list of choices presented to the respondent. Each option has a key (used internally as the port handle and answer identifier) and a label (shown to the respondent). |
Each answer type generates a different set of output ports on the right edge of the node. Connect each output port to the node the session should advance to when that answer is given.
| Answer type | Output ports | Notes |
|---|---|---|
| Boolean (Yes / No) | Yes, No | Two fixed ports. Connect each to a different branch of your graph. When delivered via WhatsApp, Flusso accepts common affirmative/negative phrases and, if ambiguous, falls back to the configured AI provider. |
| Single Choice | One port per option | Define the list of choices. Each option becomes a named output port using the option's key. When delivered via WhatsApp, the respondent can reply with the option number, the label text, or a paraphrase — the AI classifier resolves ambiguous replies. |
| Single Choice + Other | One port per option, plus Other | Same as Single Choice but adds an extra Other port. If the respondent types a reply that does not match any listed option and AI classification cannot map it to a known choice, the session routes through Other. |
| Free Text | Answer | A single output port. The respondent types a free-form reply which is stored as-is. The AI classifier is not involved — all replies pass through the Answer port regardless of content. |
| Numeric Rating | One port per value (up to 10), or Answer | The respondent selects a numeric value from a configurable range. Configure Min, Max, and Step to define the scale (e.g. 1–5, 0–10). If the range produces 10 or fewer values, each value gets its own output port for per-value branching. If more than 10, a single Answer port is used instead. In the web embed, values are displayed as a horizontal row of buttons. |
| Multi-Select | Answer | The respondent selects one or more options from a list of checkboxes. Configure Min Selections (default 1) and optionally Max Selections to constrain how many options can be chosen. A single Answer port is used — the selected keys are stored as a comma-separated string. On WhatsApp, a "Done" button confirms the selection. |
| Validated Text | Answer | A single output port. Like Free Text, but the input is validated against a specific format: Email, Phone, or URL. Invalid entries are rejected with a validation error (you can set a custom error message). The web embed shows a format hint below the input field. |
| Likert Scale | One port per scale point | The respondent chooses from a set of labelled scale points (e.g. "Strongly Disagree" through "Strongly Agree"). Define each point with a key and label. Each point becomes a named output port, enabling per-sentiment branching. In the web embed, points are displayed as a horizontal row. |
Each question node can have up to 5 attachments — images, PDFs, or documents. Attachments are uploaded from the question node's config drawer in the editor. In the web embed, image attachments appear as a horizontal gallery above the answer controls, while non-image files (PDFs, docs) are shown as downloadable file cards with name and size. On WhatsApp, attachments are not sent inline — respondents access them via the web embed URL.
| Detail | Value |
|---|---|
| Max attachments per node | 5 |
| Max file size | 10 MB |
| Allowed formats | PDF, JPG, JPEG, PNG, GIF, WebP, TXT, DOC, DOCX |
| Storage | Files are stored privately on the server and served through a public token-gated endpoint. No external file storage is required. |
| Cleanup | When a node or questionnaire is deleted, its attachment files are automatically removed from storage. |
Each question node can include up to 20 FAQ entries — pairs of question and answer text that help respondents understand what is being asked. FAQs are added from the question node's config drawer in the editor.
A terminal node that ends the respondent's session. Every branch in a questionnaire graph must end at a Completion node — a session cannot advance past this point. The node is rendered in green on the canvas.
| Field | Description |
|---|---|
| Status | Success or Failure. Controls the icon and visual treatment shown to the respondent when the session ends. |
| Success message | Text displayed to the respondent when the session ends with Success status. |
| Failure message | Optional. Shown when status is Failure instead of the success message. |
| Redirect URL | Optional. After displaying the completion message, the web embed automatically redirects the respondent's browser to this URL. Has no effect for WhatsApp delivery. |
Each completion node can optionally export the respondent's answers to a Google Sheets spreadsheet when the session completes. This is configured in the completion node's config drawer under the Google Sheets Export section.
/spreadsheets/d/ and /edit.
| Mode | Description |
|---|---|
| Auto | Automatically exports all answers as a single row. Columns correspond to question nodes in graph traversal order. Headers are the question text (or node key if empty). Three metadata columns are appended: Session ID, Channel, and Completed At. On the first export to an empty sheet, a header row is inserted automatically before the data row. |
| Manual |
Uses a custom JSON template to define exactly which values to export. The template is a
JSON array of values with {{ "{{" }}answer.KEY{{ "}}" }} placeholders that
are resolved against the session's collected answers. Use this mode when you need a
specific column layout or want to include calculated values.
|
Makes an outbound HTTP request when the session reaches this node. The request fires in the background — the respondent is not blocked waiting for the response. Use this node to push session data to external APIs, CRMs, or webhooks mid-questionnaire. The node is rendered in amber on the canvas.
| Field | Description |
|---|---|
| URL | The endpoint to call. Must be a fully qualified URL (include https://). |
| Method | GET, POST, PUT, PATCH, or DELETE. |
| Body |
JSON body sent with the request (applicable for POST/PUT/PATCH). You can reference
answers collected earlier in the session using variable syntax:
{{ answers.question_key }}.
|
Fires a Flusso Workflow when the session reaches this node. Use this to hand off data collected during the questionnaire — such as answers, respondent metadata, or session state — into a full automation workflow for processing, enrichment, or notification. The node is rendered in purple on the canvas.
| Field | Description |
|---|---|
| Workflow ID | The ID of the Flusso workflow to trigger. The target workflow must have a Manual Trigger node as its entry point so it can accept an external payload. |
| Payload Mapping |
Maps questionnaire answer keys to workflow input variable names. Each row defines
one mapping: answer key → workflow variable name. The mapped values
are available in the triggered workflow as
{{ trigger.output.variable_name }}.
|
Sends an HTTP POST notification to an external URL when the session reaches this node. Similar to the HTTP node but specifically designed for webhook delivery patterns — it always sends a POST with a configurable JSON payload. The node is rendered in pink on the canvas.
| Field | Description |
|---|---|
| Webhook URL | The destination URL for the POST request. |
| Payload |
JSON body to send. You can embed session answers using variable syntax:
{{ answers.question_key }}.
|