Why Row-Level Formulas Exist
Before row-level formulas, if you needed “Deal Size Category” in a report, you had two bad options:
- Create a formula field on the Opportunity object, clutter the schema, and hope nobody else needs a different categorization.
- Export to Excel and compute there — losing report semantics.
Row-level formulas let you compute per-row values inside a report, without touching the object. They live in the report, move with the report, and don’t pollute the object metadata.
Creating One
Open the report in Report Builder. In the field panel, click + Formula → Row-Level Formula.
- Label: what appears in the column header.
- Column Name: the technical identifier.
- Formula Output Type: number, text, currency, date, etc.
- Formula: the expression.
Save, and it shows up as a new column.
Syntax
Row-level formulas use the same formula syntax as formula fields: field references, operators, functions.
(Amount - Cost__c) / Amount
“Gross Margin” per opportunity. Uses Amount and a custom Cost field.
IF(IsWon, 'Won', IF(IsClosed, 'Lost', 'Open'))
“Deal Outcome” as text, computed per row.
DATEVALUE(LastActivityDate) - DATEVALUE(CreatedDate)
“Days from Creation to Last Activity” per row.
When They Fit Best
Calculations specific to this report. A one-off metric you need here but not elsewhere.
Testing calculations before committing to a field. If the math works in the report, you can promote to a formula field later.
Report-level transformations. Categorizations, formatted strings, conditional values that change per report.
When a Formula Field Is Better
Values used in many reports. Computing “Days in Stage” across 10 reports means defining the formula 10 times. Promote to a formula field.
Values referenced in list views, filters, or other automation. Row-level formulas don’t exist outside the report.
Complex, reusable business logic. A row-level formula is for lightweight derivations. Business-critical calculations belong on the object.
Common Patterns
Categorization
IF(Amount < 10000, 'Small',
IF(Amount < 100000, 'Medium', 'Large'))
Deal size bucket. Simpler alternative: the report’s Bucket Column feature, which is designed for exactly this pattern.
Calculated Ratio
IF(TotalQuantity > 0, Revenue / TotalQuantity, 0)
Average price per unit. Guard against divide-by-zero with the IF.
Status Derivation
IF(IsClosed && IsWon, 'Win',
IF(IsClosed && NOT(IsWon), 'Loss',
IF(CloseDate < TODAY(), 'Slipped', 'In Flight')))
Complex status roll-up for dashboard consumption.
Age Calculation
TODAY() - DATEVALUE(CreatedDate)
Record age in days.
Conditional Flag
IF(AND(Amount > 100000, DaysSinceLastActivity__c > 30), 'Stalled', '')
Mark records meeting a risk pattern.
Limits to Know
- 5 row-level formulas per report.
- Formula length: ~3,900 characters — not usually a limit, but complex formulas should be refactored.
- Cannot reference other row-level formulas. Each is independent. Chain via formula fields if needed.
- Cannot reference summary formulas. Row-level is per row; summary is per group.
- Output types limited to the supported set (text, number, currency, date, etc.). No picklist output.
Hit the 5-per-report cap? Either promote some formulas to the object or consolidate logic into fewer, richer formulas.
Row-Level vs. Summary Formula
Different beasts.
- Row-level formula: evaluates once per row. Value is per record.
- Summary formula: evaluates once per grouping (or overall). Value is per group.
Example: a row-level formula might compute “Deal Margin” for each opportunity. A summary formula might compute “Win Rate” across a group of opportunities using aggregates.
Use row-level for per-record derivations. Use summary for aggregate metrics.
Performance
Row-level formulas are computed at report runtime. Complex formulas over large datasets can slow reports noticeably. If users complain about slow reports with many row-level formulas:
- Promote frequently-used formulas to formula fields (computed at save time, indexed-friendly).
- Reduce the result set with stricter filters.
- Split into multiple reports if the dashboard audience varies.
Common Mistakes
Reinventing formula fields. If you’ve added the same row-level formula to five reports, it belongs on the object.
Confusing row-level with summary. “Total Revenue” as a row-level formula just repeats each row’s revenue. Use a summary.
Forgetting the output type. A numeric formula displayed as text won’t format as currency. Pick the right type up front.
No null handling. A formula dividing by a field that can be zero fails. Always guard with IF.
Nested ternaries beyond readability. Four levels of IF(IF(IF(IF()))) gets hard to debug. At that depth, split logic into multiple formulas or a formula field.
Export Considerations
When exporting a report to CSV or printing to PDF, row-level formulas are exported as values, not as formulas. Consumers of the export see the computed result.
This is almost always what you want. But if downstream processes expect a specific column name to be a stored field, verify the export still parses.
Frequently Asked Questions
Can row-level formulas reference related object fields?
Yes — through the parent/child relationship fields the report type exposes. Account.Industry in an Opportunities report, for example.
Can they use custom functions?
Only the built-in formula function library. No custom function extension.
Are row-level formulas included when reports are packaged?
Yes — they live inside the report metadata and deploy with it.
Can a user without report-edit permission see row-level formula results?
Yes — viewing a report shows all its columns, including formulas. Only editing requires report-edit permission.