Skip to main content

Storage Module

Read and edit CSV files and store files per Workspace the same files you manage on the Storage page.

The Storage Module gives every Workspace a built-in file store that people and workflows share. Files you upload or edit on the Storage page are the exact same files your Tasks read and write no external bucket, no credentials to configure. The Module adds three Tasks: Csv (read and edit CSV rows), File (read, write, or delete whole files), and ListFiles (enumerate stored files). Environment configuration is optional the only setting is the CSV delimiter.

What you can build

  • Lead capture collect a name and email in a chat conversation with the Standard Module's InputTask and append them as a row to leads.csv with Csv (Append rows).
  • Lookup tables keep prices, order statuses, or FAQ routes in a CSV you edit in the portal, and read the matching rows at runtime with Csv (Query rows).
  • Simple state between Sessions one Session writes state.json with File (Write file), a later Session reads it back with File (Read file).
  • Reports a Process started by the Scheduler Module's ScheduleRecurring event builds a summary and writes it to a dated file, ready to download from the Storage page.
  • Shipped reference data embed a small read-only table directly inside a Csv Task (Inline table) so it versions together with the Process.

How it works

Every file lives in your Workspace's storage area and is identified by its plain file name (for example customers.csv no folders, no slashes). Each Task has a Save location choice that decides which copy of the file it touches:

  • This environment (default) a separate copy per Environment, so your development, staging, and production deployments each work on their own file.
  • Workspace (shared) one copy shared by every Environment in the Workspace. Use it for reference data you upload once.

The Storage page in the portal browses the same files: Workspace-shared files appear at the root, and each Environment's files appear in its own folder under env · per-environment. A CSV you edit in the portal's spreadsheet grid is the CSV your workflow reads on the next Session, and a file a workflow writes shows up on the page immediately.

All three Tasks are generic they run identically on every Channel.

Configuration

Configuration is per Environment, set in the Module's Environment configuration. Every field is optional.

FieldTypeRequiredDescription
CSV delimiterstringNoSingle character separating CSV columns, used when reading and writing CSV files. Use a literal character, e.g. , or ; or a tab. Default: ,.

Limits

  • Everything in storage counts against the storage limit of your Service Plan. The Dashboard's Storage card shows your current usage against the limit; a write that would exceed it stops the Session with error 9007.
  • Uploads through the Storage page are capped at 25 MB per file.
  • An inline table inside a Csv Task holds at most 1,000 rows.

Tasks

In the Process Editor's replace menu the three Tasks appear as Csv, File, and ListFiles. All of them write their result to an output variable type a variable name (no braces) and pick its type; later Tasks read it as {name}.

Csv (Generic)

Reads or edits a CSV file one Operation selector chooses between reading rows, appending rows, updating matching rows, deleting matching rows, or querying rows without changing the file.

Operation

OperationWhat it does
Read rowsLoads the whole CSV and outputs its rows. Default.
Append rowsAdds one or more rows to the end of the file. If the file does not exist yet, it is created with columns taken from the appended rows.
Update rowsApplies a set of field values to every row whose Match column equals Match value.
Delete rowsRemoves every row whose Match column equals Match value.
Query rowsOutputs only the rows whose Match column equals Match value, without changing the file.

Properties

PropertyTypeRequiredExampleDescription
OperationselectYesRead rowsWhat to do with the CSV file. Options: Read rows (default), Append rows, Update rows, Delete rows, Query rows.
SourceselectYesStorage fileWhere the CSV lives. Storage file (default) reads/edits a file in the Storage view; Inline table embeds a small read-only table in this Task (Read/Query only).
File namestringWhen Source = Storage filecustomers.csv or {fileName}Name of the CSV file. No slashes a single file inside the chosen save location. Supports {variable}.
Save locationselectNoThis environmentWhere the file lives. This environment (default) keeps a separate copy per Environment; Workspace (shared) shares one copy across every Environment. Shown when Source = Storage file.
Inline tableCSV editorWhen Source = Inline tablea 3-column table of routesSmall CSV table stored inside this Task upload a CSV or edit cells (max 1,000 rows). Ships with the workflow version and is read-only at runtime; use a Storage file for data workflows modify.
Rows formatselectNoJSONHow the Rows field below is written: JSON (default) an array of objects or CSV table CSV text, a header line plus one line per data row. Shown for Append rows / Update rows with Source = Storage file.
Rowscode editorFor Append rows[{"id":"1","name":"Ada"}]The incoming rows. JSON: an array of row objects. CSV: a header line followed by one line per data row e.g. id,name on the first line, then 1,Ada on the next; a header alone is rejected with "Rows (CSV) must contain a header row plus at least one data row". For Append rows each row is added; for Update rows the first row's fields are applied to every matching row. Type { to autocomplete a workflow {variable} values containing quotes or newlines are escaped automatically in JSON mode.
Match columnstringFor Update rows, Delete rows, Query rowsidColumn whose value selects the rows to update, delete, or return. Supports {variable}.
Match valuestringNo42 or {orderId}Rows whose Match column equals this value are selected (exact, case-sensitive match). Supports {variable}.
Output formatselectNoRows (structured)Shape of the result for Read rows / Query rows: Rows (structured) (default) for use in later Tasks, JSON text, or CSV text.
Indent JSONbooleanNooffPretty-print the JSON text output instead of a single compact line. Shown when Output format = JSON text. Default: off.
Output VariableoutputYesordersReceives the result: the rows (Read/Query, shaped per Output format) or a number the file's new total row count (Append), rows changed (Update), or rows removed (Delete).

Behavior

  1. The Task resolves any {variable} placeholders in File name, Match column, Match value, and Rows, then opens the CSV in the chosen save location using the Environment's CSV delimiter.
  2. It runs the chosen Operation. Row matching (Update rows / Delete rows / Query rows) compares the Match column's cell to Match value exactly, case-sensitively. Update rows can also introduce new columns: fields in the update row that don't exist yet are added as new trailing columns.
  3. Editing Operations save the file back; Read rows and Query rows leave it untouched.
  4. It writes the result to the output variable the rows for Read rows / Query rows, a number for the editing Operations.

With Source = Inline table, only Read rows and Query rows are allowed the table ships with the deployed workflow version and is read-only at runtime. Any other Operation stops the Session with an error telling you to use a Storage file instead.

Example Append rows

A signup workflow stores {name} = Ada Lovelace and {email} = ada@example.com. A Csv Task with Operation Append rows, Source Storage file, File name leads.csv, Save location Workspace (shared), Rows format JSON, Rows [{"name":"{name}","email":"{email}"}], and Output Variable total adds one row to leads.csv. If the file didn't exist, it is created with columns name and email. {total} now holds the file's row count, and the new row is visible on the Storage page.

Example Query rows

orders.csv (Workspace shared) has columns id, status, eta. With Operation Query rows, File name orders.csv, Save location Workspace (shared), Match column id, Match value {orderId}, Output format Rows (structured), and Output Variable orders, the Task outputs the matching rows as an array of row objects one entry per match, each column readable as text without modifying the file.

warning

Matching is exact and case-sensitive Ada does not match ada, and extra whitespace in the cell counts. Normalize values before writing them if you plan to match on them later.

File (Generic)

Reads, writes, or deletes a whole file the non-tabular counterpart to Csv, for text content such as notes, JSON, or generated reports.

Properties

PropertyTypeRequiredExampleDescription
OperationselectYesRead fileWhat to do with the file. Options: Read file (default), Write file, Delete file.
File namestringYesnotes.txt or {reportName}Name of the file. No slashes a single file inside the chosen save location. Supports {variable}.
Save locationselectYesThis environmentWhere the file lives. This environment (default) keeps a separate copy per Environment; Workspace (shared) shares one copy across every Environment.
ContenttextFor Write file{documentBody}Text to write. Accepts a {variable} or literal text. Used by Write file only.
Output VariableoutputYesfileTextReceives the result: the file's text (Read), the number of bytes written (Write), or true/false whether a file was deleted (Delete).

Behavior

  1. The Task resolves any {variable} placeholders in File name (and Content for Write file).
  2. Read file outputs the file's text content; if the file does not exist, the output variable is empty. Write file saves the resolved Content to the named file, creating it or overwriting it completely. Delete file removes the file and outputs true, or false when there was nothing to delete.
  3. The result lands in the output variable and the Token continues.

Example

A support workflow builds a summary in {summary}. A File Task with Operation Write file, File name handoff-{Id}.txt ({Id} is always available it resolves to the Session's unique identifier), Save location This environment, Content {summary}, and Output Variable written saves the text under this Environment's folder. {written} holds the number of bytes written, and the file appears on the Storage page under env · per-environment, in that Environment's folder.

danger

Delete file permanently removes the file, and Write file replaces the previous content entirely neither can be undone. Download a copy from the Storage page first if you might need the old content.

ListFiles (Generic)

Lists the files in the chosen save location useful for iterating over stored files in a workflow.

Properties

PropertyTypeRequiredExampleDescription
Save locationselectYesThis environmentWhich area to list. This environment (default) lists this Environment's files; Workspace (shared) lists the shared files.
Name prefix (optional)stringNoreport-Only return files whose name starts with this text (exact, case-sensitive). Leave blank to list everything. Supports {variable}.
Output VariableoutputYesfilesReceives the array of files. Each entry has name, sizeBytes, and updatedAt (ISO-8601 timestamp).

Behavior

  1. The Task lists the files directly in the chosen save location This environment returns only this Environment's files, Workspace (shared) returns only the shared files, never a mix.
  2. If Name prefix is set, only files whose name starts with it (case-sensitive) are kept.
  3. It writes the result to the output variable as an array of objects, each with name, sizeBytes, and updatedAt.

Example

The Workspace-shared area holds report-2026-06.csv, report-2026-07.csv, and logo.png. A ListFiles Task with Save location Workspace (shared), Name prefix report-, and Output Variable reports outputs an array of two entries; a downstream JSTask can loop over context.reports to process each one.

Storage page

The Storage page open Storage in the sidebar is the file browser for everything this Module works with. It lists the files stored in your Workspace; open a file to preview, edit CSV or text, download, or delete.

Layout

At the root you see the Workspace (shared) files directly, plus folders:

  • env · per-environment one subfolder per Environment (labeled with the Process and Environment names) holding that Environment's files, i.e. what Tasks with Save location This environment read and write.
  • Module folders other Modules that keep their own data appear as separate folders.

A breadcrumb across the top tracks where you are; click any crumb to jump back up.

File list

FieldDescription
NameFile name with a type icon. Click it to open the preview side panel.
SizeFile size (B / KB / MB / GB).
UpdatedWhen the file last changed. The list sorts by this column, newest first, by default.
ActionsPer-file buttons: Preview, Download, Edit (editable types only), Delete.

The list supports sorting, per-column filtering, and paging (20 files per page). The preview side panel renders CSV (first 200 rows), text, HTML, images, PDF, audio, and video; other types offer a download instead.

Editing a file

Click a file's Edit action (or Edit in the preview panel) to open the full-page viewer:

  1. CSV files open in a spreadsheet grid edit any cell, Add row, add a column (type its name, then Add column), or remove rows and columns with their inline buttons.
  2. Text and HTML files open in a text editor.
  3. Click Save to write the file back running workflows see the new content on their next read.
  4. The viewer also offers Back, Download, and Delete.

Every collaborator can view, preview, and download files, whatever their Role; uploading, editing, and deleting require the Owner or Admin Role. When you edit a file inside another Module's folder, a banner warns you that changing it may affect that Module's behavior.

Uploading

  1. Navigate to where the file should live: the root for Workspace (shared) files, or an Environment's folder under env · per-environment for that Environment's files.
  2. Click Upload file and pick the file up to 25 MB, in one of the supported types: .csv, .txt, .json, .xml, .md, .log, .yml, .yaml, .html, .htm, images (.png, .jpg, .jpeg, .gif, .webp, .svg, .bmp), .pdf, audio (.mp3, .wav, .ogg, .m4a), and video (.mp4, .webm, .mov).
  3. If a file with the same name already exists there, you're asked whether to replace it.
danger

Deleting a file from the Storage page can't be undone. Download a copy first if in doubt.

Common recipes

Capture chat leads into a CSV

Ask a chat user for their name and email with the Standard Module's InputTask, append them to a shared CSV, and confirm the growing leads.csv is ready to review or download on the Storage page at any time.

  1. InputTask (Standard Module) asks "What's your name?" and stores the reply in name.
  2. InputTask (Standard Module) asks "And your email address?" and stores the reply in email.
  3. Csv Operation Append rows, Source Storage file, File name leads.csv, Save location Workspace (shared), Rows format JSON, Rows [{"name":"{name}","email":"{email}"}], Output Variable total.
  4. OutputTask (Standard Module) replies Thanks {name} you're on the list!.

Look up an order and answer with its status

Query a CSV of orders by the ID the user typed, branch on whether a row was found using the JavaScript Module's JSTask, and reply accordingly. Keep orders.csv up to date by editing it in the portal grid no redeploy needed.

  1. InputTask (Standard Module) asks "What's your order number?" and stores the reply in orderId.
  2. Csv Operation Query rows, Source Storage file, File name orders.csv, Save location Workspace (shared), Match column id, Match value {orderId}, Output format Rows (structured), Output Variable orders.
  3. JSTask (JavaScript Module) script:
    var hit = (context.orders || [])[0];
    if (hit) { context.orderStatus = hit.status; context.orderEta = hit.eta; }
    session.TaskOutput = hit ? 'found' : 'missing';
    Label the two outgoing Sequence Flows found and missing.
  4. found branch OutputTask (Standard Module) replies Order {orderId} is {orderStatus}, expected {orderEta}.
  5. missing branch OutputTask (Standard Module) replies I couldn't find order {orderId} please check the number and try again.

Best practices

  1. Pick the save location deliberately. Keep runtime data on This environment so tests never touch production files, and put shared reference data you upload once on Workspace (shared).
  2. Prepare CSVs in the portal. Create and shape lookup files in the Storage page's spreadsheet grid, then have workflows only read or append cleaner than building files from scratch at runtime.
  3. Use an inline table for fixed data. Small read-only tables that belong to the workflow's logic (route maps, price tiers) version and deploy together with the Process; use a Storage file only for data that changes.
  4. Normalize before matching. Row matching is exact and case-sensitive lowercase and trim values (for example with the Standard Module's StringNormalizationTask) before writing them to columns you'll match on.
  5. Watch your storage usage. The Dashboard's Storage card shows usage against your Service Plan; delete files you no longer need from the Storage page.

Error codes

CodeNameDescription
3005TaskInvalidDataA required field is empty, the file name is invalid (e.g. contains slashes), the Rows input isn't a valid JSON array or CSV table, a mutating Operation was used on an inline table, or the output field is not a valid variable name. See full details
4006ModuleGenericExceptionAn unexpected error occurred while reading or writing the file the audit message contains the details. See full details
9007PlanStorageLimitReachedThe write would exceed the storage limit of your Service Plan. Free up space on the Storage page or upgrade your plan. See full details