NetSuite, Implementation, Data Migration, QuickBooks
8 min Read
Historical Financials in NetSuite: Two Ways to Load Them
The best way to load historical financial statements during a NetSuite implementation is with a journal entry import. There are two methods to prepare these journal entries:
- The net change entry approach
- The point-in-time approach
OptimalData uses both approaches. Below, I break down both approaches, explain the pros and cons, and share when I recommend each.
TL;DR
- Load historical financials as journal entry imports, using one of two methods: the net change approach or the point-in-time approach.
- Use the net change approach for QuickBooks Online, QuickBooks Desktop, and Xero. They export transaction detail but not a segmented trial balance.
- Use the point-in-time approach for Great Plains, Oracle Fusion, and SAP, which carry all segment values in a single account string.
- Whichever method you pick, plan for how NetSuite automatically rolls prior-year net income into retained earnings.
For illustration purposes, let's assume that Company ABC is migrating data from QuickBooks to NetSuite. Their NetSuite implementation go-live date is 5/1/2022. The organization has QuickBooks data going back to 2019, but decided only to load historical monthly financials from 1/1/2021 through the NetSuite implementation go-live date.
How does NetSuite handle retained earnings when loading historical data?
NetSuite automatically "rolls forward" the prior fiscal-year net income into a system-generated retained earnings account. That differs from older legacy systems, and it means you don't need a manual year-end close entry.
It also means that when loading historical data, you must carefully consider how retained earnings are treated.
Retained-earnings roll-forward is critical when reversing journal entries across a fiscal year-end. NetSuite's journal entry reversal functionality posts the reversal amounts to the original account, regardless of whether it's a fiscal year-end. This occurs when loading historical financial statements: the legacy system report will reflect the adjusted retained earnings balance. This behavior applies to Approach 2 (the point-in-time approach) below.
Let's move on to the two approaches.
Approach 1: What is the net change entry method?
What is the net change entry approach?
The net change entry approach loads one journal entry per month, reflecting the net change in each account, built from your legacy system's transaction list. Here is how to build it:
- First, load a journal entry for the opening balance sheet as of the day before the first legacy month you want in NetSuite (for example, 12/31/2020 for a 1/1/2021 start). That entry consolidates all past activity (for example, 2019 to 2020) from our example above.
- Then, for each month, create a journal entry reflecting the net change in each account (using a SUMIFS or equivalent) based on your legacy system's transaction list. Include any segment dimension values (GL account, Department, Class, Location) by mapping from legacy to NetSuite segments.

Figure: an example net change entry upload, showing the monthly net change mapped by GL account and segment (department, class, location).
Why the net change approach works, and where it stutters
✅ Pros:
- You only post one journal entry per month, which means simpler ongoing maintenance.
- Because you imported the net change rather than a full trial balance each month, you avoid the manual work of reversing the P&L activity from retained earnings across fiscal-year ends.
- Segment mapping (department, class, location) from legacy systems to NetSuite is feasible because you're working with transaction-level data.
⚠️ Cons:
- If your legacy system (for example, QuickBooks Online) has a high transaction volume, exporting a complete list of transactions may exceed report limits. QuickBooks Online caps exports at around 30,000 lines, which can force manual consolidation of multiple exports.
- Requires intermediate Excel proficiency (especially using SUMIFS or pivot logic) and careful reconciliation.
Best when: Your legacy system exports full transaction detail (with segments) easily, you want to preserve segment-level integrity (department, class, and so on), or you want minimal manual intervention around retained earnings.
Approach 2: What is the point-in-time method?
What is the point-in-time approach?
The point-in-time approach loads each month's trial balance from your legacy system as a journal entry, then auto-reverses it the following month. Here is how to build it:
- Run a monthly trial balance report from your legacy system for each month you want to migrate. For each month, prepare a journal entry in NetSuite for that balance as of month-end.
- For each monthly entry, set a reversal date so NetSuite automatically reverses it at the start of the following month, except for your go-live starting balance.
- If your historical span crosses a fiscal year-end, you need to manually adjust for retained earnings by reversing P&L into retained earnings, since NetSuite doesn't replicate legacy close logic.

Figure: an example historical journal entry upload, showing a month-end trial balance with a reversal date set for the start of the following month.
Why and when the point-in-time approach works, and where it's tricky
✅ Pros:
- Simpler to execute if your legacy system supports a trial balance extract with segments already in place (for example, specific ERP systems that embed all segment data in one account string).
- Useful if you don't have or don't want to build a transaction-level export.
⚠️ Cons:
- Many legacy systems (QuickBooks Online, QuickBooks Desktop, Xero) do not support exporting a trial balance with segment details (department, class, location). That limits the ability to preserve segment granularity on the import.
- Must carefully reverse entries crossing fiscal-year ends. Otherwise, your retained earnings or P&L history in NetSuite will be misaligned.
Best when: Your legacy system can deliver monthly trial balance reports with full segment info, or when preserving segment detail is less important than getting accurate month-end balances. This approach works really well with Oracle Fusion, SAP, and Great Plains.
Other considerations, regardless of the approach
General tips
These are general tips to follow, regardless of the approach or the legacy system.
- Always include a fictitious AP Vendor and an AR Customer on all lines that impact any account configured as an "Accounts Payable" (AP) or "Accounts Receivable" (AR) account type. Otherwise, you will have a "No Vendor/Customer" line on the detailed subledger reports that cannot be removed.
- Each subsidiary needs a separate journal entry.
- Consider a two-batch loading strategy: a "dry-run" before go-live to validate your entries, followed by the actual load at go-live to reduce the risk of downtime and give stakeholders confidence.
- Bank balances in a different currency from the subsidiary's reporting currency will need to follow a two-step approach:
- First, duplicate the bank account in the reporting currency. I usually add " (import only - GBP)" to the account name, add a ".1" to the account number, and make the account a child of the post-go-live GL account.
- Next, map all the journal entry activity to the GL account created above.
- Then, at go-live, use a Bank Transfer transaction to move the balance from the import-only account to the live account. Validate that the import-only account is zero.
- Finally, deactivate the import-only account after the balance is zero.
The 13th period
A recent client migrating from Oracle Fusion was using a "13th period" for post-close adjustments. We were using the point-in-time approach for loading historical financial statements. Here is how we handled the 13th period:
- Create the appropriate 13th periods for each fiscal year.
- For the 12th period (December), manually create the reversing journal entry. When creating the reversing entry, set the posting period to be the 13th period.
- For the 13th period (December), also manually create the reversing journal entry. When entering this reversing entry, set the posting period to be the 1st period of the next fiscal year.
Intercompany balances
These are tips for working with multiple subsidiaries.
- When a client has intercompany AR and AP accounts:
- Create "import only" intercompany AR and AP account types. Map all the historical activity to these GL accounts.
- As of the go-live date, use an advanced intercompany journal entry to transfer the balances out of the "import only" accounts and into the live accounts, with the appropriate intercompany settings checked on the journal entry line.
- If you have multiple subsidiaries with different reporting currencies:
- Import the consolidated exchange rates that the client used for their historical reporting.
- Load the journal entries in the reporting currency of the subsidiary.
- Consider historical equity balances.
Intercompany balances, especially when multiple reporting currencies are involved, are complex.
Which approach should you use?
Match the method to your legacy system. If your legacy system is QuickBooks Online, QuickBooks Desktop, or Xero, I recommend the net change approach because those systems export transaction detail but not a segmented trial balance. I recommend the point-in-time approach if your legacy system is Great Plains, Oracle Fusion, SAP, or any other system that uses a single string to represent all segment values.
Whichever method you choose, the retained-earnings roll-forward is the detail that most often trips teams up, so plan for it before you start loading.
You might also be interested in my other posts on loading open financials, open AR, and open AP transactions.
Frequently asked questions
How do you load historical financial statements into NetSuite?
Load historical financial statements as journal entry imports. There are two methods to prepare the entries: the net change entry approach, which posts one journal entry per month for the net change in each account, and the point-in-time approach, which posts a monthly trial balance and auto-reverses it the following month.
What is the difference between the net change and point-in-time approaches?
The net change approach imports the monthly net change per account from transaction-level detail, preserving segment data (department, class, location) and avoiding manual retained-earnings reversals. The point-in-time approach imports each month's full trial balance and auto-reverses it, which is simpler when your legacy system can export a segmented trial balance but harder when it cannot.
How does NetSuite handle retained earnings when loading historical data?
NetSuite automatically rolls prior fiscal-year net income into a system-generated retained earnings account, so no manual year-end close entry is needed. When you load historical data that crosses a fiscal year-end, this behavior means you must manually adjust retained earnings under the point-in-time approach because NetSuite reversals post back to the original account.
Which approach is best for migrating from QuickBooks to NetSuite?
For QuickBooks Online, QuickBooks Desktop, or Xero, use the net change entry approach because those systems export transaction detail but do not export a trial balance with department, class, and location segments. Use the point-in-time approach for systems such as Great Plains, Oracle Fusion, and SAP that store segment data in a single account string.
Please get in touch with me if you are overwhelmed by the data migration requirements or would like to discuss loading your full transactional history. OptimalData Consulting has helped over 100+ clients migrate their data into NetSuite.
Paul Giese
Paul Giese is the founder of OptimalData Consulting, a firm specializing in NetSuite data migration for companies moving off QuickBooks, Sage, Great Plains, Xero, and other legacy systems. He has over a hundred migrations focused on preserving detailed transaction-level history for audit readiness, financial reporting, and post-acquisition continuity.
LinkedIn