Multi-Currency Accounting in ERPNext
As geographic barriers have eroded, it has become more common to do business across borders using different currencies. Customers prefer to receive invoices in their own currency, governments require reporting in the currency transactions were made, and companies with foreign bank accounts need general ledgers that reflect those currencies directly. Recording exchange rate fluctuations also enables a company to track foreign exchange gains and losses as part of strategic financial management.
Although it is theoretically possible to convert all transactions to a local currency, doing so creates currency mismatches from daily exchange rate fluctuations, complicates bank reconciliation, and may violate legal or tax requirements in jurisdictions that mandate recording transactions in the currency in which they occurred. ERPNext supports recording transactions in their original currency and maintains the relationship between foreign currency amounts and their local currency equivalents throughout the accounting lifecycle.
Setup
Multi-currency accounting in ERPNext requires three things to be configured before transactions can be recorded: accounts, parties, and currency exchange records.
Accounts
Each foreign currency requires its own account. A US company whose books are kept in USD but also sells to European customers in EUR needs at minimum two accounts receivable: one for domestic customers in USD and one for EUR customers. The currency is set on the account record itself, which causes ERPNext to record and display balances in that currency wherever the account appears.
| Account | Currency |
|---|---|
| Accounts Receivable | |
| Accounts Receivable - USD | USD |
| Accounts Receivable - EUR | EUR |
Parties
The transaction currency for each party is set in the Billing Currency field on the customer or supplier record. As a best practice, a separate customer or supplier record should be created for each currency in which a party transacts—this keeps the account balance for each currency distinct and simplifies reconciliation. ERPNext reinforces this implicitly: once GL entries exist for a party in a given currency, it will prevent posting new transactions for that party using a different currency account.
If separate per-currency party records are not needed, enable Allow Multi-Currency Invoices Against Single Party Account under Accounts Settings > Invoice and Billing. This allows a single party record to be used for transactions in any currency, with all amounts posted to the party's account in local currency.
Currency Exchange Records
Create currency exchange records in the Currency Exchange list so ERPNext can perform conversions when transactions are recorded. Mark each record For Selling, For Buying, or both, depending on where it will apply.
When a transaction is created, ERPNext looks up the exchange rate in this order: first from a matching Currency Exchange record, then from an external market data service (exchangerate.host as of ERPNext v13.10.0), and finally prompts for manual entry if neither source returns a rate.
By default, ERPNext checks whether a currency exchange record exists for the transaction date and warns if none is found within a configured number of lookback days. For example, with 2 lookback days configured, creating an invoice on April 18 when the most recent record is dated April 15 will produce a warning. Enable Allow Stale Exchange Rates under Accounts Settings > Invoice and Billing to suppress this check and always use the most recently created record regardless of date.
Multi-Currency Transactions
ERPNext supports multi-currency accounting in Sales Invoices, Purchase Invoices, Payment Entries, and manually created Journal Entries. The workflow for Sales Invoices and Purchase Invoices is the same—the difference is that Sales Invoices use the Sales module and customer records, while Purchase Invoices use the Purchasing module and supplier records. The examples below use Sales Invoices.
Sales and Purchase Invoices
When creating a Sales Invoice, select the customer configured for the desired foreign currency. In the Currency and Price List section, confirm the transaction currency and the exchange rate relative to the company currency. Confirm that the receivable account in the Accounts section is the foreign currency account that matches the transaction currency — if the wrong account appears, correct it before submitting.
When the invoice is submitted, ERPNext posts the general ledger entry in the company currency, converting foreign currency amounts at the exchange rate used in the transaction. In this example a €1,000.00 invoice is posted at a rate of 1.08 USD per EUR:
| Account | Party | Debit | Credit |
|---|---|---|---|
| Accounts Receivable - EUR | Customer A | $1,080.00 | |
| Sales | $1,080.00 |
The General Ledger report displays amounts in local currency (USD) by default. When filtering by the foreign currency account directly, amounts display in that account's configured currency (EUR), because ERPNext knows the account's denomination.
Payment Entry
A Payment Entry records either the collection of payment from a customer or the disbursement to a supplier; the process is the same in both cases. Creating the Payment Entry from the invoice ensures amounts are correct and the outstanding balance is properly closed.
Select the Mode of Payment on the Payment Entry. There are two scenarios depending on the currency the party remits:
When the customer pays in the invoice currency (EUR), select the mode of payment configured for that currency. ERPNext creates accounting entries in EUR. Using the same €1,000.00 invoice at 1.08 USD/EUR:
| Account | Party | Debit | Credit |
|---|---|---|---|
| Bank EUR | €1,000.00 | ||
| Accounts Receivable - EUR | Customer A | €1,000.00 |
When the customer pays in the company's currency (USD), select the mode of payment configured for USD. ERPNext allocates the USD payment against the foreign currency receivable account, converting at the exchange rate from the original invoice:
| Account | Party | Debit | Credit |
|---|---|---|---|
| Bank USD | $1,080.00 | ||
| Accounts Receivable - EUR | Customer A | $1,080.00 |
If the exchange rate has moved between the invoice date and the payment date, the settled amount in local currency will differ from what was originally recorded on the receivable. ERPNext surfaces this as a Difference Amount and, when Set Exchange Gain/Loss is clicked, posts the difference to an exchange gain or loss account. For example, if the rate fell from 1.08 to 1.05 USD/EUR by the time of payment, the company receives fewer dollars than originally recorded:
| Account | Party | Debit | Credit |
|---|---|---|---|
| Bank USD | $1,050.00 | ||
| Exchange Loss | $30.00 | ||
| Accounts Receivable - EUR | Customer A | $1,080.00 |
Journal Entries
Multi-currency Journal Entries can be created manually by checking the Multi-Currency option on the Journal Entry. This allows each row to carry an amount in the currency of its selected account, with ERPNext converting to local currency automatically. Local currency accounts can be mixed into the same entry — for example, to record an exchange difference on a manual adjustment:
| Account | Currency | Debit | Credit |
|---|---|---|---|
| Accounts Receivable - EUR | EUR | €500.00 | |
| Sales | USD | $540.00 | |
| Exchange Loss | USD | $0.00 |
Exchange Rate Revaluation
At year-end it is common practice to revalue all foreign currency balances at a uniform exchange rate so that financial statements reflect consistent values. ERPNext provides the Exchange Rate Revaluation tool for this purpose.
Open Exchange Rate Revaluation from the Accounting module. Select the Posting Date—ERPNext will use the most recent exchange rate on or before that date as the new rate. Click Get Entries to fetch all accounts with foreign currency balances, then submit the document and click Create > Journal Entries to generate the accounting entry.
The journal entry cancels each account's balance at a weighted average of the historical rates used during the year, then re-enters it at the new rate. Because the account balance is made up of transactions posted at different rates, ERPNext derives the effective historical rate as:
Historical Rate = Balance in Local Currency ÷ Balance in Foreign Currency
For example, if the Accounts Receivable - EUR account has a USD balance of $108,000.00 and a EUR balance of €100,000.00, the effective historical rate is 1.08 USD/EUR. If the year-end rate is 1.10 USD/EUR, the revaluation journal entry looks like this:
| Account | Debit (USD) | Credit (USD) | Note |
|---|---|---|---|
| Accounts Receivable - EUR | $108,000.00 | cancel balance at historical rate (1.08) | |
| Accounts Receivable - EUR | $110,000.00 | re-enter balance at new rate (1.10) | |
| Exchange Gain | $2,000.00 | difference between rates |
Confirm that the amount being cancelled in the journal entry matches the balance shown in the General Ledger for that account before submitting. The resulting General Ledger balance after revaluation reflects the account denominated uniformly at the new rate.
Reports
Two reports are particularly important for multi-currency accounting: the General Ledger and the Accounts Receivable or Accounts Payable reports.
General Ledger
The General Ledger is accessible from the Accounting module, or directly from any transaction via View > Accounting Ledger. The report's filter settings determine what currency amounts are displayed in. The table below shows the same USD sales invoice entry rendered under four different filter combinations:
No filters (default) — all amounts in local currency (USD), foreign currency accounts converted at the report date rate:
| Account | Party | Debit (USD) | Credit (USD) | Balance (USD) |
|---|---|---|---|---|
| Accounts Receivable - EUR | Customer A | $1,080.00 | $1,080.00 | |
| Sales | $1,080.00 | $1,080.00 |
Currency filter: EUR — all amounts converted to EUR at the report date rate (here 1.08 USD/EUR):
| Account | Party | Debit (EUR) | Credit (EUR) | Balance (EUR) |
|---|---|---|---|---|
| Accounts Receivable - EUR | Customer A | €1,000.00 | €1,000.00 | |
| Sales | €1,000.00 | €1,000.00 |
Account filter: Accounts Receivable - EUR — amounts displayed in that account's configured currency (EUR), regardless of the Currency filter:
| Account | Party | Debit (EUR) | Credit (EUR) | Balance (EUR) |
|---|---|---|---|---|
| Accounts Receivable - EUR | Customer A | €1,000.00 | €1,000.00 |
No filters + Add Columns in the Transaction Currency — USD columns plus additional columns showing the original transaction currency (EUR):
| Account | Party | Debit (USD) | Credit (USD) | Debit (EUR) | Credit (EUR) |
|---|---|---|---|---|---|
| Accounts Receivable - EUR | Customer A | $1,080.00 | €1,000.00 | ||
| Sales | $1,080.00 | €1,000.00 |
By default, ERPNext converts foreign currency account balances to local currency using the exchange rate of the report date, not the rate used when each transaction was originally recorded. Historical balances will therefore shift as exchange rates change. Some ERPNext implementations customize this behavior so that each line converts at the rate used in the original transaction.
Accounts Receivable and Accounts Payable
The Accounts Receivable report (for customers) and Accounts Payable report (for suppliers) show outstanding amounts pending collection or payment. Amounts display in local currency by default. Enable the In Party Currency option to display amounts in the customer's or supplier's currency instead. This is particularly useful when reconciling balances with a foreign party, since the amounts match what appears on the invoices they received.