Packages
The Packages node works with packages: the JSON documents borrower-central keeps per customer and that scorecards, rules and workflows read. The node has two modes in the same panel. Store builds a package from flow variables and saves it under a key you name. Read looks up packages already stored, filtered by label, alias and customer, and leaves the result in a variable.
The node sends no message. It does its work silently and continues through the normal output, or takes the error output when something in the configuration could not be resolved.
When to Use It
To hand data to a workflow or a scorecard. What the customer answered in the conversation becomes a package of that customer, and a workflow reads it by alias like any other source.
To pick up what you already knew. A returning customer already answered things in an earlier conversation. In Read mode you fetch the latest package and skip asking again.
To review a history. With "List of packages", the node brings the last N packages of a customer ordered by date, and a Python Executor or a Set Variable walks them.
Store Mode
| Option | Description |
|---|---|
| Package key | Upper case with underscores (GUARANTOR_DATA). The engine prefixes it with FLOW_ and the panel shows that final key. The prefix cannot be removed: it keeps a hand-made package from landing on an altdata source and feeding a scorecard |
| Existing packages | The tenant's FLOW_ sources; picking one writes the key for you |
| Label | Human-readable name of the package. Accepts {{variables}}: Income of {{name}} |
| Alias | Tells apart several packages with the same key for the same customer. Accepts {{variables}}. Empty falls back to the label |
| JSON fields | One field per row: the name it gets in the JSON and the flow variable that brings its value. Each value keeps the variable's declared type: a number is stored as a number |
| Whole object | An object or array variable that already holds the whole content, typically built by a Python Executor. An array is stored under the items field |
If you fill both, the whole object is the base and the fields overwrite it one by one. The metadata field is written by the node with the package's provenance (conversation, customer, node, label, date), so a field with that name is dropped with a notice.
A {{variable}} in the label or the alias that no node wrote before is stored as written, as text, and the node leaves a warning notice naming it. The package is still stored.
Read Mode
| Option | Description |
|---|---|
| Key being searched | Optional. With a value, only packages of that FLOW_ source are returned. Empty returns from any package stored by a flow |
| Label | Filters by exact label. Accepts {{variables}}. Empty does not filter |
| Alias | Filters by exact alias. Accepts {{variables}}. Empty does not filter |
| Customer | Filters by customer id. Comes as {{borrower_id}}, the conversation's customer. Empty returns packages of any customer in the tenant |
| Order by / Direction | Creation date, label or alias, ascending or descending. Newest first by default |
| What it returns | List of packages returns up to the count; Only the first one takes the first package in that order and stores it as an object |
| At most how many | Between 1 and 50. Applies only when the result is a list |
| Start at position | How many packages to skip, in the chosen order, before the first one returned. A number or a {{variable}}. Empty means 0. Shown only when the result is a list |
| Where the result goes | A flow variable of the type the node returns: array for the list, object for only the first one. Changing the type clears the selection |
Packages marked stale are not returned.
What the variable holds
Each package carries its metadata and its content:
- id, label, alias, sourceId, borrowerId, createdAt, tags, contentType
- content: the stored JSON. If the content file no longer exists,
contentisnulland the node leaves a notice
With "Only the first one" the variable holds the most recent package, or null when there is none. With the list it holds an array, empty when nothing matched. In a message it is used like any object: {{package.content.income}}.
Paging through a long list
Start at position turns one read into a page of a longer list. With position 0 the read returns the first packages in the chosen order; with position 9 it skips the first nine and starts at the tenth. The field accepts a number or a variable, such as {{offset}}. Whatever does not come out as a whole number of zero or more (an empty field, a variable no node wrote, text, a negative number) counts as 0, so the read falls back to the first page instead of failing. A value that renders with decimals, like 9.0, is not a whole number either and also reads from the start: keep the variable a whole number.
The usual loop pages a list shown with Interactive Options in list mode, whose Ver más row appears when it receives more than ten elements:
- A Set Variable sets
offsetto 0 before the read. - Packages reads in list mode, At most how many 11 or more, Start at position
{{offset}}. - Interactive Options shows the result. With more than ten elements it shows nine rows and Ver más.
- From the See more output, add 9 to
offsetand goes back to the read. With a Formula, writeto_int(add({{offset}}, 9)): the Formula's arithmetic returns decimals, and withoutto_intthe position would be9.0and the read would start over.
Pages advance by nine because that is how many rows the list shows when there are more; the tenth element is the first of the next page. The limit has to be above ten because a read of exactly ten fills the list without a Ver más row, and the next page would never be offered.
When a filter cannot be resolved
A filter with a {{variable}} that does not exist in the conversation does not degrade to "no filter". If {{borrower_id}} is empty because the customer has not identified themselves yet, the node reads nothing, leaves a warning notice and takes the error output. Reading every customer's packages because a filter went empty by accident is exactly what this prevents.
Output Connectors
| Connector | When |
|---|---|
| Normal | The package was stored, or the read finished, even with no results |
| Error | Invalid key, no content configured, no destination variable, a filter with a variable that could not be resolved, or the store refused the label or the alias |
Zero results in Read mode is not an error: the variable is left empty and the flow continues. To branch, follow the node with a Conditional that compares the variable with empty.
Keep in Mind
- Every run in Store mode creates a new package. Passing through the node again does not update the previous one; readers take the most recent by date.
- Signed file URLs inside the content are stored as text and expire after an hour. The node also stores the file reference, and the packages API re-signs it on read.
- Read mode only reaches packages stored by flows (
FLOW_prefix). Altdata sources are still queried by the workflow.