User input block
Ask the customer a question. Their next text reply is saved into a custom field (persistent across flows) and the flow advances via the “On answer” socket.
Config
- Question to the customer — the prompt text. Supports
{{autocomplete for variables. - Save answer to — dropdown of CONTACT custom fields. Picking saves the reply to
ContactProfile.attributes[[key]]automatically. A sticky + Create new contact field row opens an inline dialog if you need a field that doesn’t exist yet. - Max retries — how many times to send the retry message on invalid input. (Phase 1: input is accepted as-is; validation per field type lands in a later phase.)
- Retry message — text shown on retry. Optional.
Runtime behaviour
Question is sent
The runtime sends the question as a plain text message.
Flow parks
The runtime stamps runVars._awaitingInputFor = "[field key]" + currentStepId on
the FlowState. Flow stays ACTIVE at this step.
Customer types anything
The webhook’s text-inbound handler calls advanceOnText, which:
- Checks the awaiting-input marker
- Saves the text to
runVars[fieldKey]AND toContactProfile.attributes[fieldKey] - Clears the marker
- Advances via the “On answer” socket (or the canvas-level “Continue” socket as a fallback)
Two output sockets
- On answer → — the natural one. Wire this to your next step.
- Continue — fallback; used when “On answer” isn’t wired.
Picking up the saved value
Downstream blocks reference the saved value as {{contact.[field key]}} (because
it’s persisted) OR {{run.[field key]}} (because it’s also in runVars for the rest of
the run). Either works.
If Save answer to is blank, the reply is dropped to a sentinel __discard__ and
the flow still advances. Useful for “any text continues” patterns. Just don’t expect
to reference the answer later.