Skip to main content
DualEntry’s multi-currency support lets you transact in foreign currencies while maintaining your books in a functional currency. You configure currency settings per entity, choose how exchange rates are sourced, and run period-end revaluation to keep balances current.

Setting the functional currency

You set the functional (base) currency for each company/entity during entity creation in Configuration → Accounting Setup → Currencies. The functional currency is the currency your books are denominated in. All reporting for that entity ultimately resolves to this currency. DualEntry uses the functional currency as the basis for all journal entries, account balances, and financial statements produced for that entity. Changing the functional currency after initial setup is a significant operation that requires restating historical balances. Plan your functional currency carefully before creating transactions. If you operate across multiple entities with different functional currencies, DualEntry handles the translation during consolidation using the rate types described below.
Changing an entity’s functional currency after transactions have been recorded triggers a full restatement. Coordinate with your implementation team before making this change.
Troubleshooting: functional currency missing from the dropdownWhen you add a new company, the functional currency picker only lists currencies that are already enabled on the tenant. If the currency you need (for example, SGD for a new Singapore entity) is not in the list, enable it first:
  1. From an existing company, go to Accounting Setup → Currencies.
  2. Add the missing currency to the enabled list and save.
  3. Return to the new company form. The currency now appears in the functional currency dropdown.
Every ISO currency is available in Accounting Setup → Currencies; it only has to be enabled once before it can be selected as another entity’s base currency.

Enabling transactional currencies

Once your functional currency is set, you enable the additional currencies you transact in. Navigate to Accounting Setup → Currencies and add each currency to your enabled list. When you create a bill, invoice, or other transaction in a non-functional currency, DualEntry captures both the transaction amount in the foreign currency and the exchange rate used for conversion. You can enable as many transactional currencies as you need. Each enabled currency appears as an option when creating or editing transactions. DualEntry stores both the foreign-currency amount and the functional-currency equivalent on every transaction line, so you always have access to the original amounts alongside the converted figures in reports and account balances.

Stablecoins and crypto assets

DualEntry’s currency list is ISO 4217 fiat only. Stablecoins such as USDC, USDT, and DAI, and other cryptoassets such as BTC and ETH, are not currencies in DualEntry. You cannot enable one in Accounting Setup → Currencies, set one as an entity’s functional currency, or select one on a bill, invoice, or journal entry. The same limit applies to the FX rate sources below. The exchange rate table accepts ISO 4217 pairs only, so you can’t store a USDC to USD rate through the built-in provider, manual entry, or CSV upload. Seeing a token ticker in a third-party rate feed or a connected wallet does not change this: there is no configuration that makes a stablecoin behave as a currency in DualEntry. You account for the holding in fiat instead. The usual pattern is:
  1. Hold the wallet or exchange account as a GL account denominated in fiat. Create the account in your chart of accounts in the currency your accounting policy calls for, which is normally the entity’s functional currency.
  2. Track the token quantity separately. Use a statistical account to record the unit balance, since statistical accounts hold non-monetary quantities and post nothing to the General Ledger.
  3. Record activity as journal entries. Post purchases, sales, transfers, fees, and any remeasurement as ordinary journal entries at the fiat amount. Direct gains and losses to the accounts your policy specifies.
  4. Reconcile the account against the wallet or exchange statement. A crypto wallet account reconciles like any other non-bank balance-sheet account. See Reconciliation.
Foreign currency revaluation never adjusts for token price movement. Revaluation reads the account’s assigned fiat currency. DualEntry doesn’t revalue a wallet account held in the entity’s functional currency at all, and revalues one held in a foreign fiat currency only for that fiat’s FX movement. Any remeasurement of the token itself is a journal entry you post yourself. If your team keeps a crypto subledger in Cryptoworth, you can read portfolio value, cost basis, realized and unrealized gains and losses, and wallet reconciliation status from inside Accounting Intelligence through the Cryptoworth MCP connector. That connector is read-only: nothing it returns posts to the ledger until you draft the entry. Whether a given token is accounted for as a cryptoasset, an intangible, or another financial asset depends on the facts and the accounting policy you apply. DualEntry does not make that determination for you.

Viewing an account balance in its assigned currency

When you assign a currency to a GL account (bank or non-bank) via the account’s currency_iso_4217_code field in the chart of accounts, DualEntry keeps a running balance in that native currency in addition to the functional-currency equivalent. Two places show the native balance:
  • Account detail page. Open Chart of Accounts → the account. The header displays the current balance in the account’s assigned currency; the functional-currency equivalent appears alongside it. The transaction list underneath shows each entry’s original amount in the assigned currency.
  • General Ledger report. Run Reports → General Ledger, filter to the account, and enable the Transaction currency column from the column picker. Each line shows the amount in its native currency; the report footer totals the balance in that currency.
Standard financial statements (Balance Sheet, Income Statement) always present in the entity’s functional or the report’s reporting currency. They do not display per-account native balances. When you run a report at the company level, the amount for a currency-assigned account is translated to the functional currency using the rate type configured for that account type (see Rate types). To reconcile a currency-assigned account back to its native balance, use the account detail page or the General Ledger report as described above, or use the dual-currency view on custom reports.

FX rate sources

DualEntry provides three ways to source exchange rates:
  • Built-in provider: DualEntry pulls rates automatically from a built-in FX rate provider, updated daily. This is the default and requires no configuration beyond enabling it.
  • Manual entry: you enter rates directly for specific currency pairs and dates. Use this when you have negotiated rates or need to override the provider rate for a specific transaction.
  • CSV upload: upload a rate table with date, currency pair, and rate columns. This is useful for importing rates from your treasury system or central bank.

Rate precision

Exchange rates are stored and calculated with up to 16 decimal places. The API accepts rates at this precision on journal entries, bills, invoices, and payments, and rate edit fields in the UI accept up to 16 decimal places. Two display and entry behaviors are worth knowing when you work with high-precision rates:
  • View mode rounds the display. Rate fields in view mode show the rate rounded to 6 significant digits. The full-precision value remains stored and is what DualEntry uses in all conversions; the rounding is display-only.
  • The Consolidated Exchange Rates form accepts up to 9 decimal places for the average, current, and historical rates entered there.
Rates on transactions keep up to 16 decimal places. DualEntry stores high-precision rates (for example, for BRL or IDR) in full when you enter them on the transaction itself or submit them through the API, even though view-mode displays round to 6 significant digits.

Rate types

DualEntry uses three rate types, each serving a different purpose:
  • Spot rate (historical rate): used for individual transactions at the date they occur. Once a transaction is booked, its spot rate is locked to the transaction date and never retroactively adjusted.
  • Period-end rate: used for balance sheet revaluation at the closing date of each period.
  • Average rate: used for income statement translation when consolidating entities with different functional currencies.
You configure which rate type applies to each context. The built-in provider supplies daily spot rates; you derive period-end and average rates from these or enter them manually.

Historical rate locking on transactions

DualEntry locks every transaction to the spot (historical) exchange rate as of its transaction date. This happens automatically when the transaction is booked. You do not enter or update the rate manually, and the system does not retroactively re-rate posted transactions or average them across periods. Each transaction permanently retains its own historical rate, which is the correct accounting treatment for equity and other date-specific events under ASC 830 / IAS 21. If you need to override the rate on a specific transaction (for example, to match a negotiated contract rate), you can enter it manually at the time of booking. The manual rate is then locked to that transaction the same way. Example: CAD equity raise across two dates. Assume your functional currency is USD and you raise equity in CAD on two separate dates:
  • June 2025 raise: booked and locked at the June 2025 CAD/USD spot rate on the transaction date.
  • Later raise: booked and locked at that later date’s own CAD/USD spot rate.
Each raise stays on the books at its own historical rate. The combined equity balance in USD is the sum of the two USD-equivalent amounts (effectively a blended rate across the two raises), and DualEntry never retroactively adjusts either entry or averages them into a single rate. Equity accounts continue to translate at these historical rates in consolidation, consistent with the translation rules for reporting.

Foreign currency revaluation

At period end, you run foreign currency revaluation to restate open foreign-currency balances at the closing rate. Navigate to the revaluation screen, choose the period, and run the process. DualEntry creates a revaluation journal entry that posts the unrealized gain or loss to the account you configure (typically an unrealized FX gain/loss account on the income statement). Revaluation applies to open AR, AP, and any other balance sheet accounts denominated in a foreign currency. The journal entry reverses on the first day of the next period, so the next revaluation starts fresh. For the full procedure, including the automatic monthly run and the account-by-account review tabs, see Currency Revaluation.

Realized gains and losses

When you pay a foreign-currency bill or receive payment on a foreign-currency invoice, DualEntry automatically computes the realized gain or loss. The realized amount is the difference between the rate at which the transaction was originally recorded and the rate at which settlement occurs. DualEntry posts the realized gain or loss to your configured FX gain/loss account. Realized FX amounts appear as separate line items in the journal entry that records the payment, making them easy to identify in the general ledger. You can report on realized gains and losses by account, entity, currency pair, and period using the custom report builder. For details on how multi-currency data appears in reports, see multi-currency reporting. For consolidation of entities with different functional currencies, see multi-entity consolidation.
Last modified on October 9, 2026