Data Migration, Open Transactions, Inventory

How to import open inventory to NetSuite

Introduction:

Open inventory is one of the highest-risk components of your NetSuite cutover. This blog article discusses how to load your open inventory balance from a legacy system into NetSuite.

The transaction types used to import open inventory

There are two transaction types available for loading open inventory in NetSuite:

  1. Inventory Adjustment
  2. Adjust Inventory Worksheet

Per the NetSuite help documentation (link), these transactions impact inventory in different ways:

If you enter both forms with a quantity of +10 widgets:

  • The Inventory Adjustment form includes the previous stock total, so it adds 10 to the previous inventory count.
  • The Inventory Worksheet is exclusive of the previous stock level. It resets the inventory count to 10 as of the worksheet date, regardless of the previous count.

In theory, you can use either transaction type. However, I recommend using the inventory adjustment because:

  1. You cannot save the CSV import template for the inventory worksheet transaction. If you make a mistake on the import template, you’ll need to re-enter the template every time. This can be very time-consuming.
  2. The inventory worksheet does not work with serialized or lot-numbered items. If these are in-scope for your NetSuite implementation, this transaction type won’t work for those imports.

The inventory worksheet import is separate from the standard CSV import functionality. If you choose to use this transaction type, navigate to Transactions → Inventory → Adjust Inventory Worksheet → Import.

Prepare for loading the open inventory balance:

Here is what should be completed before you start:

  • Stop processing transactions in the legacy system. Operations need to stop so that inventory quantities and balances aren’t changing during this process.
  • Load historical trial balances through the go-live date via journal entries. Inventory will temporarily sit in the GL from the summary journal entry.
  • Create a suspense account called “OPENINV.” This expense account type is temporary and used strictly to control the cutover impact.
  • Tie out the GL to the detailed inventory subledger. Your legacy inventory asset balance should match your item detail. Any variance will impact the P&L. It's common to have an immaterial variance here, depending on the legacy system’s recordkeeping.
  • Perform a physical inventory count (if possible). Garbage in, garbage out. If quantities are wrong at go-live, your NetSuite data will be wrong immediately. If you can’t pull this off at the go-live date, plan to do a physical inventory shortly after your go-live to get accurate inventory balances in NetSuite.
  • Complete a sandbox practice run. This is non-negotiable for complex environments. Practice imports reduce operational disruption and expose mapping errors early.

Steps for loading the open inventory balance:

These are the steps for loading the open inventory balances using the inventory adjustment transaction type.

1. Export the item list from your legacy system

Export the item list from your legacy system (QuickBooks Desktop, Fishbowl, or another ERP).

At a minimum, you need:

  • Item identifier
  • Quantity on hand
  • Total inventory value
  • Location (if applicable)
  • Lot/serial detail (if applicable)

2. Prepare your open inventory support file

Prepare the open inventory support file using the legacy system’s inventory ledger.

The first thing I would do is check if my inventory ledger total amount matches the inventory balance on the trial balance. If it does, continue. If it doesn’t, stop and understand why.

In addition, you will need to map the legacy items to their corresponding NetSuite items. I prefer to import records using the internal ID. See my article on CSV import best practices for details.

3. Prepare the CSV import templates

At the header level, include:

  • Date → Set to the go-live date
  • Adjustment Account → OPENINV
  • Subsidiary
  • Any required header-level segments

At the line level, include:

  • Inventory item (internal ID preferred)
  • Location
  • Quantity on hand
  • Unit cost. If not available, calculate “Total Cost” / “Quantity”
  • Any required segments (subsidiary, department, class, etc.)

If using lot or serial items, include detailed lot/serial data. This must align with item configuration settings in NetSuite.

When preparing the CSV import templates, I’d keep the files around 1,000 lines to avoid performance issues with the import.

4. Import the CSV import templates

You can follow the standard instructions. Go to Setup → Import/Export → Import CSV Records, select the “Transactions” Import Type and “Inventory Adjustment” Record Type.

5. Reverse the GL impact of the summary journals

The final step is to reverse the GL impact of the summary journals. The inventory balance we just loaded should be the correct inventory balance, not the GL. Ideally, these numbers match, but often they don’t. So, it's important to refer to the summary TB amount, not the amount loaded on the inventory adjustment.

To post the entry, you’ll post this journal entry:

DR: OPENINV

CR: Inventory (amounts pulled from the summary trial balance)

You’ll want to allocate the amounts to any segments that were included on the summary journal entry and OPENINV suspense account. Inventory balances might have been spread across multiple GL accounts.

Common issues with loading open inventory

Opening Inventory Cost Is Not Optional

There are serious implications if you do not include the item cost on the initial upload. If you load inventory at $0:

  • Every fulfillment will post $0 COGS
  • Gross margin will be wrong
  • The average cost will distort
  • Inventory valuation becomes unreliable

Opening inventory must include:

  • Correct quantities
  • Correct extended value
  • Correct date

If this happened during your implementation, I would recommend adjusting the original inventory adjustment transaction with the correct costs. If the accounting periods are open, the NetSuite costing engine will rerun and correctly apply the cost of goods sold amount on the historical transactions.

Here is a Reddit post (link) where a user had this exact issue and how he fixed it. This is worth checking out if you are in this situation.

What if my GL and inventory subledger balances do not match?

It isn’t uncommon for the general ledger and inventory subledger balances to differ slightly. If this happens, you should still follow the steps in this article. The difference will be posted in the OPENINV suspense account. The reason I recommend setting this up as an Expense account type is that the balance will eventually roll into retained earnings. If you set this account to a balance sheet account type, that balance will need to be written off with another journal entry.

What if I have open bills (i.e., open accounts payable) with inventory items in my legacy system?

The open inventory should be a separate exercise from loading the open accounts payable (AP). If you use inventory items on those open bills, this will impact the open inventory balances, potentially double-counting inventory. You should always use a dummy expense or item for loading open AP. See my guide on loading open AP balances for details.

Conclusion

Inventory is not just another balance.

It drives margin, operational reporting, and audit confidence from day one.

When done correctly:

  • Your GL ties.
  • Your subledger ties.
  • Your operations team ships without disruption.
  • Your auditors stay calm.

When done poorly, inventory becomes a six-month cleanup project.

If you are planning a NetSuite go-live and want a controlled, auditable inventory cutover, feel free to reach out. I’m happy to help you think through the cleanest approach.

Big thanks to u/Nick_AxeusConsulting on Reddit, whose responses helped me prepare this article.

OptimalData contact us CTA

 

Subscribe for updates!