Overview
Computed fields (also called formula fields) let you automatically calculate and display values based on other fields in the same record. Instead of manually updating a field every time related data changes, Reevo computes the result for you - keeping your CRM data accurate and consistent without extra work. Computed fields are useful for scoring records, formatting display values, flagging conditions, calculating date differences, and categorizing data based on field combinations. Any logic you’d otherwise track in a spreadsheet can usually be expressed as a computed field. Reevo evaluates computed fields when a record is created or updated. The formula references fields on the same record using a simple{{domain.field_name}} syntax, and the result is stored as a standard field value you can filter, sort, and report on.
Step-by-Step Instructions
Note: Only administrators can create and manage computed fields.
Creating a Computed Field
- Navigate to Settings > [Object] > Add field
- Click Add Computed Field
- Enter a Display Name for the field
- Write your formula in the Formula Editor
- Use
{{domain.field_name}}syntax to reference fields - e.g.{{contact.title}} - The editor provides autocomplete as you type field names
- Use the Preview panel to test the formula against live record values
- Use
- Click Create
- Formulas are single-record only - they can only reference fields on the same record, not related records
- The
updated_atfield is intentionally excluded from all domains to prevent circular recalculation triggers {{pipeline.*}}syntax still works for backward compatibility, but use{{opportunity.*}}going forward - this is what autocomplete will suggest
Editing or Deleting a Computed Field
- Navigate to Settings > [Object] > Computed Fields
- Click the ellipsis (…) next to the field
- Select Edit to update the name, output type, or formula expression
- Select Delete to remove the field - this removes it from all records and cannot be undone
Formula Reference
Variable Syntax & Domains
Every formula references fields using a two-part variable: the domain (which object type you’re pulling from) and the field name (the specific field on that object). This scoped syntax ensures Reevo knows exactly which record and field to evaluate at compute time. Use double-brace syntax:{{domain.field_name}}
Components:
domain- The entity type:contact,account, oropportunityfield_name- The specific field name in snake_case
{{contact.first_name}}{{contact.last_name}}{{contact.title}}{{contact.department}}{{contact.primary_phone_number}}{{contact.linkedin_url}}
{{account.display_name}}{{account.estimated_annual_revenue}}{{account.estimated_employee_count}}{{account.official_website}}{{account.description}}{{account.status}}
{{opportunity.amount}}{{opportunity.status}}{{opportunity.anticipated_closing_at}}{{opportunity.next_step_details}}
Supported Input Field Types
Not every field type in Reevo can be used inside a formula. The table below shows which field types are supported and what data type they become once referenced in an expression. For example, a phone number field is treated as plain text in the formula engine - you can concatenate or extract from it, but not do math on it.| Field Type | Maps to in Formula |
|---|---|
| Text, Text Area, Long Text | TEXT |
| Email, Phone, URL | TEXT |
| Numeric, Currency, Percent | NUMBER |
| Boolean Checkbox | BOOLEAN |
| Timestamp | DATETIME |
| Local Date | DATE |
| Local Time, Time of Day | TIME |
| Single Select | TEXT (the selected value) |
| UUID | TEXT |
Data Types & Operators
Each data type supports a specific set of operators. Using the wrong operator for a type is the most common cause of formula errors - for example, using+ to join two text strings will fail because + is reserved for numeric addition. Use & or CONCAT() for text.
| Type | Operators | Notes |
|---|---|---|
| TEXT | & = != | Use & or CONCAT() for string joining - + will error |
| NUMBER | + - * / = != > < >= <= | Stored as Decimal for exact precision |
| BOOLEAN | = != AND OR NOT | Use AND(), OR(), NOT() functions for logic |
| DATE | + - = != > < | Date + Number adds days; Date - Date returns days |
| DATETIME | + - = != > < | DateTime - DateTime returns a duration value |
- Text: 255 characters max
- Numbers: up to 18 digits precision
Function Reference
Functions are the building blocks of formulas. They take inputs, apply logic, and return a result. Reevo organizes functions into four categories based on what kind of data they work with.Logical
Logical functions control the flow of your formula - returning different values depending on whether conditions are met. UseIF for simple true/false branching, CASE when you have multiple possible values to match against, and ISBLANK/BLANKVALUE to handle records where a field hasn’t been filled in yet.
| Function | Syntax | Description |
|---|---|---|
| IF | IF(condition, value_if_true, value_if_false) | Returns one of two values based on a condition |
| AND | AND(logical1, logical2, ...) | TRUE only if all conditions are TRUE |
| OR | OR(logical1, logical2, ...) | TRUE if at least one condition is TRUE |
| NOT | NOT(logical) | Reverses a logical value |
| CASE | CASE(value, case1, result1, ..., default) | Matches a value against multiple cases |
| ISBLANK | ISBLANK(value) | TRUE if value is empty or null |
| BLANKVALUE | BLANKVALUE(value, default) | Returns default if value is blank |
Math
Math functions operate on NUMBER values. They’re most useful for scoring (rounding a weighted score), financial calculations (commission tiers), and threshold checks (flagging deals above a certain size). Note thatSUM and AVG are available but only accept literal values - they don’t aggregate across related records. Use Rollup Fields for that.
| Function | Syntax | Description |
|---|---|---|
| ROUND | ROUND(number, num_digits) | Rounds to specified decimal places |
| ABS | ABS(number) | Absolute value |
| MAX | MAX(number1, number2, ...) | Largest value |
| MIN | MIN(number1, number2, ...) | Smallest value |
| MOD | MOD(number, divisor) | Remainder of division |
| CEILING | CEILING(number) | Rounds up to nearest integer |
| FLOOR | FLOOR(number) | Rounds down to nearest integer |
Text
Text functions let you build, inspect, and transform string values. They’re commonly used to construct display names, classify records based on keywords in a field (usingCONTAINS), or extract a clean domain from a messy URL. All text comparisons are case-sensitive.
| Function | Syntax | Description |
|---|---|---|
| CONCAT | CONCAT(text1, text2, ...) | Joins text strings |
| CONTAINS | CONTAINS(text, substring) | TRUE if text includes substring (case-sensitive) |
| BEGINS | BEGINS(text, prefix) | TRUE if text starts with prefix (case-sensitive) |
| FIND | FIND(search_text, within_text) | Position of substring |
| LEFT | LEFT(text, num_chars) | Leftmost characters |
| RIGHT | RIGHT(text, num_chars) | Rightmost characters |
| MID | MID(text, start, num_chars) | Characters from middle of string |
| LEN | LEN(text) | Length of string |
| TRIM | TRIM(text) | Removes leading/trailing spaces |
| SUBSTITUTE | SUBSTITUTE(text, old, new) | Replaces a substring |
| PROPER | PROPER(text) | Converts to title case |
| VALUE | VALUE(text) | Converts text to number |
| HYPERLINK | HYPERLINK(url, label) | Creates a clickable link |
| TEXT | TEXT(value, format) | Formats a value as text - formats: “currency”, “date”, “datetime”, “number” |
| DOMAIN | DOMAIN(url) | Extracts domain from a URL - e.g. DOMAIN({{account.official_website}}) returns “reevo.ai” |
Date
Date functions let you work with time-based fields - calculating how many days until a close date, labeling deals by fiscal quarter, or flagging records that are overdue.TODAY() and NOW() are dynamic and evaluated at computation time, so formulas using them stay current as long as records are periodically re-saved or backfilled.
| Function | Syntax | Description |
|---|---|---|
| TODAY | TODAY() | Current date |
| NOW | NOW() | Current date and time |
| DATE | DATE(year, month, day) | Build a date from parts |
| YEAR | YEAR(date) | Year component |
| MONTH | MONTH(date) | Month (1-12) |
| DAY | DAY(date) | Day of month |
| QUARTER | QUARTER(date) | Quarter (1-4) |
| WEEKDAY | WEEKDAY(date) | Day of week |
Example Formulas
These examples show how to combine fields, functions, and logic to solve real CRM use cases. Copy and adapt them as a starting point - the formula editor will validate your syntax in real time.Contact
Full display name with title and departmentCONCAT(IF(ISBLANK({{contact.title}}), "", CONCAT({{contact.title}}, " ")), {{contact.first_name}}, " ", {{contact.last_name}}, IF(ISBLANK({{contact.department}}), "", CONCAT(" - ", {{contact.department}})))
Output: “VP John Smith - Sales”
Seniority score based on title (Number)
IF(OR(CONTAINS({{contact.title}}, "CEO"), CONTAINS({{contact.title}}, "Chief"), CONTAINS({{contact.title}}, "President")), 100, IF(OR(CONTAINS({{contact.title}}, "VP"), CONTAINS({{contact.title}}, "Vice President")), 80, IF(CONTAINS({{contact.title}}, "Director"), 60, IF(CONTAINS({{contact.title}}, "Manager"), 40, 20))))
Is decision maker (Boolean)
OR(CONTAINS({{contact.title}}, "CEO"), CONTAINS({{contact.title}}, "CFO"), CONTAINS({{contact.title}}, "CTO"), CONTAINS({{contact.title}}, "VP"), CONTAINS({{contact.title}}, "President"), CONTAINS({{contact.title}}, "Owner"))
Account
Account tier by revenue (Text)IF(ISBLANK({{account.estimated_annual_revenue}}), "Unknown", IF({{account.estimated_annual_revenue}} >= 10000000, "Enterprise", IF({{account.estimated_annual_revenue}} >= 1000000, "Mid-Market", IF({{account.estimated_annual_revenue}} >= 100000, "SMB", "Startup"))))
Extract website domain (Text)
DOMAIN({{account.official_website}})
Profile completeness score 0-100 (Number)
ROUND((IF(ISBLANK({{account.display_name}}), 0, 20) + IF(ISBLANK({{account.estimated_annual_revenue}}), 0, 20) + IF(ISBLANK({{account.estimated_employee_count}}), 0, 20) + IF(ISBLANK({{account.official_website}}), 0, 20) + IF(ISBLANK({{account.description}}), 0, 20)), 0)
Opportunity
Expected close quarter (Text)IF(ISBLANK({{opportunity.anticipated_closing_at}}), "Not Set", CONCAT("Q", TEXT(QUARTER({{opportunity.anticipated_closing_at}}), "number"), " ", TEXT(YEAR({{opportunity.anticipated_closing_at}}), "number")))
Output: “Q2 2025”
Tiered commission (Number)
IF(ISBLANK({{opportunity.amount}}), 0, IF({{opportunity.amount}} > 100000, ROUND({{opportunity.amount}} * 0.15, 2), IF({{opportunity.amount}} > 50000, ROUND({{opportunity.amount}} * 0.10, 2), ROUND({{opportunity.amount}} * 0.05, 2))))
Deal readiness score 0-100 (Number)
ROUND((IF(ISBLANK({{opportunity.amount}}), 0, 25) + IF(ISBLANK({{opportunity.anticipated_closing_at}}), 0, 25) + IF(ISBLANK({{opportunity.next_step_details}}), 0, 25) + IF({{opportunity.status}} = "DEAL", 25, 0)), 0)
Troubleshooting / FAQs
Why doesn't the + operator work for combining text?
Why doesn't the + operator work for combining text?
The
+ operator is reserved for numeric addition. To join text strings, use CONCAT() or the & operator - e.g. {{contact.first_name}} & " " & {{contact.last_name}}.Why can't I reference updated_at in my formula?
Why can't I reference updated_at in my formula?
This field is intentionally excluded from all domains. Allowing it would create a circular trigger loop: saving a computed field updates the record, which updates
updated_at, which re-triggers recomputation. This applies to contact, account, and opportunity.Can I mix Date and DateTime fields in calculations?
Can I mix Date and DateTime fields in calculations?
No - they have different timezone handling and cannot be mixed in arithmetic. Convert DateTime to Date first using
DATE(): {{date_field}} - DATE({{datetime_field}}).My formula fails when a field is empty. How do I handle nulls?
My formula fails when a field is empty. How do I handle nulls?
Wrap nullable fields with
ISBLANK() or BLANKVALUE(). For example: IF(ISBLANK({{contact.title}}), "No Title", {{contact.title}}). For numbers, use BLANKVALUE({{account.estimated_annual_revenue}}, 0) to default to zero.Can computed fields reference fields from other records?
Can computed fields reference fields from other records?
No. Computed fields are single-record only. For aggregation across related records (e.g. sum of all opportunity amounts on an account), use Rollup Fields.
Can computed fields reference each other?
Can computed fields reference each other?
Not in a circular way. Direct cycles (A-B-A), indirect cycles, and self-references are all blocked at save time.
Can I use SUM or AVG to aggregate related records?
Can I use SUM or AVG to aggregate related records?
Are computed fields updated in real-time?
Are computed fields updated in real-time?
Formulas recalculate when a record is created or updated. Changes to referenced fields trigger an asynchronous recomputation.
TODAY() and NOW() are evaluated at computation time and may require a periodic backfill to stay current.Is there a complexity limit?
Is there a complexity limit?
Yes. Formulas must be under 1,000 characters. There is also a complexity score limit of 10 - the system counts every node in your formula tree (each function call, field reference, and value counts as 1 point). If your formula exceeds this score, you’ll see a warning and the formula won’t save.If you’re hitting the limit, split your logic across multiple computed fields. For example, instead of one large nested formula, create a “Seniority Score” field and an “Is Decision Maker” field separately, then reference them from a third field. Prefer
CASE over deeply nested IF chains - it’s more compact and uses fewer nodes.Can computed fields reference other computed fields?
Can computed fields reference other computed fields?
Yes - one computed field can use another computed field as an input, creating a dependency chain. There is no hard limit on chain length, but cycles are blocked. If Field A references Field B and Field B references Field A (directly or indirectly), the system detects this and prevents the save.
Is regex or pattern matching supported?
Is regex or pattern matching supported?
No. Use
CONTAINS() for substring checks and BEGINS() for prefix checks. Both are case-sensitive. No regex, wildcards, or case-insensitive matching.