Formula Reference
Complete reference for all formula functions available in database columns. Use prop("Name") to access any property value.
Operators
+ - * / % Arithmetic== != > < >= <= Comparison&& || LogicalFunctions
prop(name)Get property value by name
prop("Property Name")prop("Status")→"Done"prop("Amount")→150prop("Created time")→"2025-03-01T12:00:00Z"Works with all property types including Created time, Last edited time, Created by, Last edited by.
if(condition, then, else)Conditional expression
if(condition, thenValue, elseValue)if(prop("Status") == "Done", "✓", "✗")→"✓"if(prop("Score") > 50, "Pass", "Fail")→"Pass"ifs(cond1, val1, ..., default?)Multiple conditions (like switch)
ifs(cond1, val1, cond2, val2, ..., default?)ifs(prop("Score") >= 90, "A", prop("Score") >= 80, "B", prop("Score") >= 70, "C", "F")→"A"If the last argument has no condition pair, it acts as the default value.
not(value)Logical negation
not(value)not(prop("Done"))→trueempty(value)Check if value is empty or null
empty(value)empty(prop("Email"))→trueempty("hello")→falsecoalesce(...values)Returns first non-empty value
coalesce(val1, val2, ...)coalesce(prop("Nickname"), prop("Name"), "Anonymous")→"John"contains(text, search)Check if text contains substring
contains(text, search)contains("hello world", "world")→truestartsWith(text, search)Check if text starts with substring
startsWith(text, search)startsWith("hello", "hel")→trueendsWith(text, search)Check if text ends with substring
endsWith(text, search)endsWith("hello", "llo")→trueconcat(...values)Concatenate values into a string
concat(val1, val2, ...)concat(prop("First"), " ", prop("Last"))→"John Doe"join(...values, separator)Join non-empty values with separator
join(val1, val2, ..., separator)join(prop("City"), prop("Country"), ", ")→"Berlin, Germany"Empty values are automatically filtered out before joining.
length(text)String length
length(text)length("hello")→5lower(text)Convert to lowercase
lower(text)lower("HELLO")→"hello"upper(text)Convert to uppercase
upper(text)upper("hello")→"HELLO"trim(text)Remove leading/trailing whitespace
trim(text)trim(" hello ")→"hello"replace(text, search, replace)Replace first occurrence
replace(text, search, replacement)replace("hello world", "world", "there")→"hello there"slice(text, start, end?)Substring by index
slice(text, start, end?)slice("hello", 0, 3)→"hel"left(text, count)First N characters
left(text, count)left("hello", 2)→"he"right(text, count)Last N characters
right(text, count)right("hello", 3)→"llo"repeat(text, count)Repeat text N times
repeat(text, count)repeat("ab", 3)→"ababab"padStart(text, length, fill?)Pad start of string
padStart(text, targetLength, fillChar?)padStart("5", 3, "0")→"005"padEnd(text, length, fill?)Pad end of string
padEnd(text, targetLength, fillChar?)padEnd("hi", 5, ".")→"hi..."split(text, separator, index?)Split text and get part
split(text, separator, index?)split("a-b-c", "-", 1)→"b"Index defaults to 0 (first part).
test(text, regex)Test regex match
test(text, regexPattern)test("abc123", "[0-9]+")→trueabs(number)Absolute value
abs(number)abs(-5)→5round(number)Round to nearest integer
round(number)round(3.7)→4floor(number)Round down
floor(number)floor(3.9)→3ceil(number)Round up
ceil(number)ceil(3.1)→4min(...numbers)Minimum value
min(a, b, ...)min(5, 3, 8)→3max(...numbers)Maximum value
max(a, b, ...)max(5, 3, 8)→8pow(base, exp)Exponentiation
pow(base, exponent)pow(2, 3)→8sqrt(number)Square root
sqrt(number)sqrt(16)→4sign(number)Sign of number
sign(number)sign(-10)→-1sign(0)→0sign(5)→1log(number)Natural logarithm
log(number)log(1)→0log10(number)Base-10 logarithm
log10(number)log10(100)→2log2(number)Base-2 logarithm
log2(number)log2(8)→3toNumber(value)Convert to number
toNumber(value)toNumber("42")→42toString(value)Convert to string
toString(value)toString(42)→"42"format(number, decimals)Format number with decimals
format(number, decimals)format(3.14159, 2)→"3.14"toFixed(number, decimals?)Number to fixed decimal string
toFixed(number, decimals?)toFixed(3.1, 3)→"3.100"now()Current date and time
now()now()→"2025-03-03T12:00:00.000Z"today()Today's date
today()today()→"2025-03-03"year(date)Extract year
year(date)year(now())→2025month(date)Extract month (1-12)
month(date)month(now())→3day(date)Extract day of month
day(date)day(now())→3hour(date)Extract hour (0-23)
hour(date)hour(now())→12minute(date)Extract minute (0-59)
minute(date)minute(now())→30dateBetween(date1, date2, unit)Numeric difference between two dates
dateBetween(date1, date2, unit)dateBetween(now(), prop("Created time"), "days")→45dateBetween(prop("End"), prop("Start"), "hours")→72dateBetween(now(), prop("Status changed"), "workdays")→5Units: "days", "workdays" (Mon to Fri only, excludes weekends), "hours", "minutes", "seconds", "months", "years". Returns date1 - date2. Aliases for workdays: "workday", "businessDays", "business_days".
duration(date1, date2, style?)Human-readable duration between dates
duration(date1, date2, style?)duration(prop("Created time"), now())→"3 days 5 hours"duration(prop("Created time"), now(), "short")→"3d 5h"Style: "long" (default) gives "3 days 5 hours 10 minutes", "short" gives "3d 5h 10m".
formatDuration(minutes, style?)Format minutes as readable duration
formatDuration(totalMinutes, style?)formatDuration(90)→"1 hour 30 minutes"formatDuration(1500, "short")→"1d 1h 0m"Accepts a number of minutes. Style: "long" (default) or "short".
dateAdd(date, amount, unit)Add to a date
dateAdd(date, amount, unit)dateAdd(now(), 7, "days")→"2025-03-10T12:00:00Z"dateAdd(prop("Start"), 5, "workdays")→"2025-03-10T12:00:00Z"Units: "days", "workdays" (skips Sat/Sun), "months", "years", "hours", "minutes", "seconds". Negative amounts go backwards.
dateSubtract(date, amount, unit)Subtract from a date
dateSubtract(date, amount, unit)dateSubtract(now(), 1, "months")→"2025-02-03T12:00:00Z"dateBefore(date1, date2)True if date1 is before date2
dateBefore(date1, date2)dateBefore(now(), prop("Due Date"))→truedateAfter(date1, date2)True if date1 is after date2
dateAfter(date1, date2)dateAfter(now(), prop("Start"))→truedateEqual(date1, date2)True if same calendar day
dateEqual(date1, date2)dateEqual(now(), today())→trueformatDate(date, format?)Format date with pattern
formatDate(date, format?)formatDate(now(), "DD.MM.YYYY")→"03.03.2025"formatDate(now(), "YYYY-MM-DD HH:mm")→"2025-03-03 12:30"Tokens: YYYY, MM, DD, HH, mm. Default format: "YYYY-MM-DD".
relProp(relation, field)Field value from first related page
relProp("Relation Name", "Field Name")relProp("Company", "Revenue")→1000000relCount(relation, field?)Count of related records
relCount("Relation Name", field?)relCount("Tasks")→12relSum(relation, field)Sum numeric field across relations
relSum("Relation Name", "Field Name")relSum("Items", "Price")→450relAny(relation, field)True if any related value is truthy
relAny("Relation Name", "Field Name")relAny("Tasks", "Done")→truerelAll(relation, field)True if all related values are truthy
relAll("Relation Name", "Field Name")relAll("Tasks", "Done")→falseprop(lookup)A lookup collapses to a scalar: its single value, or the first of many
prop("Lookup Column")prop("New PPS (local)") * prop("FX Rate Value")→541.21675A lookup pulling a single value (relation limited to 1) reads directly as a number, so you can do arithmetic with it. Use first/sum/min/max/average to control multi-value lookups.
first(lookup)First value of a lookup
first(prop("Lookup Column"))first(prop("FX Rate Value"))→1.175last(lookup)Last value of a lookup
last(prop("Lookup Column"))last(prop("Quarterly Rates"))→1.21sum(lookup)Sum of a lookup's values
sum(prop("Lookup Column"))sum(prop("Line Item Totals"))→4500average(lookup)Average of a lookup's values
average(prop("Lookup Column"))average(prop("Quarterly Rates"))→1.19count(lookup)Count of non-empty lookup values
count(prop("Lookup Column"))count(prop("Line Item Totals"))→3min(lookup)Smallest value of a lookup
min(prop("Lookup Column"))min(prop("Quarterly Rates"))→1.17max(lookup)Largest value of a lookup
max(prop("Lookup Column"))max(prop("Quarterly Rates"))→1.21Last updated June 24, 2026