English
Tables
A Table is a small database inside your organisation: rows and typed columns, which the team edits like a spreadsheet and which workflows read and write through the Table nodes. It answers two needs that a workflow cannot meet on its own:
- Lookup tables that nobody wants to write inside a node: "this county → this consultant", "this building → its manager", "this partner → their account manager". The team keeps them up to date; the workflow only reads them.
- A memory between runs. Each run of a workflow starts from scratch. A Table is the place where a workflow writes a state that outlives it: "case PSD-0142 → status, date of the last reminder", "this client already received the second reminder".
Tables are found under Tables in the main navigation. They belong to the organisation, not to one member.
What a table is made of
| Part | What it is |
|---|---|
| Name | The readable name, for example "Counties → consultants". It can be changed at any time. |
| Identifier | A short machine name (its "slug"), for example counties-consultants: lowercase letters, digits, - and _, starting with a letter. Left empty at creation, it is derived from the name. A node can designate a table by this identifier instead of picking it from the list. |
| Columns | An ordered list of typed columns (see below). A table needs at least one. |
| Key | One or more columns marked as part of the matching key, used by the nodes to find "the" row. |
| Refuse two rows with the same key | Whether two rows may share the same key. On by default. |
| Rows | The data. Each row records when it was created and changed, and by whom: a member, a workflow or an import. |
A table opens at /tables/<identifier> as well as at its opaque identifier, so a link to a table can be pasted in a conversation.
Columns and their types
Each column has a Heading (what people read), a Machine key (what workflows write), a Type, and two options: Required cell and Part of the matching key. A column of type Choice list also has its Allowed values, one per line (up to 100).
| Type | What a cell holds | What is accepted when writing |
|---|---|---|
| Text | text, as typed | anything |
| Number | a number | 1200.5, 1 200,50, 1.234,50, 1,234.50. A single comma followed by exactly three digits (1,234) is ambiguous and refused. |
| True or false | true or false | true/false, yes/no, oui/non, vrai/faux, y/n, o, x, 1/0, on/off |
| Date | a calendar date YYYY-MM-DD, with no time and no time zone | 2026-04-03 or the day-first form 03/04/2026, 3.4.26, 3-4-2026. A two-digit year means 20xx. The month-first (US) form is not accepted. |
| Date and time | an instant in UTC, ISO 8601 | 2026-04-03T14:30:00Z, 2026-04-03 14:30 (with or without offset). A date alone means midnight UTC. |
| Choice list | one of the allowed values | a value that matches an allowed value, ignoring case and accents; the allowed value is what is stored |
| Email address | an address, in lowercase | an address with an @ and a dot in the domain |
A value that cannot be converted is refused, never emptied or guessed. The refusal names the row and the column. An empty cell is stored as empty, never as an empty text, and a cell holds at most 4,000 characters by default.
The machine key of a column is lowercase letters, digits and _, starting with a letter. It is what you write in a node (county) and what you read in an expression ({{ data.find_consultant.row.county }}). Changing the heading breaks nothing. Changing the machine key rewrites every row, and workflows that use the old key must be updated.
The key
The key is a property of the table, not of the node. Mark one or more columns as Part of the matching key: "county", or "building" + "year". A node that looks up, updates or upserts a row only gives the values of these columns; the table knows which columns they are, so two workflows cannot match on two different columns by mistake.
- Matching ignores case, accents and punctuation. "Saint-Étienne", "SAINT ETIENNE" and "saint etienne" are the same key.
- A key is complete or absent. If one of the key columns of a row is empty, the row has no key: it is never matched by key, and it never conflicts with another row.
- Refuse two rows with the same key (on by default) suits a lookup table: two "county 69" rows are a typing mistake, and the second is refused when it is written (
tables.duplicate_key). Untick it for a log, where the same key comes back by design. A log can still be searched by key. - A table without a key cannot be used by the nodes that work by key: they fail with
table.no_keyinstead of matching a random row.
Creating a table
Only an administrator creates a table.
- Open Tables and click New table, or Import a CSV to start from a file.
- Give it a Name. Leave Identifier empty to derive it from the name.
- Edit the columns. The dialog proposes two to start with, Key (marked as key) and Value; rename them, change their type, remove them or add more. Tick Key on the columns that identify a row and Required on those that must never be empty.
- Keep or untick Refuse two rows with the same key.
- Click Create the table.
When you start from a CSV, the first line of the file proposes the columns, and the import opens right after the table is created.
From a workflow, the table picker of every Table node offers Create a table… to administrators: the same dialog opens, and the new table comes back selected. A member who is not an administrator sees that an administrator can create one from the Tables page.
Editing rows in the grid
An open table is a spreadsheet: click a cell to edit it, sort by a column, filter, search across every column, select several rows.
- Add a row opens a new row in the grid, in edit mode, with the cursor on its first cell.
TaborEntermoves to the next cell,Escaperemoves the row. The row is saved as soon as its required cells are filled, or when you click Save the row; an empty row is never saved.Enterat the end of the row opens another one, so you can type rows in a series. - Keyboard: arrows to move,
Enterto edit,Escapeto cancel,Tabfor the next cell,Deleteto clear. - Errors show under the cell that caused them: a required cell left empty, a value that does not read as the column type, a key that already exists.
- Deleting rows is done on a selection, and can be undone right away with Undo: the same rows come back with the same identifiers.
- Filters combine conditions on columns (equals, differs from, contains, does not contain, starts with, ends with, is greater or lower than, is empty, is not empty), with Every condition or At least one condition. Up to 20 conditions.
- Two people on the same cell. If someone else saved the cell while you were editing it, your entry is not saved: a banner shows What you typed and What is saved, and you choose Write my value anyway or Keep the saved value.
Changing the structure
Columns are managed from the grid: Add a column in the toolbar, or the "…" menu of a column header (also on right-click) to Rename…, Change the type… or delete the column. These actions are reserved to administrators; a member reads that the structure is managed by an administrator.
- Changing the type converts every cell. If one cell does not convert, the change is refused as a whole and the list of the cells concerned is shown. You can then Keep the current type, or Empty those cells and change the type: emptying them cannot be undone.
- Deleting a column loses its values on every row. The last column of a table cannot be deleted.
- Deleting the table removes its columns and rows for good. Workflows that read it will fail.
Before renaming or deleting, open Used by: it lists the workflows whose Table nodes target this table, says whether each one is published or a draft, and whether it Writes into it or Reads only. The list is computed from the workflows themselves, so it is always current.
Importing and exporting
Import works in two steps, and any member can import.
- The file. Paste what you copied from a spreadsheet, drop a file or pick one. Tabs, commas and semicolons are recognised; the separator is guessed unless you choose it. Untick The first line carries the headings when you paste an extract that starts straight with data: the columns are then taken in order. The content is limited to 4 MB.
- The columns. Five sample rows are shown with a suggested mapping, matched on headings and machine keys while ignoring case and accents ("Département" finds
departement). Pick Do not import for a column you want to leave out. - The options. Choose what happens when the key already exists:
| Option | Effect |
|---|---|
| Leave the existing row | nothing is written onto rows already there |
| Update the imported columns | only the columns in the file change; the others stay |
| Replace the whole row | columns missing from the file are emptied |
| Always append | the key is ignored and every line is added. This is a log's mode, and the only one possible on a table without a key. |
An administrator can also tick Empty the table before importing, the only way to replace the whole table with a file.
The result gives the number of rows created, updated, deleted and skipped. Each skipped line comes with its line number and its reason: a required cell is empty, a value does not read as the column type, the key is empty although the table has one, the key appears twice (in the file or already in the table), or the row limit is reached.
Export as CSV downloads the whole table: headings as the first line, semicolons as separators, UTF-8 with a byte-order mark so that spreadsheet software opens it correctly. Booleans are written true and false.
Who can do what
The structure belongs to administrators; the rows belong to the team.
| Action | Who |
|---|---|
| Create, rename, delete a table; change its options | administrators |
| Add, rename, retype, delete a column | administrators |
| Empty the table before an import | administrators |
| Add, edit, delete rows; import | every member |
| Read, search, export | every member |
| Read and write rows from a workflow | every workflow, through the Table nodes |
A workflow never changes the structure of a table: it cannot create a table or add a column.
Tables in workflows
Seven nodes work on Tables. Each one designates the table, either picked from the list or by its identifier, which may come from an expression.
| Node | What it does |
|---|---|
| Table — find a row | Finds one row by its key and routes the run to found or not_found. |
| Table — list rows | Returns the rows that match filters, sorted and capped, as an array ready for a Loop. |
| Table — insert a row | Adds a row; fails if the key is already taken and the table refuses duplicates. |
| Table — update a row | Changes the columns you name on the row with that key; fails if there is none. |
| Table — insert or update | Creates the row when its key is free, updates it otherwise. The node for memory between runs. |
| Table — delete a row | Removes the row with that key. Finding nothing to remove is a success. |
| Table — append a comment | Appends a dated line at the bottom of a text cell, never overwriting what it holds. |
Values written by a node go through the same conversion as in the grid: "1 200,50" written to a Number column is stored as 1200.5, and a value that does not convert fails the step. A column name that does not exist fails the step too, so a typo is visible.
Test runs. The two reading nodes read the real table. The five writing nodes write nothing: they return the row as it would be after the write, with the values converted, so the next step shows what it would receive. See Test runs.
Replays never write twice. Each write is recorded with the step that made it. When a step is retried or the run is resumed after an incident, the node finds its earlier write and returns the same result (reused: true) instead of adding a second row or a second comment.
Node policy. The writing nodes are declared as writing outside (external_write), like the other nodes that write: an administrator can forbid them with the organisation's node policy.
Limits
| Limit | Default | Set by |
|---|---|---|
| Tables per organisation | 100 | TABLES_MAX_TABLES |
| Columns per table | 60 | TABLES_MAX_COLUMNS |
| Rows per table | 50,000 | TABLES_MAX_ROWS |
| Characters per cell | 4,000 | TABLES_MAX_CELL_CHARS |
| Size of one import | 4 MB | fixed |
| Rows deleted or restored at once | 500 | fixed |
| Allowed values of a Choice list | 100 | fixed |
The instance administrator sets the first four, within absolute maximums; see Environment variables. A write beyond a limit is refused with tables.limit_reached. The page shows how many tables and rows are left.
There are no relations between tables and no saved views: a lookup across two tables is done in the workflow, by key.
Related pages
- Table nodes and their siblings listed above
- Data and expressions: reading
data.<step>.row - Test runs
- The analyzer, which can propose a workflow that writes to a new table
- API: the same operations under
/api/v1/tables