Skip to content

Expressions

Computed fields, showIf/validIf, onlyIf, initial values, and action updates are all written in the same formula language — a spreadsheet-style syntax with {field} references and a large built-in function library.

Referencing fields

  • {field} — a field on the current record.
  • {ref.field} — traverse a reference field to read a field on the linked record (e.g. {product.name}). Chains of references work too: {shift.location.name}.
  • {_THISRECORD.field} — inside a query condition, refers to the outer record the query was run from (as opposed to the candidate row currently being tested).
  • {_PREVROW.field} / {_NEXTROW.field} — the previous/next row in a list pass.
  • {_INDEX} / {_TOTAL} — the current position and total count in a list pass.
  • {_FORM.field} — a value entered into a form_action dialog.
  • {_THISUser.field} — the logged-in user's own record (id, email, name, etc.).

Logic

IF(cond, then, else), IFS(cond1, val1, cond2, val2, ..., default), AND, OR, NOT, EQUAL, GT, LT, ISBLANK.

Text

CONCATENATE, JOIN, UPPER, LOWER, TRIM, LEN, LEFT, RIGHT, CONTAINS, REPLACE.

Math

ADD, SUBTRACT, MULTIPLY, DIVIDE, ROUND, ABS, MIN, MAX, DISTANCEBETWEEN (for two geolocation values).

Dates

NOW(), TODAY(), TIMENOW(), DAYOFWEEK, STARTOFMONTH(), ENDOFMONTH(), YEAR, MONTH, DAY, HOUR, MINUTE, WEEKDAY, DATEDIFF, DATEADD, DATEFORMAT, ISBEFORE, ISAFTER, ISBETWEEN.

Cross-collection queries

These look at other records, not just the current one:

  • COLLECTIONSELECT("collection", "condition") — every record matching the condition.
  • FILTER("collection", "condition") — same idea, lighter weight.
  • REF_ROWS("collection", "foreignKey") — shorthand for the common reverse-lookup case: every record in collection whose foreignKey field points back at this record. Equivalent to COLLECTIONSELECT("collection", "EQUAL({foreignKey},{_THISRECORD.id})"). Takes an optional third argument — REF_ROWS("collection", "foreignKey", "extraCondition") — AND-ed onto the auto-generated equality check. Drop to COLLECTIONSELECT/FILTER directly once you need anything beyond that (sorting, OR logic, multiple extra conditions).
  • SELECT("collection", "returnColumn", "condition") — just the values of one column.
  • EXISTS("collection", "condition") — true if any record matches.
  • COUNT(...), FIRST(...), LAST(...), SUMARRAY(...) — operate on the array a query returns.
  • LOOKUP(value, "collection", "lookupColumn", "returnColumn") — single-value lookup.
  • ORDERBY / ORDERBYDESCENDING — sorted query results.
  • USERPROFILE("field") — a field from the current user's profile record.
  • HERE() — the device's current geolocation.

Quoting condition arguments

The condition argument of COLLECTIONSELECT / FILTER / EXISTS / SELECT / ORDERBY is evaluated per row, which means it must be passed as a quoted string, not a bare expression:

✅ EXISTS("cartitem", "EQUAL({product}, {_THISRECORD.product})")
❌ EXISTS("cartitem", EQUAL({product}, {_THISRECORD.product}))

The unquoted form silently degrades to "no condition" (matches everything) instead of erroring — the editor will warn you live if you write it this way, but it's worth knowing why.

Special-purpose

  • IN(value, list) — true if value appears anywhere in an array.
  • IFS(...) — first matching condition wins; the trailing argument is the default.

Released under no license yet — internal product, pre-launch.