When to use form expressions
Use a form expression to derive a default, control visibility or editability, compute a value, shape action text, or look up service data for the current form experience. It is not a server-side permission system and it is not a substitute for a workflow approval. The full callable catalog is in Form helpers and lookup filters. This guide explains how to use those helpers safely.
Form roots
Use small, local expressions. A condition for one field should usually depend on that field’s siblings or a clear form value, not on a long path across several repeaters.
$.status and $.request_amount.value expressions remain supported. The expression editor suggests their $values equivalents.
Repeatable patterns
In a looped repeatable,$item is the source loop item and $index is its zero-based position. In a user-controlled repeatable, use the instance/sibling values that exist in the current form structure.
UI checks are not authorization
hasVerb, hasVerbOnRecord, hasScope, and hasAnyScope can adapt what a member sees in a form. They do not grant access. In particular, verb helpers return true during server evaluation, so an expression using them cannot be your only enforcement point.
Record lookup: keep it narrow, private, and non-authoritative
getRecord and getRecords are form data conveniences. They can return an empty/null-like result when the form context is unavailable or a lookup times out. Their backing lookup runs through a system-level data path; it does not filter results using the current participant’s ordinary record or field permissions, role, or scope. It also has no lookup-limit argument, so a broad filter can load every matching record.
That makes three boundaries explicit:
hasVerb*andhasScope*can change presentation only; they do not authorize an action.getRecordandgetRecordsmust never decide whether a participant is authorized or entitled to data.- A lookup result must never be rendered to a public or otherwise unauthorized participant. A hidden field is not an access-control mechanism.
Build filters with f.
The f. functions build a database filter object for getRecords; they do not filter an arbitrary list in memory. The most useful pattern is a small conjunction:
f._in when a readable, unambiguous inclusion helper is preferred. Test the exact field keys and stored option values. Do not build a broad lookup and then hide results with a later expression.
Weekdays and service shifts
isWeekend(date, entityId?) and isWeekday(date, entityId?) can use configured shift work days when an applicable entity and service data are available. Without that data, they fall back to Saturday/Sunday. Treat them as online regular-form helpers and test the target organization’s schedule.
Offline form limits
Offline forms blockgetRecord, getRecords, hasVerbOnRecord, hasVerb, hasScope, and hasAnyScope. They also restrict several data-backed form features. Keep offline expressions self-contained: field values, simple conditions, and deterministic general helpers.

