The short answer
The Unrealized Gain/Loss account does not equal one revaluation run, because each run is offset by the next period's reversal.
If you need to reconcile NetSuite currency revaluation unrealized gain/loss, start from two identities. The month's activity is this month's revaluation transactions minus the automatic reversal of last month's, which posts on the first day of the new period (Oracle: Currency Revaluation Transactions). The year-to-date balance is the open unrealized position at this month-end minus the position at last year-end.
Tie on that basis first. Whatever is left over has a cause, and the rest of this guide names the usual ones.
A few terms. Revaluation (remeasurement) restates open foreign-currency balances at the period-end exchange rate. Unrealized means the balance is still open. Realized means a payment has settled it.
One receivable, three months
Take a US-dollar subsidiary that invoices a customer EUR 10,000 in January at 1.05, so the receivable is booked at USD 10,500. The numbers below are synthetic. A positive figure is a gain, which is a credit to the gain/loss account.
| Date | Event | Rate | Unrealized G/L | Realized G/L | AR in USD |
|---|---|---|---|---|---|
| Jan | Invoice posted | 1.05 | 0 | 0 | 10,500 |
| Jan 31 | Revaluation | 1.10 | +500 | 11,000 | |
| Feb 1 | Reversal | -500 | 10,500 | ||
| Feb 28 | Revaluation | 1.08 | +300 | 10,800 | |
| Mar 1 | Reversal | -300 | 10,500 | ||
| Mar 15 | Customer pays | 1.07 | +200 | 0 |
The Unrealized Gain/Loss account moves +500 in January, -200 in February (the -500 reversal plus the +300 run) and -300 in March. The cumulative open position is 500, then 300, then zero once the invoice is paid.
The realized gain is USD 200, measured against the original USD 10,500, because the March 1 reversal put the receivable back at its booked value. The lifetime P&L effect is +500 - 200 - 300 + 200 = USD 200, which equals 10,700 minus 10,500. If your own example doesn't close like this, a sign is wrong somewhere.
This example assumes a OneWorld or Multiple Currencies account, the default posting accounts, no variance mapping and one accounting book. Later sections drop each assumption in turn.
What a revaluation run creates
A run produces system-generated currency revaluation transactions of five types, and none of them is a journal entry.
Oracle lists the types as Unrealized Gain/Loss, Reversal of Unrealized Gain/Loss, Realized Gain/Loss, Rounding Gain/Loss and Base Currency Adjustment (Oracle: Currency Revaluation Transactions). You find them at Transactions > Financial > Revalue Open Currency Balances > List, and Make Journal Entries won't show them.
| Type | When it posts | Notes |
|---|---|---|
| Unrealized Gain/Loss | Each revaluation run, at period end | Reversed on the first day of the next period |
| Reversal of Unrealized Gain/Loss | Automatically, for each unrealized transaction | Can't be edited directly; follows its parent |
| Realized Gain/Loss | When a payment is applied | Never reversed |
| Rounding Gain/Loss | When a payment is applied to a source document | Posted to its own account |
| Base Currency Adjustment | When a residual would otherwise revalue forever | Deleted and recreated on a rerun |
The Base Currency Adjustment equalises the foreign-currency and base-currency balances. Without it, a small residual would be revalued and reversed every month indefinitely.
The gain and loss accounts appear once qualifying transactions occur. Unrealized Matching Gain/Loss shows up on the GL Impact subtab of certain foreign-currency transactions, such as the bank deposit of a customer payment. Depending on the year your account was set up, you may also see an Exchange Rate Variance account (Oracle: Foreign Currency Gain and Loss Accounts).
The system Realized and Unrealized accounts are Other Expense accounts on the income statement (Oracle: Account Types). They post normally. They are neither non-posting accounts nor liabilities.
Why one run gives you two transactions
Open Receivables and Open Payables are revalued in one transaction and Other Accounts in another. Each transaction is capped at 2,000 lines (Oracle: Revaluing Open Currency Balances). A reconciliation that finds only one of the pair will be short.
The run itself has no preview step. You pick the Posting Period, the Accounting Book (Multi-Book only), the Subsidiary, optional filters, the Account Type and the accounts, then click Save, which runs and posts. The Total Variance field shows the net effect: a positive number is a credit to the period, a negative number a debit (Oracle: Viewing Revaluation Results).
Why the account keeps a balance
A year-to-date balance on Unrealized Gain/Loss is normal, because some foreign-currency items are still open at the latest month-end.
That balance should equal the unrealized position open now, less the reversal of last year-end's position. When it doesn't, look for one of these:
- A manual FX journal posted with no reversal date.
- A mapped variance whose destination account is missing from the walk.
Hypothesis: a rerun whose incremental transactions were deleted by hand, or an original revaluation edited after its reversal period closed, would also leave a gap. Oracle doesn't say how common either is, so check for them only after the first two.
Reversals can't be edited or deleted on their own. If you edit or delete the parent month-end revaluation, NetSuite updates or removes the reversal with it (Oracle: Currency Revaluation Transactions). That is the supported way to correct a bad run.
The deferred revenue residual
VCG's consultants often find an "FX balance that won't clear" in a deferred revenue account flagged as not revalued. The mechanics, shown here with synthetic figures, go like this.
Revenue recognition posts the multi-year contract at the sales order rate. Manual gross-up journals for unbilled years post at the month-end spot rate and reverse a year later. A contract nets to zero only when the gross-up rate equals the rate revenue recognition used for the same installment.
Say an installment of EUR 100,000 was recognised at 1.08 and grossed up at 1.10. The USD 2,000 difference stays in the account after the gross-up reverses. Multiply that by every contract and every year and the account drifts away from zero.
Walk 1 and Walk 2: the GL tie-out
Prove the number with two walks: one across the P&L account, one across each revalued balance sheet account.
Walk 1: the Unrealized Gain/Loss account
- Add every Unrealized Gain/Loss transaction dated this month, including each incremental rerun and both the AR/AP and Other Accounts transactions.
- Subtract the Reversal of Unrealized Gain/Loss posted on day 1 for last month's run.
- Add or subtract mapped variances and manual FX journals.
- The result should equal the month's activity on the account.
- To check the balance instead, compare the account's cumulative balance with the open unrealized position at month-end.
In the example above, February is +300 minus 500, which is -200. The cumulative balance is 300.
Pull revaluation transactions by type and transaction number, never by memo. VCG has seen extracts where revaluation transactions arrive with no memo at all, so a description filter silently misses them.
Walk 2: each balance sheet account
For every account with its revalue box checked, multiply the foreign-currency open balance by the period-end rate. Compare that with the base-currency GL balance after revaluation. The difference should be zero.
The checkbox is "Revalue Open Balance for Foreign Currency Transactions" on the account record. Its defaults come from Oracle's table (Oracle: Types of Accounts That Can Be Revalued):
| Account type | Revalued? | Can you change it? |
|---|---|---|
| Accounts Receivable, Accounts Payable, Unbilled Receivable | Always | No |
| Bank, Credit Card, Long-Term Liability, Other Current Liability | Checked by default | Yes |
| Fixed Asset, Other Current Asset, Other Asset, Deferred Revenue, Deferred Expense | Clear by default | Yes |
| Equity | Never | Not covered here |
| COGS, Expense, Income, Other Expense, Other Income | Never | Not covered here |
Bank and credit card accounts have one catch. A foreign-currency transaction posted to a bank account whose currency is the subsidiary's base currency is treated as a base-currency transaction and isn't revalued. Reconcile each foreign-currency bank account in its own currency before you look at the base amount.
NetSuite lets you check the box on a Fixed Asset account. Under ASC 830 and IAS 21, non-monetary items carried at historical cost are not remeasured, so turning it on for such an asset produces the wrong answer even though the system accepts it.
Reports and queries for the walks
Use Reports > Financial > Unrealized Exchange Rate Gains and Losses and Reports > Financial > Realized Exchange Rate Gains and Losses. Both filter by period, Subsidiary Context and Accounting Book (Oracle: Exchange Rate Gains and Losses Reports).
A transaction saved search filtered to the currency revaluation type, grouped by account and posting period, gives you Walk 1 in one view. Confirm the type's internal id in your own account before relying on it.
If you build the tie-out in SuiteQL, page it to the end. A single SuiteQL read stops at 5,000 rows without an error, and a revaluation detail pull hits that quickly. The fix is covered in our guide to the SuiteQL 5,000-row limit.
GL versus subledger after revaluation
When the base-currency total ties and the functional-currency total doesn't, the usual cause is a consolidated rate difference, not a subledger error.
Compare the base amount with the foreign amount line by line. That proves which rate each side used.
Some lines are never revalued, so they won't appear in the run detail:
- Balances in accounts whose revalue box is clear.
- Transactions outside the selected period.
- Fully paid items, whose difference moved to realized at payment. A voided applied payment is the exception.
Per-customer views add an entity mismatch. Invoice lines and revenue recognition journals can carry the project as the line entity, while manual journals carry the customer. A per-customer balance has to include both, or invoices drop out and the account looks out of balance.
Migrated accounts add another. If history was converted at the sales order header rate, the subledger only reproduces at that same rate. Converting it at the period rate won't tie.
Which exchange rate the run uses
Revaluation uses the period-end rate, or today's rate if you run it from the menu early.
That rule comes straight from Oracle (Oracle: Foreign Currency Revaluation). Rates are expressed as base-currency units per foreign-currency unit, so 1.08 on a EUR rate in a USD subsidiary means USD 1.08 per euro (Oracle: Currency Exchange Rates).
If Currency Exchange Rate Types is enabled, revaluation uses the default rate type. That feature is OneWorld only, needs Multiple Currencies first and can't be turned off once enabled (Oracle: Currency Exchange Rate Types).
Daily rates can come from the Currency Exchange Rate Integration feature, which offers two providers, Xignite and HSBC. Updates run at about 6:00 a.m. in a time zone you choose. Manual entry and import remain available (Oracle: Currency Exchange Rate Integration).
If a rate is corrected after the run, rerun. The rerun adds a transaction for the difference and leaves the first one in place, so Walk 1 must include both.
Subsidiaries and accounting books
Revaluation is specific to one subsidiary and one book, so run it, and tie it, separately for each active book.
That includes secondary pending books. The subsidiary you pick determines which books are offered (Oracle: Revaluation in Multi-Book Accounting).
The Include Children box revalues several subsidiaries in one run. It also disables the class, department, location and segment filters and per-account selection, and Account Type becomes Account Category. That explains why the filters disappear when you tick it.
Match Source Classification applies to Open Receivables and Open Payables only. It creates one revaluation per classification combination. If a required classification is missing on any source transaction, the run ends with an error (Oracle: Revaluing Open Currency Balances).
How secondary books differ
The open transactions included are chosen by the primary book. Each book's entries are in that book's base currency, and realized gain/loss is calculated per book.
Oracle's example is a GBP 100 invoice paid in full. It yields GBP 0 in a GBP primary book, -USD 50 in a USD book and +EUR 10 in a EUR book.
The invoice's Related Records subtab shows realized gain/loss for the primary book only. For other books, use the currency revaluations list or the Realized Exchange Rate Gains and Losses report filtered to that book. Never compare a secondary book's revaluation total with the primary book's GL.
Reruns, reopened periods and limits
A rerun in the same period keeps the earlier Unrealized Gain/Loss transactions and adds new ones for the change.
Base Currency Adjustments behave differently: a rerun deletes and recreates them where needed. Submitting the same period, subsidiary, book and account combination while a run is still processing returns an error (Oracle: Currency Revaluation Transactions).
Permissions matter here:
| Task | Needs |
|---|---|
| Ordinary run | Currency Revaluation permission, Create level |
| Run that deletes earlier revaluation transactions | Currency Revaluation, Full level (or a Full-level user deletes them or reruns for you) |
| Run in a locked period | Override Period Restrictions |
| Run from the Period Close Checklist | Manage Accounting Periods as well |
The checklist task is called Revalue Open Foreign Currency Balances. Launched from there, the posting period is fixed.
If you reopen a period and post a change, rerun revaluation for that period and for every later period before closing again. Later runs depend on earlier ones (Oracle: Revaluation in Reopened Periods).
Oracle states a maximum of 2,000 lines per currency revaluation transaction, so check the line count of each run against it.
Intercompany FX after elimination
A foreign-exchange residual on intercompany accounts after consolidation can be correct, because NetSuite doesn't eliminate those revaluations.
Oracle says revaluations on transactions and accounts marked for elimination aren't eliminated and belong in the financial statements (Oracle: Foreign Currency Revaluation). Before chasing a residual, decide whether it is one of these.
VCG's diagnostic order is simple. If revenue ties exactly and only elimination-flagged accounts drift, the translation is right and the gap is elimination, not FX.
Don't fix that by excluding flagged accounts, since they carry real third-party activity too. Reproducing elimination outside NetSuite needs the counterparty subsidiary on each intercompany transaction. The counterparty subsidiary field is sometimes empty, so check it before promising a tie-out.
Extracts joined at the wrong level
The amount on a GL line is in the base currency of that line's own subsidiary. Join the translation rate on the line subsidiary, never the header subsidiary.
On an intercompany journal, a header-level join produces a quiet FX difference that looks exactly like a revaluation problem.
The close order matters too. Revalue, then calculate consolidated exchange rates, then eliminate. Oracle lets Eliminate Intercompany Transactions complete only after the revaluation and consolidation tasks. The full sequence is in our month-end close checklist.
Revaluation versus CTA
Revaluation remeasures balances into the subsidiary's functional currency and posts to the P&L, while translation produces CTA in equity.
CTA (cumulative translation adjustment) is computed from consolidated exchange rates rather than posted by a revaluation run. Revaluation changes the functional-currency balances that translation reads, so it can move the computed CTA indirectly. If the gap is in equity, start with the rate table, not the run.
Rate types by account
Each account's general rate type decides the translation: current rate for assets and liabilities, historical for equity, average for P&L. Translating each balance sheet line at its own period's rate is the classic reason a rebuilt consolidated balance sheet won't tie.
The fix is to sum current-rate balances in functional currency since inception and translate them once, at the as-of period's current rate. Per-line translation is right only for the P&L. Our article on NetSuite consolidated financial statements walks through the full consolidation.
CTA is a computed plug
CTA isn't posted by a closing entry. Per subsidiary, it equals the sum of functional balances times the as-of current rate, minus the sum of the translated amounts. Retained earnings and net income have no closing entry in a translated view either, so they are computed too.
Historical-rate equity is translated per posting and then frozen. A shortcut that multiplies a local equity balance by the reporting period's historical rate will not match NetSuite, because each posting keeps its own frozen rate.
Check the rate table first
Before blaming revaluation, confirm the consolidated rate table is complete for every period, subsidiary and book. A missing row doesn't raise an error. The amount simply translates to zero.
The table is periods times subsidiaries times books, so it grows quickly and can pass 5,000 rows. Read without pagination, it loses everything past 5,000 and produces bogus "missing FX rate" zeros. Average, current and historical rates are separate columns and can't be swapped.
You can calculate consolidated rates from the list with Calculate, or with the Calculate Consolidated Exchange Rates checklist task (Oracle: Consolidated Exchange Rates).
What auditors look for
Under IAS 21, monetary items are retranslated at the closing rate with differences to profit or loss, and non-monetary items at historical cost stay at the original rate (IFRS Foundation: IAS 21 staff paper on foreign currency accounting). ASC 830 takes the same position. Auditors may reasonably ask for Walk 1 and Walk 2, and for the reason behind any revalue box changed from its default.
Foreign Currency Variance Mapping
Foreign Currency Variance Mapping can send unrealized gains and losses to other accounts, and every destination then joins your reconciliation.
It is a separate feature under Setup > Company > Enable Features, Accounting subtab, Advanced Features. Rules can filter on variance type (Matching, Realized, Unrealized), gain or loss, subsidiary, intercompany receivable or payable, segment and source account type. Destination accounts must be Other Income or Other Expense (Oracle: Foreign Currency Variance Mapping).
With mapping on, the default Unrealized account holds only the variances no rule matched. Walk 1 has to add every destination account.
Mapping is worth it when auditors or management want gains shown apart from losses, or bank FX apart from AR and AP FX. If everyone reads one FX line on the P&L, it only adds accounts to reconcile.
Month-end FX tie-out checklist
Run the same list every month, in this order, and keep the exceptions log with the close file.
- Before the run. Rates loaded for the period. Revalue boxes reviewed against policy. Earlier periods final. Required classifications present if you use Match Source Classification.
- The run. One per subsidiary and per book. Both the AR/AP and Other Accounts transactions found. Line counts checked against the 2,000 cap.
- After the run. Walk 1 on the P&L account, Walk 2 on each balance sheet account, a separate walk per book. Then calculate consolidated rates and eliminate.
- Exceptions log. Manual FX journals, reruns, mapped variances and accounts excluded from revaluation, each with its reason.
When the walks still don't tie, the cause is usually structural. Account flags set against policy, a rate table that drops rows without warning, extracts joined at the wrong subsidiary level, or a deferred-account design that strands residuals all fall into that group. Those are build problems, and our OneWorld and multi-subsidiary service exists for them.
For one example, the Cyderes case study reports that deferred and recognised revenue now tie back to the general ledger each month, foreign-currency contracts included.
FAQ
Why doesn't Unrealized Gain/Loss equal the revaluation total?
Because each month's run is offset by the day-1 reversal of last month's. Compare the month's activity with this month's runs minus last month's reversal, plus any reruns, mapped variances and manual journals.
Can I turn off the automatic reversal?
No. NetSuite always creates a Reversal of Unrealized Gain/Loss on the first day of the next period. To change it, edit or delete the parent revaluation.
Should I delete a duplicate revaluation?
Usually not. A same-period rerun is incremental, so the second transaction holds only the change. Deleting either one breaks Walk 1.
Does revaluation affect CTA?
Not directly. Revaluation posts to the P&L, and CTA comes from translating with consolidated exchange rates. Revaluation does change the functional-currency balances that translation reads, so it can move the computed CTA.
Why does each book show a different realized gain?
Each book has its own base currency and rates, and realized gain/loss is calculated per book. The invoice's Related Records subtab shows only the primary book.
Book an assessment
If your FX accounts still won't tie after these walks, the account was probably built wrong, and VCG fixes that. Book an Assessment.



