A cross-object formula field reads data from a parent record by traversing a lookup or master-detail relationship in the formula expression. Instead of copying a parent value down to the child with automation, you reference it live — the formula always shows the parent’s current value.
The syntax — using __r
For a custom relationship field Account__c on a custom object, you reach into the parent with __r:
Account__r.Industry
Account__r.Owner.Name
Account__r.Owner.Manager.Email
For standard relationships, you use the relationship name without __r:
Account.Name // Contact -> Account
CreatedBy.Name // Any object -> User
Account.Owner.Email // Contact -> Account -> User
Why use them
| Use cross-object formula when… | Use a copied/stored field when… |
|---|---|
| The parent value can change and you want the child to reflect it live | You need to filter, sort, or report on the value with high performance |
| You only need read access | You need the value frozen at a point in time |
| Data volume is moderate | Reports and list views will be slow with live cross-object joins |
The limits
Two hard limits to memorise — interviewers love asking these:
- 5 levels of relationship traversal per formula.
A.B.C.D.E.Fwould fail. - 10 unique relationships referenced in a single formula. You can reference the same parent multiple times for free; you just can’t span 11 different parent objects.
A practical example
A Contact’s formula field that pulls the Account’s owner’s email:
Account_Owner_Email__c = Account.Owner.Email
When the Account’s owner changes, the Contact’s Account_Owner_Email__c reflects the new email the next time it’s read. No automation, no flow, no trigger — just a formula.
Gotchas
- Master-detail relationships are always populated, but lookups can be null. Use
BLANKVALUE(Account.Industry, "Unknown")to handle the null case. - Cross-object formulas cannot reference Long Text, Encrypted, or some system fields even on the parent.
- Hierarchical traversal (
Manager.Manager.Manager) is supported up to 5 levels — useful for User-object hierarchies. - Cross-object filtering in list views is supported, but reports may not be able to filter on certain deeply-nested formula fields efficiently.
Common interview follow-ups
- “What’s the depth limit?” — 5 levels.
- “What if the lookup is null?” — formula returns null; use
BLANKVALUEorISBLANKchecks. - “Why not use a flow to copy the value?” — because then it’s stale unless you re-run on every parent change. Live formula is simpler.
Verified against: Salesforce Help — Cross-Object Formula Fields. Last reviewed 2026-05-17 for Spring ‘26 release.