Before you start
- Both accounts already exist in DualEntry as Bank or Credit Card accounts on the same company. System-managed accounts can’t be used. Add a new account through the chart of accounts, or connect its live feed first through Bank Connections.
- If either account uses a currency other than your company’s base currency, have your bank’s confirmation ready. You can enter the rate or base-currency amount your bank booked on each account instead of DualEntry’s system rate, and decide whether DualEntry posts the resulting gain or loss.
- A role that can post to the accounts involved. Where an approval workflow covers bank transfers, the transfer is held in Draft and routed instead of posting on save.
Create a bank transfer
- Navigate to Accounting → Transactions → Bank Transfers and choose New Bank Transfer.
- Set Company, then Sending Account and Receiving Account. Each list only shows Bank or Credit Card accounts that belong to the selected company, and excludes whatever account is already selected on the other side.
- Enter Sending amount. If the two accounts share a currency, Receiving amount stays in sync automatically; if they don’t, DualEntry auto-populates it from the exchange rate (see the next section).
- Set Posting Date and, if your organization has it enabled, Transaction Date. Add a Memo if it’s useful for reference.
- Choose Save as Draft to hold the transfer with no GL impact, or Send for Approval to route it through your approval workflow. With no matching workflow, saving posts the transfer immediately.
Same-currency vs. different-currency transfers
A same-currency transfer is straightforward: the amount debited to the Receiving Account always equals the amount credited from the Sending Account, with no exchange rate and no gain or loss. A different-currency transfer needs an exchange rate. DualEntry auto-populates Exchange Rate based on the Posting Date and calculates Receiving amount from Sending amount and that rate. You can edit the rate directly, or type into Receiving amount to back-calculate it instead. Because the two legs are in different currencies, DualEntry also needs to decide how to value each one in the company’s base currency for the GL, which is what Calculate Gain/Loss and Bank Currency Anchor control.Decide whether to calculate a realized gain or loss
By default, DualEntry values each leg of a cross-currency transfer independently at its own rate to base currency: the system rate for the Posting Date, or the rate you enter on that account (see Override the rate to base currency on each account). For a same-day conversion between your own accounts, the residual between those two independent valuations isn’t a real economic gain or loss. It’s a mismatch between DualEntry’s system rate and the rate your bank actually used, since nothing was held in a foreign-currency position across periods. Calculate Gain/Loss controls whether DualEntry posts that residual.Turn Calculate Gain/Loss off for a same-day conversion
- Enter Sending Account and Sending amount as usual, and select Receiving Account.
- Turn Calculate Gain/Loss off.
- If neither account is in your company’s base currency, set Bank Currency Anchor to choose which account’s exchange rate to trust; DualEntry derives the other leg’s rate so both sides value to the same base-currency amount. It defaults to the Sending Account. If either account is already the base currency, DualEntry anchors to it automatically and doesn’t show this choice.
- Enter the actual amount your bank credited to the Receiving account, from your bank statement or transfer confirmation.
- Save. The transfer posts using that actual amount on both legs, with no Realized Gain/Loss line.
Leave Calculate Gain/Loss on
This is the default, and it matches how every cross-currency bank transfer worked before this control existed: each leg is valued independently at its own rate to base currency, and any residual posts to Realized Gain/Loss automatically. Leave it on unless you have a specific reason, such as a same-day conversion, to anchor the transfer to one side instead.Override the rate to base currency on each account
Each account card on a cross-currency transfer has its own FX Rate to [Base] and Base Amount ([Base]) fields, where [Base] is your company’s base currency. They set how DualEntry values that leg in the GL. Use them to make the posted base-currency amounts match what your bank booked, rather than DualEntry’s system rate. DualEntry pre-fills FX Rate to [Base] with the system rate for the Posting Date, shown as a line under the fields (for example, 1 USD = 0.847602 EUR), and calculates Base Amount as the account’s amount times that rate. To override either one:- Open the transfer in Create or Edit and find the Sending or Receiving account card.
- Type the rate your bank used into FX Rate to [Base], or type the base-currency amount from your bank confirmation into Base Amount. Editing either field recalculates the other, and the card’s tag changes from System rate to Overridden, with the system rate shown beside it for comparison.
- Repeat on the other card if needed, then save.
- Calculate Gain/Loss on: you can override both cards. Realized Gain/Loss equals the Sending account’s base amount minus the Receiving account’s base amount, using your overrides, and the posted journal entry uses those same values.
- Calculate Gain/Loss off: you can only edit the card of the account chosen as Bank Currency Anchor. The other card’s base amount always equals the anchor’s, its rate is shown read-only and tagged Implied from anchor, and no gain or loss line posts. Switching the anchor switches which card you can edit. The Estimated FX difference callout uses the rates shown on the cards, including your overrides.
Editing a posted transfer’s rates to base currency, base amounts, Calculate Gain/Loss, or Bank Currency Anchor reposts its journal entry with the new values. DualEntry records the change in the transfer’s audit history.
Example: match the base amounts your bank booked
In this example a company with a EUR base currency moves USD 120,000.00 to a GBP account that receives GBP 90,000.00. The bank’s confirmation values the USD side at EUR 102,000.00 and the GBP side at EUR 101,250.00, which DualEntry’s system rates don’t reproduce. To post the bank’s figures with Calculate Gain/Loss on:- Enter the transfer as usual: Sending amount USD 120,000.00 and Receiving amount GBP 90,000.00, which sets Exchange Rate to 0.75.
- On the Sending card, type 102,000.00 into Base Amount (EUR). FX Rate to EUR becomes 0.85.
- On the Receiving card, type 101,250.00 into Base Amount (EUR). FX Rate to EUR becomes 1.125.
- Save.
The EUR 750.00 realized loss is the Sending base amount minus the Receiving base amount. With Calculate Gain/Loss off and the Sending account as Bank Currency Anchor, you’d enter only the Sending card’s base amount. Both legs then post at EUR 102,000.00, the Receiving rate is implied as 102,000.00 ÷ 90,000.00 (shown as 1.133333 when you view the saved transfer), and no gain or loss line posts.
Field reference
Understand the GL impact
A same-currency transfer debits the Receiving Account and credits the Sending Account for the same amount, with no gain or loss line. A different-currency transfer with Calculate Gain/Loss on values each leg independently at its FX Rate to [Base]. For example, with a USD base currency, an EUR sending account, a CAD receiving account, an EUR:USD rate of 1.1, and a CAD:USD rate of 0.72: sending €1,000 debits the CAD receiving account for CAD 1,500 (base $1,080) and credits the EUR sending account for €1,000 (base $1,100). DualEntry debits Realized Gain/Loss for the $20 residual so the entry balances. A different-currency transfer with Calculate Gain/Loss off anchors both legs to the same base-currency amount instead of two independent system-rate lookups, so no gain or loss line is created. For example, sending $730,000 from a USD account to an AUD account that actually receives A$1,038,433.53, with Bank Currency Anchor set to the Receiving Account, debits the AUD account and credits the USD account for $730,000 (base) each, with no residual line.Verify
Open the transfer from the list; its detail view has its own Overview, GL Impact, and Activity tabs. A bank transfer is complete once it shows a status of Posted, its GL Impact tab shows the expected debit to the Receiving Account and credit to the Sending Account, and, on a cross-currency transfer, whether a Realized Gain/Loss line appears matches what you chose under Calculate Gain/Loss. Its Activity tab records the save and any approval events against the person who took them.Good to know
- Finding a transfer: the list splits into Overview, Draft, Archived, and For Approval tabs by status. A transfer you saved as a draft or sent for approval won’t appear on Overview until it posts.
- Wire fees: if your bank deducts a fee from the amount received, still enter the full amount sent and received in the transfer, and record the fee as a separate transaction, such as a Direct Expense. This keeps the transfer reconcilable against your bank statement.
- Multi-day transfers: when Posting Date differs from Transaction Date, the funds sat in a currency position across a rate change, so confirm the entered rate matches what your bank actually used before turning Calculate Gain/Loss off. That control is meant for atomic, same-day conversions.
- Changing the date or an account: on a transfer with rate overrides, changing Posting Date or picking an account in a different currency resets both cards to the system rates for the new date. Re-enter your overrides afterward.
- Duplicating a transfer: the copy starts with the original’s rates to base currency, including any overrides. Changing its Posting Date resets them to that date’s system rates.
- Rates through the API: send
sending_base_rateandreceiving_base_ratetogether, or leave both out to use the system rates. Base amounts are calculated from the rates, sosending_base_amountandreceiving_base_amountare returned on read but not accepted on write. See Create a bank transfer in the API reference. - Matched transfers: once a transfer has been matched to an imported bank-feed transaction in Bank Match, its company and its Sending or Receiving Account can no longer be changed.
- Approval routing: an approval policy for bank transfers can be configured to trigger based on the transfer’s amount, currency, memo, or date, the same condition types available on other approval-routed records.
- Period locks: bank transfers are governed by the company’s Other GL period lock. Saving or editing one is blocked once the posting date falls on or before that lock date, except for archiving a transfer that’s still in Draft.