Zudo Works

Workflow rules and functions

Where: Settings → Low-code → Workflows (/workflows) [workflows.manage]

Rules

PartOptions
Triggerrecord_created, record_updated, record_saved (either), record_deleted — bound to a form; report_button — fired from a module report, not bound to a form
ConditionJSONLogic with an operator allow-list: var, missing, missing_some, if, ?:, ==, ===, !=, !==, !, !!, or, and, >, >=, <, <=, max, min, +, -, *, /, %, map, filter, reduce, all, none, some, merge, in, cat, substr (depth and size limited)
Stepssend_email (to, subject, body templates), create_record (form, values), update_record (current or another record), invoke_url (GET/POST/PUT/PATCH/DELETE, headers, JSON body, timeout), set (variable), if / else, for_each, for, while, break, call (function), return
Templates{{record.<field>}}, {{vars.<name>}}, {{actor.display_name}}, {{meta.record_no}}, {{meta.form_name}}; HTML-escaped in e-mails
Scoperecord (after the change), previous (before), vars, actor, meta (trigger, form, record number; for report buttons report.name, report.total_rows and vars.rows ≤ 200)
EnabledToggle from the list; disabled rules do not run

Workflows on every section

A workflow rule can run on any built-in section as well as on your own forms: items, units, warehouses, stock movements, stock balances, BOMs, jobs, work centres, customers, sales orders and quotes, deliveries, invoices, payments received, vendors, purchase orders, vendor bills, payments made, chart of accounts, journals, expenses, credit notes, vendor credits, fixed assets, leads, deals, campaigns, contacts, activities, inspections, NCRs and CAPAs.

Create one: switch to Workflow mode on the section's page (or press the workflow button of its sidebar entry) → New workflow for <section>. Or open Workflows → New rule and pick the section under Built-in sections in Form or section. Choose the event, add conditions on the section's fields (its custom fields are listed too) and add the steps.

EventSectionsFires when
Record created / updated / deletedevery section with recordsa record is added, changed (any field, custom fields included) or deleted
Record created or updatedevery section with recordseither of the two
Status changedsections with a status (stage, result)e.g. an order is confirmed, an invoice issued or paid, a job released or completed
Movement postedStock movementsstock is posted — from the movement form or a delivery, receipt, job issue …
Movement cancelled or reversedStock movementsa movement is cancelled
Stock balance changedStock balancesa posting changes an item's on-hand quantity in a warehouse
Stock fell below the reorder pointStock balancesthe on-hand quantity drops below the item's low-stock alert level (once)
Button on a recordevery section with recordssomeone presses the rule's button on the record (Items: in the item form)

What the rule sees: record.<field> (built-in fields and custom fields as record.ext_<field id>), previous.<field> (before an update or status change), meta.record_title, meta.record_url, meta.actor_name, meta.actor_email and meta.owner_email. A stock movement also has record.lines (each line's item_code, item_name, quantity and the item's custom fields as item_ext_<field id>); a balance has reorder_point (the highest low-stock alert level set for the item) and the item's custom fields.

Steps can change built-in records too: Update record on the record itself, or on another Items / Customers / Vendors / Warehouses / Work centres / Jobs / Sales / Purchase order record (built-in fields and custom fields, checked like an edit); Create record can add an item, customer, vendor, warehouse, work centre or lead. A rule that fails is logged in its run log and never stops the save that triggered it.

Example — "e-mail me when stock of an item that may not be moved is posted": section Stock movements, event Movement posted, condition some line has Allow Movements = No ({"some":[{"var":"record.lines"},{"==":[{"var":"item_ext_allow_movements"},"No"]}]}), step Send e-mail to {{meta.owner_email}}. Zudo AI builds such rules when asked.

Functions

Reusable step lists with parameters; void or value-returning (return). Called with call; nest up to 5 deep. Test runs a function with sample inputs.

Run log

Every run records matched / not matched, status (success, partial, failed, skipped), per-step path, type, status and detail, and the error. Failures in one step are isolated: the rest of the run and other rules still execute.

Limits and safety

LimitValue
Steps per run (all branches, loops, calls)5,000
Iterations per loop1,000
Nested function calls5
Chain depth (workflow writes that trigger further workflows)3
E-mail recipients per step20
Invoke URL timeout10 s; redirects not followed; private, loopback, link-local, metadata, CGNAT and multicast targets refused (DNS resolved)

Blueprints: stages, transitions and the journey

Where: Settings → Low-code → Blueprints (/blueprints), or the Edit mode bar [forms.read; design forms.design; moving records forms.write]

A blueprint is the process a form's records go through. It has stages (name and colour; one is the start stage) and transitions — the buttons that move a record from one or more stages to another.

On the record page the blueprint panel shows the current stage, the stages as a progress strip, a button per transition the viewer may take, and the journey: every move with who, when and the comment. Reports show the stage of each record.

Blueprints: create from a template, open the designer, delete
Blueprints: create from a template, open the designer, delete
The blueprint designer: stages, transitions and their rules
The blueprint designer: stages, transitions and their rules
A record in its blueprint: stage, transition buttons and journey
A record in its blueprint: stage, transition buttons and journey

Last updated