Skip to Content
📚 Documentation is in active development — pages marked TODO will fill out over the next few weeks.
Flow BuilderBlock referenceUser input (ask a question)

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:

  1. Checks the awaiting-input marker
  2. Saves the text to runVars[fieldKey] AND to ContactProfile.attributes[fieldKey]
  3. Clears the marker
  4. 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.

Last updated on