Multi-currency fact chain
01

Transaction: original amount and currency

02

Ledger: functional amount and event-date rate

03

Reporting: target currency and policy

04

Period end: remeasurement adjustment

05

Governance: source, direction, and version

An amount is not a decimal without currency context

One hundred dollars, euros, and yen cannot be summed. A fact must preserve transaction_amount and transaction_currency, then store functional or reporting amounts only under an explicit approved policy.

This is analytical modeling guidance, not accounting advice. Transaction, settlement, closing, and planning views can require different rates, while monetary and non-monetary treatment depends on applicable standards and company policy. A tool must not invent that judgment.

Declare functional and reporting currency by entity and period

A group may contain entities with different functional currencies and a separate management reporting currency. Model entity, ledger, functional_currency, reporting_currency, effective period, and policy_version instead of hard-coding a group-wide base currency.

Legal reporting, sales operations, cash settlement, and budget comparison are distinct uses. Each metric must name its amount column, rate type, date role, and policy version. A generic Sales label hides material semantic differences.

Retain original and converted amounts in the fact

An order line can carry transaction, functional, and reporting amounts and currencies, plus the rate ID behind each conversion. Original currency is required for audit and controlled restatement; stored converted values preserve the decision made at posting time.

Discount, tax, freight, refund, and cost need compatible grain, sign, and currency treatment. Never sum mixed currencies and multiply by an average rate, and never duplicate an order-header amount across lines.

Make quote direction and valid time unambiguous

An FX table should contain from_currency, to_currency, rate_type, rate, valid_from, valid_to, source, publication time, ingestion time, and version. State that one unit of from equals rate units of to; a pair label alone invites inversion errors.

Define weekend, holiday, and missing-date fallback. Intraday rates require timestamps and timezone. Preserve competing source values and select by approved priority. Missing rates must not silently become one or an arbitrary previous record.

Separate event, settlement, closing, and average rates

Transaction recognition follows event_date, cash settlement follows settlement_date, and period-end reporting may use a closing rate. Approved average or planning rates are separate analytical policies. Model date roles and rate_type in the join.

A transaction-weighted average is not automatically a market period average. If only monthly rates exist, disclose monthly resolution rather than materializing identical daily records and claiming daily precision.

Govern triangulation, inverses, precision, and rounding

When a direct pair is absent, an approved pivot may support triangulation. Retain both rate IDs, path, and final precision. Forward and reverse vendor rates may not be exact inverses because of spreads and publication timing, so preserve evidence.

Define amount scale, rate scale, rounding mode, and whether rounding occurs per line or after aggregation. Record deterministic residual adjustments rather than hiding the difference in an arbitrary business row.

Represent remeasurement and translation as adjustment facts

Do not overwrite the original functional amount when an open item is remeasured or settled. An adjustment fact can store object, period, old and new amount, difference, rate, policy, run, and reversal relationship.

This permits both transaction-time operating analysis and period-end reporting. In-place updates destroy the explanation of whether a change came from business activity, FX movement, or a new policy.

Treat backfills and policy changes as controlled restatement

When a rate source publishes late or revises history, create a new version and identify affected facts. Finance policy determines whether to reopen, post a current adjustment, or leave a closed period unchanged.

Reports should not always join to the latest rate because published numbers would drift without a restatement marker. Model close status, approval, impact, and replay evidence.

Accept with currency conservation and edge cases

Require currency on every amount, a unique valid rate, reproducible conversion, consistent refund signs, no mixed-currency totals, and conserved adjustments. Test direct and triangulated pairs, inversion, weekends, negative values, rare currencies, missing rates, rounding, and repeated backfill.

Reconcile functional totals by entity and period to an approved ledger or report, separating business, rate, rounding, and timing differences. A few ordinary USD orders do not exercise the risky paths.

BuildTable.ai boundary

Have finance approve roles and policies, inventory every amount and date, build versioned FX facts, preserve original amounts, implement adjustments, and reconcile before publishing semantic metrics. Monitor missing rates, stale rates, restatement impact, and ledger difference.

BuildTable.ai may be evaluated for fact, rate, and semantic result modeling. This article does not establish built-in IAS 21 treatment, authoritative rate acquisition, or accounting judgment. Sources, precision, scheduling, approval, and restatement behavior require project verification by qualified owners.

Public references

Build an AI-ready data foundation

Contact us to discuss your data modeling scenario and access BuildTable Desktop.

Contact us