Guide
Every formula in Fibery is built from three ingredients.
Paths. Dot notation - it's a door. Go to that field, or through that relation. Chain them to walk multiple doors: Epic.Product.Value goes to Epic, then its Product, then the Value of that Product.
Arithmetic. Your usual suspects (operators): + - * / for math, = != < > for comparisons, and, or to combine conditions. Round brackets () control order, same as school math.
Functions. Tools for anything arithmetic can't do alone - rolling up a collection, matching text, pulling a piece off a date. Sum(), Find(), If() - anything with a name and round brackets is a function.
Dive deeper into Formulas here.
1. Syntax
With these 5 marks you can write any formula.
Mark | Name | What it does | Syntax | Example |
|---|
.
| dot | go inside the thing on the left | Attraction.Name
| go into the Tasks stack, count it Tasks.Count()
|
( )
| round brackets | hold a function's input | Sum(Revenue)
| the test lives inside the brackets Tasks.Filter(State.Name != "Done")
|
[ ]
| square brackets | wrap a field name that has a space | [Due date]
| without brackets, Fibery reads "Due" and "date" as two things Tasks.Min([Due date])
|
" "
| quotes | literal text, matched exactly as typed | "High"
| match the word High exactly (note the .Name: a dropdown is an option, not text) Priority.Name = "High"
|
,
| comma | separate a function's inputs | Join(Name, ", ")
| first the field, then the separator Join(Name, ", ")
|
2. Operators
Operators sit between two values and combine or compare them. Arithmetics do math, comparisons ask true-or-false questions, logicals chain those questions together.
Operator | What it does | How to use | Example |
|---|
+ - * /
| arithmetic | a + b
| (Effort * Risk) / Complexity.Value
|
= !=
| equal / not equal | a = b
| State.Name != "Done" (compare a dropdown by its .Name)
|
< > <= >=
| compare size or date | a < b
| [Due date] < Today()
|
and or not
| combine conditions | x and y
| (State.Name != "Done") and ([Due date] < Today())
|
3. Functions
Functions take some input in brackets and hand back a transformed result — round a number, pull a piece of text, roll up a pile of related records. Below is the full list, grouped by what they work on.
Math
Function | What it does | How to use | Example |
|---|
Round(n, places)
| round to decimals | Round(n, places)
| Round(1.154, 1) → 1.2
|
RoundUp / RoundDown(n, places)
| round up / down | RoundUp(n, places)
| RoundDown(9.999, 2) → 9.99
|
Power(n, p)
| n to the power of p | Power(n, p)
| Power(10, 2) → 100
|
AbsoluteValue(n)
| drop the minus sign | AbsoluteValue(n)
| AbsoluteValue(-14) → 14
|
Log(n, base)
| logarithm | Log(n, base)
| Log(128, 2) → 7
|
Entities
Working with a set or stack of the same record, like Tasks for example.
Function | What it does | How to use | Example |
|---|
Count()
| how many items | Tasks.Count()
| tasks on this attraction Tasks.Count()
|
Sum(field)
| add a number across the records | Tasks.Sum(field)
| total work queued Tasks.Sum([Hours])
|
Avg(field)
| average a number | Tasks.Avg(field)
| Features.Avg(Estimate)
|
Min(field) / Max(field)
| smallest / largest — number or date | Tasks.Min(field)
| soonest deadline Tasks.Min([Due date])
|
CountUnique(field)
| how many distinct values | Tasks.CountUnique(field)
| Stories.CountUnique(Team.Name)
|
Filter(test)
| keep only records that pass the test | Tasks.Filter(test)
| open tasks Tasks.Filter(State.Name != "Done").Count()
|
Sort(field)
| reorder the records | Tasks.Sort(field)
| Sprints.Sort([Start Date])
|
First() / Last()
| pick one out, usually after Sort | Tasks.Sort(f).Last()
| latest sprint Sprints.Sort([Start Date]).Last()
|
Join(field, sep)
| glue values into one line of text | Tasks.Join(field, sep)
| Assignees.Join(Name, ", ") → "Mike, Teddy"
|
Logic
Function | What it does | How to use | Example |
|---|
If(cond, then, else)
| pick a value based on a condition | If(cond, a, b)
| If(State.Name = "Done", "Closed", "Open")
|
If nested
| more than two branches | put another If in the else slot | If(MM = 1, "Jan", If(MM = 2, "Feb", "…"))
|
IsEmpty(v)
| true when the value is blank | IsEmpty(v)
| IsEmpty([Due date])
|
IfEmpty(a, b, …)
| first non-empty value (fallback chain) | IfEmpty(a, b)
| IfEmpty(Interview.Weight, Chat.Weight, 1.0)
|
Greatest(…) / Least(…)
| biggest / smallest of several values | Greatest(a, b)
| Greatest([Bid], [Floor])
|
.Value
| the hidden number behind a select option | Field.Value
| needs "numeric value" turned on for the select Ease.Value * Confidence.Value * Impact.Value
|
Text
Function | What it does | How to use | Example |
|---|
+
| join text together | a + b
| Name + " (" + ToText(Count()) + ")"
|
Length(t)
| count characters | Length(t)
| Length("test") → 4
|
Lower(t) / Upper(t)
| change case | Lower(t)
| Lower(Name)
|
Trim(t)
| strip outer spaces | Trim(t)
| Trim([Raw Code])
|
Left(t, n) / Right(t, n)
| first / last n characters | Left(t, n)
| Left("Fibery rules", 6) → "Fibery"
|
Middle(t, start, n)
| characters from the middle | Middle(t, start, n)
| Middle("Umbrella", 5, 4) → "ella"
|
Find(t, search)
| position of first match | Find(t, search)
| Find("Where's Waldo?", "Waldo") → 9
|
Replace(t, find, with)
| swap matching text | Replace(t, find, with)
| Replace(Code, "-", "")
|
ReplaceRegex(t, regex, with)
| swap by pattern | ReplaceRegex(t, regex, with)
| strip non-digits ReplaceRegex([VAT ID], "[^0-9]", "")
|
StartsWith / EndsWith(t, x)
| true / false test | StartsWith(t, x)
| StartsWith(Email, "info")
|
MatchRegex(t, regex)
| true if the pattern matches | MatchRegex(t, regex)
| MatchRegex("Fibery", "F.b")
|
ToText(v)
| number or date → text | ToText(v)
| ToText(Year([Due date]))
|
Dates & time
Function | What it does | How to use | Example |
|---|
Today()
| current date | Today()
| overdue [Due date] < Today()
|
Now()
| current datetime — automations only | Now()
| — |
Year / Month / Day(d)
| pull a date part as a number | Month(d)
| Year([Opening date])
|
IsoWeekday(d)
| day of week, 1 = Mon … 7 = Sun | IsoWeekday(d)
| IsoWeekday([Due date])
|
IsoWeekNum(d)
| ISO week number | IsoWeekNum(d)
| IsoWeekNum([Creation Date]) → 23
|
Date(y, m, d)
| build a date | Date(y, m, d)
| Date(1999, 12, 31)
|
DateTime(y, m, d, h, mi, s)
| build a datetime | DateTime(…)
| DateTime(1999, 12, 31, 23, 59, 50)
|
MonthName / WeekDayName(d, fmt)
| name of the month / weekday | MonthName(d, "Mon")
| MonthName([Due date], "Mon") → "Dec"
|
Days(n) / Months(n) / Hours(n)
| a duration to add or subtract | [date] - Days(n)
| [Due date] - Days(2)
|
ToDays(dur) / ToHours(dur)
| measure a gap as a number | ToDays(a - b)
| length in days ToDays([Due date] - [Start date])
|
DateTimeRange(start, end)
| build a date-time range | DateTimeRange(a, b)
| DateTimeRange(Today(), Today() + Days(2))
|
Location
Function | What it does | How to use | Example |
|---|
.FullAddress()
| the full address as text | [Address].FullAddress()
| [Client Address].FullAddress()
|
.Latitude() / .Longitude()
| a GPS coordinate | [Address].Latitude()
| [Client Address].Latitude()
|
.AddressPart(part)
| one piece of the address | [Address].AddressPart("country")
| [Client Address].AddressPart("country")
|
4. Formulas from video
Every formula from the video, in the order it showed up. Copy, paste, tweak.
Lookups & rollups (white belt)
Formula (from the video) | What it does | IRL example |
|---|
Attraction.Zone.Manager
| two-level lookup: task → ride → zone → manager | a workspace's billing country, two hops through its subscription and that subscription's customer Subscription.Customer.Country
|
Inspections.Max(Date)
| latest inspection date for this ride | an investor's last-contacted date, rolled up from every interaction logged with them Interactions.Max(Date)
|
Inspections.Sort(Date).Last().Result
| pull any field off the newest inspection | the stated reason behind a workspace's most recent cancellation Subscriptions.Sort([Cancelled Date]).Last().[Cancel Reason]
|
Inspections.Count()
| how many inspections this ride has had | total candidates who've applied to a job position Candidates.Count()
|
Inspections.Filter(Result = "Failed").Count()
| count just the failed inspections | candidates still sitting unprocessed in a hiring pipeline Candidates.Filter(State.Name = "New").Count()
|
Inspections.Filter(Result.Name = "Passed").Count() / Inspections.Count()
| pass rate as a percent | the Sean Ellis PMF survey score, straight out of Superhuman's product-market-fit template Responses.Filter([...].Name = "Very disappointed").Count() / Responses.Count()
|
Logic (green belt)
Formula (from the video) | What it does | IRL example |
|---|
Today() > [Due date]
| is this task overdue? | literally the same formula, used to flag an overdue asset-maintenance request Today() > [Due date]
|
If(Today() > [Due date], "Late", "On track")
| turn that check into a status label | a salary record's status: Future, Current, or Past If([Approval Date] > Today(), "Future", If([End Date] < Today(), "Past", "Current"))
|
If(IsEmpty([Retired on]), "Operating", "Retired")
| flag rides with no retirement date | a payroll record is "Current" until it gets an end date If(IsEmpty([Valid To]), "Current", "Past")
|
If((Start <= Today()) and (Today() <= End), true, false)
| is this event live right now? | exact same formula, used to flag whether a Shape Up six-week cycle is currently active If((Start <= Today()) and (Today() <= End), true, false)
|
If([Wait time] > 60, "Long", If([Wait time] > 20, "Medium", "Short"))
| nested If — three-way wait time label | a real billing-dunning ladder, escalating by days unpaid If([Unpaid For] <= 14, "Banner for admins", If([Unpaid For] <= 21, "Banner for everyone", If([Unpaid For] <= 28, "Workspace locked", "🤨")))
|
IfEmpty([Finished date], [Due date])
| fall back to the planned date when the actual one's empty | a conversation shows its logged date if set, else falls back to when the record was created IfEmpty(Date, [Creation Date])
|
Combos (black belt)
Formula (from the video) | What it does | IRL example |
|---|
If((ToDays(Today() - Inspections.Max(Date)) > 14) and (State.Name != "Closed"), "🔧", "")
| flag open rides overdue for a safety check | flags an open CRM account that's gone quiet If((ToDays(Today() - Touches.Max(Date)) > 7) and (State.Final != true), "📞", "")
|
Ease.Value * Confidence.Value * Impact.Value
| ICE score — rank ideas by three select fields | same three fields, same idea: this is Fibery's own GIST Planning template scoring its backlog Ease.Value * (Confidence.Value * Impact.Value)
|