Fix Consolidated Trial Balance CTA Mismatch in NetSuite
NetSuite's consolidated CTA is a plug figure, not a calculated balance, which is why your SuiteAnalytics SQL reproduction never ties to the native report.

On this page
You ran your consolidated trial balance in NetSuite, then pulled the same period through SuiteAnalytics Connect into your data warehouse. The numbers don't tie. The cumulative translation adjustment (CTA) line on your native report shows one figure, and your SQL reproduction shows another. You've checked the consolidated exchange rates, applied current, average, and historical rates to the right accounts, and it still won't balance.
This is one of the most frustrating reconciliation problems in NetSuite OneWorld. The good news: it is reproducible, and it is reconcilable. The bad news: it only works if you understand what the native report is actually doing, which is not what most people assume.
Why Your SQL Won't Tie to the Native Report
The core misunderstanding is that the CTA on NetSuite's native balance sheet is a plug figure, not a calculated balance. As the official documentation explains, NetSuite dynamically calculates CTA for each account and displays the total in the CTA account line so the balance sheet balances despite differing consolidated exchange rate types.
Here is the exact mechanics: three consolidated exchange rate types apply to different account types during consolidation.
| Account Type | Consolidated Rate Type |
|---|---|
| Most asset and liability accounts | Current rate |
| Income statement accounts | Average rate |
| Capital section (equity, dividends) | Historical rate |
NetSuite calculates CTA for each account using these rate types, then displays the total in the CTA account line. Your SQL has to replicate that exact per-account rate assignment and then compute CTA as the plug. If you simply pull the stored CTA account balance, you will never tie, because the stored balance is a residual.
Start With the Native CTA Balance Audit Report
Before you write a single query, open the report NetSuite provides for exactly this purpose. Go to Reports > Financial > CTA Balance Audit. You can also click the CTA amount on the Balance Sheet, Comparative Balance Sheet, or Trial Balance to open it directly.
This report shows the contribution of each individual account to the CTA during the selected period. The total of all accounts' contributions equals the net change in the CTA balance for the period. Critically, the report does not include manual entries to CTA accounts. That is the first place your reconciliation will break.
Two things to verify before trusting the output:
- Subsidiary context. The report includes rows for each subsidiary selected in the Subsidiary Any Of filter, defaulting to all subsidiaries. Confirm the correct set is selected.
- Manual CTA journal entries. If anyone has posted a manual entry directly to the CTA account, the audit report excludes it. That manual amount lands in the CTA balance but not in the account-by-account contribution. This is a common cause of the "ever-growing CTA with little explanation" pattern finance teams see.
Pull the Consolidated Exchange Rates Correctly
The consolidated exchange rate record lives at Lists > Accounting > Consolidated Exchange Rates. Each record carries three rate fields:
currentrate, Current Exchange Rateaveragerate, Average Exchange Ratehistoricalrate, Historical Exchange Rate
Plus the identifying context: accountingbook, fromsubsidiary, tosubsidiary, fromcurrency, tocurrency, and postingperiod.
The trap is that you must select the correct one of the three rates per account, based on the rate type set on the account record in the chart of accounts. If your account uses Historical, you apply historicalrate. If it uses Current, you apply currentrate. Averaging everything with averagerate will never tie.
The second trap is the period context. The CTA difference you are chasing is the gap between the consolidated exchange rate used in the month in question and the rate in the last month of your reporting window. If you run a window across multiple periods, you must pull the rate for each period, not one blended rate.
Multibook Makes It Worse
With multibook enabled, every amount field in transaction accounting lines is stored per accounting book. Your query must filter by the correct accountingbook on the consolidated exchange rate record and on the transaction lines. Pulling the primary book's rates against a secondary book's balances produces a mismatch that looks like a CTA error but is actually a book selection error.
The consolidated exchange rate record's accountingbook field is where this lives. If you omit it, SuiteAnalytics Connect may return rates for the primary book only, and your secondary book reproduction will be off by the full book difference.
A Working SuiteQL Pattern
The reconciliation approach that works is to reproduce the native calculation rather than read the stored CTA balance. The CTA Balance Audit report gives you the per-account contributions. Your query should mirror that structure.
SELECT
gl.acct AS account_id,
acct.fullname AS account_name,
gl.postingperiod AS period_id,
p.periodname AS period_name,
SUM(gl.amount_consolidated) AS consolidated_amount,
SUM(gl.amount) AS subsidiary_base_amount
FROM transactionaccountingline gl
INNER JOIN accountingperiod p ON p.id = gl.postingperiod
INNER JOIN account acct ON acct.id = gl.acct
WHERE gl.postingperiod = :reporting_period
AND gl.accountingbook = :accounting_book
AND gl.posting = 'T'
GROUP BY
gl.acct,
acct.fullname,
gl.postingperiod,
p.periodname
ORDER BY acct.fullnameThe field you need is amount_consolidated, which holds the amount in the currency of the lowest-level parent subsidiary you can access. The plain amount field stores the value in the base currency of the subsidiary assigned to the transaction. Using the wrong one is another reason your totals drift.
Note that amount_consolidated uses the rate in effect when you run the query, not the rate from the historical period. That is exactly the CTA difference you are chasing: the gap between the rate used back in the month in question and this month's rate. To reproduce the native report for a closed period, you must join to the consolidated exchange rate record using the period's postingperiod and the account's rate type, not rely on the run-time consolidation.
Where the Variance Gets Dumped
Even with the correct rates and books, one more failure mode remains. When other journal entries are not done correctly, the variance does not surface as a separate error. It gets absorbed into the CTA line so the balance sheet still balances. Your SQL then shows a CTA figure that differs from the native report, and you cannot find the source because the native report has already buried it.
This is why the CTA Balance Audit report is your first stop, not your last. Compare its per-account contributions against your SQL's per-account consolidated amounts. The account that diverges is where the bad journal entry lives. Fix that entry, and the CTA stops absorbing unexplained variance.
The Realistic Path to a Tie-Out
Reconciling a consolidated trial balance with CTA and multibook through SuiteAnalytics Connect alone is possible, but it requires reproducing NetSuite's exact rate selection logic per account and per period, joining on accountingbook, and treating CTA as the plug it is. Most teams that fail are doing one of three things: applying the wrong rate type to an account, ignoring the accounting book dimension, or trusting the stored CTA balance instead of the per-account contributions.
Start with the native CTA Balance Audit report to establish your ground truth. Then build the query to mirror its account-by-account structure. If the numbers still diverge, hunt for manual CTA entries and misposted journal entries before you question your SQL. The breadcrumbs are all there, but you have to follow them in the right order.


