Skip to content
Start free trial

Formula Functions — the complete reference

A formula field shows a value HARi works out for you from other fields — a full name built from a first and last name, a total of every invoice on a company, or the number of days until a renewal. You never type the answer; you type a short formula and HARi recalculates it automatically whenever the underlying data changes. This page lists every function you can use, grouped by what it’s for, with a plain example of each. To add one, open a field’s settings, choose the Formula field type, and type the expression — HARi checks it as you type and shows a clear message if something is off.

Formulas are one of the most common places non-technical users get tripped up in any tool: a cell that looks empty can still hold hidden empty text that a blank-check misses. HARi’s functions are written to behave the way a business user expects, and where they deliberately differ from a spreadsheet or database, this page says so.

Function names work in either caseSUM and sum are the same. Basic math (+ - * / %) and parentheses work as you’d expect.

GroupFunctions
TextCONCAT, TRIM
Totals across related recordsCOUNT, SUM, AVG, MIN, MAX, FIRST, LAST, PLUCK, WHERE
DatesTODAY_MINUS_DAYS, DATEDIFF
Choosing a valueCOALESCE, IFNULL, NVL, NULLIF, SWITCH
Related recordsDISPLAY
FunctionWhat it doesExample
CONCAT(a, b, …)Joins values into one piece of text. Missing values become blank; numbers become text.CONCAT(first_name, " ", last_name)Jane Smith
TRIM(text)Removes leading and trailing spaces. A missing value stays missing.TRIM(" hello ")hello

You can also join two values with the ~ operator: "HK " ~ city.

These work on a list of related records (for example every invoice linked to a company). To use them, list the relation in the field’s related records setting so HARi loads it for the formula.

FunctionWhat it doesExample
COUNT(list)How many records are in the list.COUNT(invoices)12
SUM(list)Adds up the numbers (anything non-numeric is ignored).SUM(PLUCK(invoices, "amount"))
AVG(list)The average of the numbers.AVG(PLUCK(reviews, "score"))
MIN(list) / MAX(list)The smallest / largest value — works on numbers, dates, and text.MIN(PLUCK(invoices, "issue_date"))
FIRST(list) / LAST(list)The first / last item in the list.FIRST(PLUCK(orders, "status"))
PLUCK(list, "field")Pulls one field’s value out of every record, giving you a list to total or count.PLUCK(deals, "value")
WHERE(list, "field", "op", value)Keeps only the records that match a condition, so you can total a subset.SUM(PLUCK(WHERE(deals, "stage", "eq", "won"), "value"))

WHERE comparisons (op): eq (equals), neq (not equal), gt, gte, lt, lte, in, nin (not in), is_null, is_not_null, contains.

FunctionWhat it doesExample
TODAY_MINUS_DAYS(n)The date n days ago, as YYYY-MM-DD. Use it to compare against a stored date.TODAY_MINUS_DAYS(30)
DATEDIFF(date_a, date_b)The number of days between two dates (positive when date_a is later).DATEDIFF(renewal_date, TODAY_MINUS_DAYS(0)) → days until renewal

SWITCH picks between several options; the null-handling family below picks the first value that isn’t blank.

FunctionWhat it doesExample
SWITCH(input, c1, v1, …, [default])Compares input to each case and returns the matching value; an optional last argument is the fallback.SWITCH(tier, "gold", "VIP", "silver", "Priority", "Standard")
COALESCE(a, b, …)The first argument that isn’t blank; if all are blank, returns nothing.COALESCE(nickname, first_name, "Unknown")
IFNULL(a, b) / NVL(a, b)a when it has a value, otherwise b. (NVL is the same function under the name Oracle users know.)IFNULL(shipping_note, "None")
NULLIF(a, b)Nothing when a equals b, otherwise a — handy for turning a placeholder like "N/A" back into a blank.NULLIF(status, "N/A")

For a simple inline choice you can also use condition ? value_if_true : value_if_false — e.g. amount > 1000 ? "Large" : "Standard".

The one rule that trips people up: what “blank” means

Section titled “The one rule that trips people up: what “blank” means”

Zero is a value, not blank. COALESCE(discount, 100) where discount is 0 returns 0, not 100. These functions only skip a missing value or empty text — never a real 0, and never false. (NULLIF compares loosely, so read it as “does this look the same as the value I want to hide?” rather than a strict, type-exact match.)

Worked example: a display name that never shows a stray space

Section titled “Worked example: a display name that never shows a stray space”

The most common use is a full name when the last name might be missing. This is the exact formula HARi ships for a person’s display name:

TRIM(CONCAT(first_name, " ", COALESCE(last_name, "")))
  • COALESCE(last_name, "") — use the last name if there is one; otherwise fall back to blank.
  • CONCAT(first_name, " ", …) — join the first name, a space, and that result.
  • TRIM(…) — strip the leftover space when the last name was blank.
first_namelast_nameResult
JohnDoeJohn Doe
John(blank or missing)John

Without the empty-as-blank rule, a blank last_name would leave "John " with a trailing space, which TRIM then cleans.

FunctionWhat it doesExample
DISPLAY(relation)Shows a linked record’s name (the target’s display field) instead of its ID. Returns nothing when the link is empty.DISPLAY(account_manager)Jane Smith

Like the totals functions, DISPLAY needs the relation listed in the field’s related records setting.

Open any entity in Settings → Schema, add or edit a field, choose the Formula field type, and type your expression. Formula fields are calculated at read time and are always read-only — they never store a value, so they stay correct automatically. See Entities and field types for where the Formula type sits alongside text, number, date, and relation fields.