Standard Module
The essential building blocks for every workflow — collect input, send output, route decisions, normalize text, set variables, call external APIs, delay, log, and raise errors.
The Standard Module provides the core Tasks that most workflows need. It includes I/O Tasks for collecting and sending messages, a routing Task for branching logic, language selection, string normalization, variable assignment, generic HTTP, scheduled delays, audit-log checkpoints, and explicit error throwing. This Module is typically the first one installed in any Process. Its Environment configuration is optional — you only need it to allow HttpTask access to specific internal hosts.
How it works
The Standard Module provides two kinds of Tasks. The I/O Tasks — InputTask, OutputTask, StartTask, and EndTask — are channel-specific: this Module ships their implementations for the Chat Channel, while Modules like Twilio, Aculab, and ACS provide implementations of the same Tasks for telephony Channels. The logic Tasks — SwitchTask, LanguageTask, StringNormalizationTask, SetVariableTask, HttpTask, DelayTask, LogTask, and ThrowErrorTask — are generic and work identically on every Channel.
Data moves through a Process as Session variables — named values stored in the running Session, written by one Task and readable by later Tasks as {name}. A typical turn collects a message with InputTask, transforms or evaluates it with logic Tasks, and replies with OutputTask.
Configuration
The Standard Module's Environment configuration is optional. Its single setting controls which internal hosts HttpTask may reach. Set it in the Module's Environment configuration — each Environment keeps its own list.
Allowed Internal Hosts
Hostnames or IP literals (exact match, case-insensitive) that HttpTask is permitted to call even when they resolve to a loopback / private / link-local address. Default: empty — every internal address is blocked.
| Field | Type | Required | Description |
|---|---|---|---|
| Allowed Internal Hosts | list of string | No | Exact hostnames (admin.internal) or IP literals (10.0.1.5). No wildcards, no CIDR. Default: empty. |
Add only the few internal endpoints your workflows legitimately need to reach. Entries that are neither valid hostnames nor IP literals are ignored.
Limits
- An HTTP request times out after at most 300 seconds, and a response body is rejected above 10 MB (the configurable per-Task values are capped at these ceilings).
- HttpTask follows at most 5 redirects per request.
- StringNormalizationTask rejects inputs longer than 1,000,000 characters and pipelines with more than 50 steps; a single regex match stops after 250 ms.
- SetVariableTask accepts at most 50 assignments per Task; each assigned value is capped at 64 KB.
- LogTask messages are truncated at 4,000 characters with a
…(truncated)marker. - DelayTask pauses are capped at 86,400 seconds (one day).
Tasks
InputTask (Channel: Chat)
Collects a message from the end user and stores it in the Session.
Properties
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Prompt Message | string | No | What is your name? | Message sent to the user before waiting for input. Supports {variable} placeholders. Default: empty (no prompt). |
| Store in Variable | string | Yes | userName | Store variable — type the variable name (no braces); the Task saves the user's reply there and later Tasks read it as {userName}. |
Behavior
- The Task sends the Prompt Message (if set) to the user.
- The Token pauses at this node and the Session waits.
- The next user message resumes the Token; the message text is written to the store variable.
Example
Prompt Message What is your name?, Store in Variable userName. The Session asks the question and waits. The user replies Maria; the Token resumes and {userName} now holds Maria, ready for a later OutputTask to greet the user with Hello {userName}!.
OutputTask (Channel: Chat)
Sends a message to the end user.
Properties
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Output Message | string | Yes | Hello {userName}, your request is complete. | The text to send to the user. Supports {variable} placeholders for dynamic values. |
Behavior
- The Task resolves every
{variable}placeholder against the current Session variables. - It sends the resulting text to the end user on the active Channel.
Example
Output Message Your order {orderId} has shipped. with {orderId} = A-1042 sends Your order A-1042 has shipped. to the chat user, and the Token immediately continues to the next node.
StartTask (Channel: Chat)
Marks where the workflow begins when a Session starts on the Chat Channel.
Properties
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| (none) | — | — | — | The StartTask has no configurable properties. |
Behavior
- A user opens the chat and the Session starts on the
ChatChannel. - The StartTask initializes the Session and passes the Token to the first connected node.
Example
A visitor sends their first message to your deployed Process. A new Session starts, the StartTask runs with no configuration, and the Token moves along the outgoing Sequence Flow — typically to an OutputTask that greets the visitor.
EndTask (Channel: Chat)
Closes the Session on the Chat Channel, optionally sending a final message.
Properties
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Goodbye Message | string | No | Thank you {userName}, goodbye! | Final message sent to the user before the Session ends. Supports {variable} placeholders. Default: empty (no message). |
Behavior
- If a Goodbye Message is set, the Task resolves its
{variable}placeholders and sends it to the user. - The Session is marked as completed.
Example
Goodbye Message Thanks {userName}, have a great day! with {userName} = Maria sends Thanks Maria, have a great day! and ends the Session. With the field left empty, the Session simply ends silently.
SwitchTask (Generic)
Routes the Token down one of several branches based on a Session variable. Works on all Channels.
Cases are evaluated top-to-bottom; the first matching case wins. When nothing matches, the Token is routed to the Default branch (ok if left blank). Multiple cases that share a Branch name act as an implicit OR. In the Process Editor, SwitchTask is placed as an Exclusive Gateway, and each Branch name must match the label of an outgoing Sequence Flow.
Properties
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Variable to evaluate | string | Yes | {userChoice} | Session variable (written as {name}) whose value drives the branch decision. |
| Default branch | string | No | other | Branch used when no case matches. Default: ok. |
| Cases | list of cases | Yes | — | Comparison rules, evaluated top-to-bottom; the first match wins. |
Each case:
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Op | string | No | Contains | How to compare: Equals, Contains, Regex, >, or <. Default: Equals. |
| Value | string | Yes | book | What to compare against. Supports {variable} placeholders. |
| Branch | string | Yes | booking | Branch to route to when this case matches; must match an outgoing Sequence Flow label. |
Equals is case-insensitive on text. When both sides are numbers, Equals, >, and < compare numerically (so 10 > 2 is true). For an exact case-sensitive text match, use Regex with a pattern like ^Value$.
Behavior
- The Task reads the Variable to evaluate from the Session.
- It checks each case in order; the first case whose comparison succeeds selects its Branch.
- If no case matches, the Default branch is selected.
- The Token follows the outgoing Sequence Flow whose label matches the selected branch.
Example
Route a customer-service conversation on {userChoice}:
- Variable to evaluate =
{userChoice}. - Case 1: Op
Contains, Valuebook, Branchbooking. - Case 2: Op
Contains, Valuecancel, Branchcancel. - Default branch =
other.
When the user types I'd like to book a table, case 1 matches and the Token follows the Sequence Flow labeled booking.
LanguageTask (Generic)
Sets the conversation language used by downstream Tasks that support localization. Works on all Channels.
Properties
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Language (RFC 5646 tag) | string | Yes | it-IT | Language/region tag, e.g. en-US, it-IT. Supports {variable} placeholders. The value must be a valid RFC 5646 tag. |
Behavior
- The Task resolves the Language value (including any
{variable}placeholder). - It validates the tag and sets it as the Session's conversation language.
- Downstream Tasks with locale-aware behavior use it as their automatic fallback.
Example
Language it-IT early in the Process makes later locale-aware Tasks — for example the Date Module's FormatDate — render output in Italian (25 dicembre 2026) without setting a Locale on each Task individually.
StringNormalizationTask (Generic)
Transforms a string variable through an ordered pipeline of operations. Works on all Channels.
Properties
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Input Variable | string | Yes | {userInput} | Session variable (written as {name}) whose value is normalized. |
| Output Variable | string | Yes | cleanInput | Store variable — type the variable name (no braces); the Task saves the transformed result there and later Tasks read it as {cleanInput}. |
| Normalization Steps | list of steps | Yes | — | Up to 50 operations, applied in order. |
Each step:
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Operation | string | Yes | ReplaceRegex | One of: Trim, ToLower, ToUpper, RemoveDiacritics, ReplaceText, ReplaceRegex. |
| Find text | string | Yes for ReplaceText | Mr. | Shown when Operation is ReplaceText. Substring to find. Supports {variable} placeholders. Must be non-empty. |
| Replace with | string | No | Mister | Shown when Operation is ReplaceText. Replacement text. Supports {variable} placeholders. Default: empty (removes the found text). |
| Regex pattern | string | Yes for ReplaceRegex | \s+ | Shown when Operation is ReplaceRegex. .NET regular expression; the form validates the pattern as you type and offers presets. |
| Replace match with | string | No | | Shown when Operation is ReplaceRegex. Replacement string; substitutions like $1, $2, ${name} are honored. Supports {variable} placeholders. Default: empty (removes the match). |
Behavior
- The Task reads the Input Variable's value from the Session.
- It applies every step in order, each step receiving the previous step's output.
- It writes the final result to the Output Variable.
Example
Input Variable {rawName}, Output Variable cleanName, Steps: Trim → RemoveDiacritics → ToLower. With {rawName} = " José ", the result {cleanName} is "jose" — ready for a reliable SwitchTask comparison.
Inputs longer than 1,000,000 characters are rejected with error 3005 (TaskInvalidData), and a regex step that takes longer than 250 ms to match is stopped. Keep patterns simple.
SetVariableTask (Generic)
Assigns or deletes one or more Session variables — composition, copying, or cleanup without writing a script. Works on all Channels.
Properties
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Assignments | list of assignments | Yes | — | Up to 50 rows, evaluated top-to-bottom. |
Each assignment:
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Variable | string | Yes | fullName | Store variable — type the variable name (no braces); later Tasks read it as {fullName}. |
| Mode | string | No | Set | Set writes Value into Variable; Delete removes Variable from the Session (Value is ignored). Default: Set. |
| Value | string | No | {firstName} {lastName} | Used only when Mode is Set. Supports {variable} placeholders, including variables set in earlier rows. Capped at 64 KB. |
Behavior
- Rows are evaluated top-to-bottom; later rows can reference variables set in earlier rows.
Setresolves the Value's placeholders and writes the result into the Variable.Deleteremoves the Variable from the Session; deleting an absent variable is harmless.- An unrecognized Mode is treated as
Setand a warning is written to the audit log.
Example
Compose a full name, then drop the secret used to fetch it:
| Variable | Mode | Value |
|---|---|---|
fullName | Set | {firstName} {lastName} |
apiKey | Delete |
With {firstName} = Maria and {lastName} = Rossi, the Task sets {fullName} to Maria Rossi and removes {apiKey} from the Session.
HttpTask (Generic)
Performs an outbound HTTP request and stores the response in a Session variable. Works on all Channels.
Properties
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| URL | string | Yes | https://api.example.com/users/{userId} | Absolute URL. Supports {variable} placeholders. Substituted values are not URL-encoded — avoid variables containing /, ?, &, or #, or encode them first with the JavaScript Module. |
| Method | string | Yes | POST | One of: GET, POST, PUT, PATCH, DELETE. Default: GET. |
| Timeout (seconds) | integer | No | 30 | Per-request timeout including reading the response body. Range 1–300. Default: 60. |
| Max Response (KB) | integer | No | 1024 | Reject responses whose (decompressed) body exceeds this size. Range 1–10240. Default: 4096 (4 MB). |
| Output Variable | string (object) | Yes | response | Store variable — type the variable name (no braces); the Task saves the response object { Status, Body, Headers, FinalUrl } there. |
| Headers | list of headers | No | Authorization / Bearer {apiKey} | Each row has a Name and a Value; both support {variable} placeholders. Set Content-Type here for requests with a body. |
| Body | string | No | {"name": "{userName}"} | Request body. Shown for POST, PUT, PATCH, and DELETE (hidden when Method is GET). Supports {variable} placeholders. |
Behavior
- The Task resolves
{variable}placeholders in the URL, headers, and body. - It validates the destination against the internal-address protection (see below).
- It sends the request and follows up to 5 redirects, re-checking each hop's destination; the
Authorizationheader is dropped when a redirect leaves the original site. - It writes the response object to the Output Variable:
Status(number),Body(text),Headers(name/value map), andFinalUrl— the URL the response actually came from, after any redirects. - On a non-2xx status, the Task output is set to
errorand an audit-log entry is added; an Exclusive Gateway after the Task can route on it. - On timeout, connection failure, redirect loop, or an oversized body, the Task output is set to
errorand the cause is logged.
Internal-address protection
By default, HttpTask refuses to call any address that resolves to a loopback, private-network, link-local, or cloud-metadata destination — for example localhost, 127.0.0.1, 10.x.x.x, 192.168.x.x, or 169.254.169.254. The check applies to the address the hostname actually resolves to, on every redirect hop, and fails closed when the name cannot be resolved.
To allow specific internal endpoints, list them in the Module's Environment configuration under Allowed Internal Hosts. Entries must be exact hostnames or IPs — no wildcards, no CIDR.
Reserved headers
The following request headers cannot be set from a Task: Host, Content-Length, Transfer-Encoding, Connection, Upgrade, Expect. A header containing a line break is rejected.
Example
URL: https://api.example.com/users/{userId}
Method: GET
Output Variable: response
With {userId} = 42, the Task calls https://api.example.com/users/42. After execution, {response.Status} is 200, {response.Body} holds the returned JSON text, and {response.FinalUrl} shows the URL the response came from after any redirects.
DelayTask (Generic)
Pauses the workflow for a fixed duration. Works on all Channels. In the Process Editor, DelayTask is placed as an Intermediate Catch Event.
Properties
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Delay (seconds) | integer | Yes | 300 | How long to pause before resuming. Range 1–86400 (one day). Default: 5. |
Behavior
- The Token suspends at this node.
- The platform resumes the Token automatically once the configured duration has elapsed.
- If the wake-up cannot be scheduled, the Task stops the Token and writes an explicit audit-log entry rather than leaving the workflow hanging.
Example
Delay (seconds) 300 between an OutputTask (We're checking your request…) and a follow-up HttpTask polls the external system five minutes later, without the user having to do anything.
LogTask (Generic)
Writes an explicit checkpoint to the audit log — a debug breadcrumb without writing a script. Works on all Channels.
Properties
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Severity | string | Yes | Warning | Info = audit-only breadcrumb. Warning = audit entry + flag the Session as exceptional (execution continues). Error = audit entry + stop the Token. Default: Info. |
| Message | string | Yes | Reached checkpoint X with userId={userId} | Message to write. Supports {variable} placeholders. Truncated at 4,000 characters with a …(truncated) marker. |
Behavior
- The Task resolves the Message's
{variable}placeholders. - It writes the message to the Session's audit log at the chosen Severity.
InfoandWarninglet the Token continue;Errorstops it.
Example
Severity Info, Message Order lookup done for {orderId}. With {orderId} = A-1042, the entry Order lookup done for A-1042 appears in the Session's audit log on the Sessions page, and the Token continues unchanged.
ThrowErrorTask (Generic)
Raises a workflow error with a custom message — halt outright, or route a controlled failure path. Works on all Channels. In the Process Editor, ThrowErrorTask is placed as an Intermediate Throw Event.
Properties
| Property | Type | Required | Example | Description |
|---|---|---|---|---|
| Mode | string | Yes | Branch | Stop halts the workflow. Branch marks the Task output as error so a downstream Exclusive Gateway can route to the error path. Default: Stop. |
| Message | string | Yes | Plan limit exceeded for {workspaceId} | Error message written to the audit log. Supports {variable} placeholders. |
Behavior
- The Task resolves the Message's
{variable}placeholders and writes it to the audit log. - With Mode
Stop, the Token halts and the Session is marked as failed. - With Mode
Branch, the Token continues along the outgoing Sequence Flow labelederror.
Example
Mode Branch, Message Inventory check failed for {sku}. When a prior lookup leaves {sku} = SKU-991, the error is logged and the Token follows the error Sequence Flow to an OutputTask that apologizes to the user instead of crashing the Session.
Common recipes
Route a chat conversation by user intent
Ask the user what they need, normalize the reply, and branch to the right answer.
- InputTask — Prompt Message
How can I help you today?, Store in VariableuserChoice. - StringNormalizationTask — Input Variable
{userChoice}, Output Variableintent, Steps:Trim→RemoveDiacritics→ToLower. This makes the comparison immune to stray spaces, accents, and capitalization. - SwitchTask — Variable to evaluate
{intent}; Case: OpContains, Valuebook, Branchbooking; Default branchother. Label the outgoing Sequence Flowsbookingandother. - OutputTask (booking branch) — Output Message
Great — let's get your booking started. - OutputTask (other branch) — Output Message
I can help with bookings. Could you rephrase your request?
Call an external API and report the result
Fetch data over HTTP, branch on the response status, and reply with either the result or an apology.
- HttpTask — URL
https://api.example.com/orders/{orderId}, MethodGET, Output Variableresponse. - SwitchTask — Variable to evaluate
{response.Status}; Case: Op<, Value300, Branchsuccess; Default brancherror. Label the outgoing Sequence Flowssuccessanderror. - SetVariableTask (success branch) — one assignment: Variable
summary, ModeSet, ValueOrder status: {response.Body}. - OutputTask (success branch) — Output Message
{summary}. - OutputTask (error branch) — Output Message
Sorry, we couldn't reach the order system. Please try again later.
Best practices
- Always pair Input with Output — a typical conversation turn is an OutputTask (prompt) or an InputTask Prompt Message, followed by reading the reply.
- Use SwitchTask for routing, not complex logic — for deeply nested conditions, use the JavaScript Module.
- Normalize early — apply StringNormalizationTask right after collecting user input so downstream comparisons see consistent data.
- Prefer SetVariableTask over scripts for trivial composition — it's faster, audited, and easier for non-developers to read. Use Mode
Deleteto scrub sensitive variables (API keys, tokens) from the Session once you're done with them. - Keep Allowed Internal Hosts minimal — every entry weakens the internal-address protection. Add only the exact hostnames or IPs your workflows need, and review the list whenever you add a new HttpTask integration.
- Use ThrowErrorTask intentionally — it marks the Session as failed in the audit view; reserve
Stopfor unrecoverable conditions andBranchfor controlled fallback paths. - Compare numbers as numbers — SwitchTask's
>and<compare numerically when both sides are numbers (so10 > 2is true).Equalsis case-insensitive on text; useRegexwith^value$for an exact case-sensitive match. - Keep delays purposeful — prefer short DelayTask pauses for polling or pacing; for long waits or recurring schedules, start the workflow on a schedule instead with the Scheduler Module.
Error codes
| Code | Name | Description |
|---|---|---|
| 3005 | TaskInvalidData | See full details |
| 4001 | ModuleException | See full details |
| 4009 | ModuleInputEmpty | See full details |
| 4012 | ModuleInvalidData | See full details |
| 4013 | ModuleLog | See full details |