| name | currency-management-patterns |
| description | Working with multi-currency Salesforce orgs at the data layer — `CurrencyIsoCode` field semantics on every object, the `CurrencyType` and `DatedConversionRate` standard objects, the `convertCurrency()` SOQL function, Advanced Currency Management vs basic multi-currency, formula fields with currency conversion, roll-up summaries across currencies, and the irreversibility of enabling multi-currency on an org. NOT for currency UI formatting in LWC (that's Lightning's `lightning-formatted-number`), NOT for tax / financial-doc rounding rules (those are app-layer concerns). |
| category | data |
| salesforce-version | Spring '25+ |
| well-architected-pillars | ["Reliability","Operational Excellence"] |
| triggers | ["multi-currency org currencyisocode field salesforce","datedconversionrate currencytype standard object","soql convertcurrency function corporate currency","advanced currency management acm dated exchange rates","formula field currency conversion gotcha","roll-up summary across currencies opportunities","enable multi currency irreversible salesforce","querying currency fields with convertcurrency in soql where and order by","querying data cloud dlo dmo currency data soql iso code"] |
| tags | ["multi-currency","currency-iso-code","dated-conversion-rate","acm","convert-currency"] |
| inputs | ["Whether multi-currency is already enabled on the org (irreversible decision)","Whether Advanced Currency Management (dated exchange rates) is enabled","Source-of-truth for exchange rates (manual maintenance vs integration)"] |
| outputs | ["Pattern for SOQL queries that need currency conversion (`convertCurrency()` usage)","Formula-field design that survives multi-currency without producing nonsense values","Roll-up / report design that respects corporate vs record currency"] |
| dependencies | [] |
| version | 1.1.0 |
| author | Pranav Nagrecha |
| updated | "2026-07-08T00:00:00.000Z" |
Currency Management Patterns
Multi-currency in Salesforce is one of the most subtle data-layer
features in the platform. Once enabled it cannot be disabled. Every
record on every currency-aware object carries a CurrencyIsoCode
field. Reports, formulas, roll-ups, and SOQL all change semantics.
This skill covers the data-layer behavior that surprises practitioners:
how CurrencyIsoCode interacts with formula fields, when the
DatedConversionRate table is consulted versus the static
CurrencyType.ConversionRate, what convertCurrency() in SOQL
actually does, and the patterns for getting roll-up summaries to
behave when child records carry different currencies than the parent.
The two tiers: basic multi-currency vs Advanced Currency Management
Basic multi-currency. Enabled in Setup -> Company Information ->
Currency. Every currency-aware standard object gains a
CurrencyIsoCode picklist; the org gains the CurrencyType table
with one static conversion rate per active currency. Conversions
always use the current ConversionRate, even on a record dated three
years ago.
Advanced Currency Management (ACM). Enabled separately. Adds the
DatedConversionRate standard object — exchange rates with a
StartDate. ACM applies dated rates to a defined subset of fields,
notably Opportunity Amount, OpportunityLineItem TotalPrice, and a
small number of related history / forecast tables. ACM does not
apply dated rates to formula fields, custom currency fields, or
roll-up summaries — those continue to use the static
CurrencyType.ConversionRate. This split is the single biggest
source of multi-currency bugs.
Corporate currency vs record currency
The org has one Corporate Currency (set in CurrencyType where
IsCorporate = true). Reports and the Lightning UI typically display
amounts converted to corporate currency. SOQL by default returns the
record's native currency value — without convertCurrency(), you get
the raw number stamped against CurrencyIsoCode.
// Returns Opportunity.Amount in the record's native currency
SELECT Amount, CurrencyIsoCode FROM Opportunity
// Returns Opportunity.Amount converted to running user's currency
SELECT convertCurrency(Amount), CurrencyIsoCode FROM Opportunity
convertCurrency() converts to the running user's currency and
requires multiple currencies to be enabled. Which rate it applies
depends on ACM. ACM it uses the current
(the most recent conversion date
entered). ACM it uses the dated rate that corresponds to the
record's date field — for example on opportunities — for
the ACM-eligible standard fields (opportunities, opportunity line
items, and opportunity history). For those fields
and standard reports agree. Fields outside the ACM-eligible set —
custom currency fields, formula fields, roll-up summaries — always
convert at the static , even when ACM is
on, so an as-of-date value on those fields still requires an explicit
lookup.