Data Migration, QuickBooks, Non-Profit
11 min Read
How a Nonprofit Migrated 15,671 QuickBooks Transactions into NetSuite
A Vermont nonprofit went live on NetSuite with 15,671 transactions of detailed QuickBooks Online history loaded, every line tagged to the grant that funded it. Their CFO could run grant income and spend by year inside NetSuite on day one, with no need to keep QuickBooks open on a second monitor. Signature to go-live was about twelve weeks. This is how the project ran, including the mistake we made on grant years and why it cost a batch update instead of a re-migration.
TL;DR
- A Vermont nonprofit moved 15,671 QuickBooks Online transactions into NetSuite in 12 weeks, with every line item tagged to the grant that funded it.
- The real comparison is paying once for the detail versus running two systems for years, which is what a mid-grant-cycle transition forces if the history stays behind.
- Expect about one business day of downtime. This nonprofit was out of their accounting system for a single day, which made reconciling bank accounts possible.
- Store the legacy account, class, and grant name on every historical line. That is what makes a mapping mistake a batch update instead of a re-migration.
Why load detailed history at all?
Because the alternative is running two systems.
That was the client's own framing on our first call. Their director of finance framed the decision as a cost-benefit analysis: pay once to bring the details into NetSuite, or keep going back into QuickBooks for the next few years whenever something comes up.
The specific pressure was timing. They were transitioning mid-grant cycle, with both single-year and multi-year awards still open. One award had started in 2023 and was still live at go-live. If a funder came back and asked to see full details on that award, the finance team would need to produce them, and reconstructing it across two systems is not an answer anyone wants to give a grantor.
They were already carrying the cost of the gap in another form. Management reporting by program was being done in manual spreadsheets, because the system could not produce it. That is what a history gap looks like in practice: not a missing report, but a person maintaining a workbook.
What data should stay out of NetSuite?
Anything that already has a better system of record. Scope discipline is the part of a migration that saves the most money, and this nonprofit got it right.
They run robust donor software that holds all donor-level detail. Donations reach the general ledger as a monthly journal entry, not as thousands of individual receipts. So the donor details stayed where they live, and NetSuite received the accounting record.
You can see that decision in the transaction mix. Bills and bill payments account for more than 9,000 of the 15,671 records. Together, invoices and customer payments account for fewer than 600. The vendor side carried the detail because that is where the grant spend lives and where 1099 reporting depends on it. The revenue side did not need to.
The question to ask before scoping is not "how much history do we want." It is "which subledger actually has to be queryable in the new system, and which one already has a better home."
If you are earlier in your planning, my guide to the 13 data migration questions to ask when implementing NetSuite covers the scoping conversation in full.
What does a nonprofit NetSuite migration actually include?
The client is a single-entity nonprofit with a 12/31 fiscal year end, moving from QuickBooks Online to NetSuite. They were referred to us by their accounting and advisory firm, with a national firm handling the NetSuite implementation. The mechanics below follow OptimalData's general QuickBooks-to-NetSuite migration approach, with grant tracking as the variable that shaped every decision.
The project was signed in early April 2026, and the client went live the last week of June 2026. Roughly twelve weeks, most of which was mapping rather than loading.
We migrated 15,671 transactions dated back to 10/1/2022:
| Transaction type | Count |
|---|---|
| Journal entries | 5,872 |
| Vendor bills | 4,622 |
| Bill payments | 4,577 |
| Invoices | 314 |
| Customer payments | 276 |
| Bill credits | 7 |
| Checks | 2 |
| Credit memos | 1 |
| Total | 15,671 |
The fixed fee for the project was $10,000 with a small non-profit discount.
How does a QuickBooks structure map to NetSuite segments?
The mapping itself was straightforward to describe and slow to agree on, which is the normal ratio.
| NetSuite segment | QuickBooks source |
|---|---|
| Grant | Class |
| GL Account | GL account name |
| Item | GL account name and item |
| Name | Name |
The important one is the first row. This organization tracked grants as QuickBooks classes, which works until you need real grant reporting across award periods. In NetSuite, grants became a proper segment on every line, which is what turns the history into something the finance team can report on rather than something they have to reconstruct.
How do you load history into a chart of accounts that no longer has a place for it?
You create the missing records, load the history against them, then deactivate them once the data is in.
This client used the migration to clean up their chart of accounts, going from 229 GL accounts in QuickBooks Online to 153 in NetSuite. That consolidation was theirs to drive because only the client knew which accounts were duplicates and which mattered.
The consequence is that the new build contains only what the organization needs going forward. It did not include the roughly ninety grants that were closed in QuickBooks but still carried historical activity, or the GL accounts that existed only to receive history. Those records still have to exist for the transactions to land somewhere.
So we created them, loaded against them, and deactivated them after go-live. NetSuite keeps inactive records fully available to reporting while removing them from entry forms, which is exactly the behavior this calls for. The history stays reportable, and the team's dropdown lists stay clean.
This step is easy to overlook during a build because, from a configuration standpoint, those records are dead. From a migration standpoint, they are load-bearing, and discovering that late is one of the more common reasons a detailed load stalls in the final weeks.
What happens when a grant gets mapped to the wrong year?
We got some of them wrong on this project. Here is what happened and why it cost a batch update instead of a re-migration.
On the very first scoping call, before any paperwork was signed, I told this client that I store the legacy QuickBooks account and class on the line level of every transaction I load, specifically so that a mapping mistake is recoverable. I also told them that roughly two-thirds of my clients end up changing something after the fact. That is not a disclaimer. It is the reason a client can commit to a chart of accounts redesign without betting the migration on getting every decision right the first time.
This nonprofit migration tested that promise.
Grant years do not line up with fiscal years. An award labeled 23/24 spans two of this client's 12/31 fiscal years, and the next award picks up mid-year. For a subset of grants, the map file shifted the award by one year, so activity that belonged to the 24/25 grant was assigned to the 25/26 grant.
The client's team caught it. Their finance staff ran the grant income and expense report in NetSuite side by side with the equivalent QuickBooks report, one grant and one fiscal year at a time. The pattern was unmistakable once they saw it: NetSuite kept tying to the prior year's grant in QuickBooks.
Correcting it was a reallocation of the affected transactions, processed as a single update import. Because the QuickBooks grant name was present on every line, identifying every affected transaction was done via a saved search rather than a forensic exercise. The client re-ran the grant P&L afterward and confirmed it was accurate.
The rest of their variance list cleared quickly. Confirming that test transactions posted during training have been deleted is a standard step in our tie-out process, and those, along with one invoice entered in QuickBooks after the agreed cutoff, accounted for the remaining differences.
A mapping file that lives only in Excel is a record of what you intended. Legacy coding stored on the transaction is a record of what actually happened, and it is what makes a correction cheap.
How much downtime should you expect during a detailed migration?
One business day.
This nonprofit was out of their accounting system for a single business day while the data moved. They stopped working in QuickBooks at the end of the day Thursday, uploaded Friday, and they started working in NetSuite the next Monday.
That is possible because a detailed migration reproduces the legacy system rather than summarizing it. Once every transaction exists in NetSuite exactly as it did in QuickBooks, the new system has the same level of maneuverability as the old one. You can still book adjusting entries to a prior month. You can still receive invoices for two weeks after cutover because nobody actually closes the books on the day they go live.
What earns that short window is preparation, and the one piece the client owns is cash. This nonprofit reconciled every bank account through the last full month before go-live, and they had a lot of accounts. That matters because reconciliation is the one thing a migration cannot fix on its own. NetSuite needs a known cleared position to reconcile forward from, and loading open bank transactions correctly depends on knowing exactly which legacy transactions were still uncleared at cutover. If the legacy reconciliations are not up to date, the first live reconciliation in NetSuite has nothing to start with.
I learned that the hard way on an earlier project. The client had not cleared cash in nearly two years. We migrated every transaction faithfully, which meant we migrated the mess faithfully too. Detailed history is a mirror. It will reflect whatever discipline exists in the legacy system, and it cannot improve on it.
What the implementation partner saw
The partner's senior delivery manager sent this after go-live:
The data migration was one of the easiest and cleanest processes I've seen. As you know, data migration is often one of the most complex parts of an implementation, and because of that, we typically steer clients away from loading a lot of detail. I was really impressed with how smoothly this project went. It definitely helped keep our team focused on process configuration while still getting the data loaded in a timely manner.
That last sentence is the part worth sitting with. Most implementation teams steer clients away from detailed loads because the risk lands on their timeline. When the data work runs in parallel and off the critical path, the client gets their history, and the partner keeps their people on configuration.
What audit documentation should you get after a migration?
Every OptimalData project closes with an audit documentation package. For this nonprofit migration, that included:
- A data migration memo documenting scope, method, and mapping assumptions
- Trial balance tie-outs between QuickBooks and NetSuite, built as a detailed trial balance with segment values.
- Summary accounts payable and accounts receivable tie-outs
- Detailed accounts payable and accounts receivable tie-outs as of the go-live date
For a grant-funded organization, this package is not a formality. It is the document the finance team hands an auditor who asks how the opening balances in NetSuite relate to the closing balances in QuickBooks.
Frequently asked questions
How far back should a nonprofit load detailed transaction history?
Far enough to cover the award periods of your active multi-year grants. If your longest open award started in 2022, history beginning in 2024 will not support the reporting you owe for that grant.
Can historical data be loaded after we are already live on NetSuite?
Yes. Loading details after go-live is more involved than doing it during implementation because summary entries usually have to be removed first, but it is a normal project rather than a rescue mission.
Does loading detailed history put the go-live date at risk?
It does not have to. The migration work runs in parallel with configuration, and the load itself happens in a defined cutover window. On this project, the detailed load stayed off the implementation team's critical path.
What does the client's team have to do?
The mapping decisions. We build and maintain the map file and handle the extraction, transformation, and load. The client decides which legacy accounts and grants map where, because that judgment belongs with the people who own the numbers.
The takeaway
Two nonprofits can go live on NetSuite the same week and end up with very different systems.
The first loads summary trial balances. The general ledger is correct, and the audit is satisfied, but reporting stops at the account level. Every question about a specific award means opening QuickBooks, pulling the detail, and rebuilding the answer in a spreadsheet. That repeats every time a funder asks, every time the board wants program-level numbers, for as long as the awards stay open.
The second loads the transactions with the grant on every line. The same question is a saved search, answered in NetSuite, by whoever needs it.
That is the real decision in front of a grant-funded organization, and it gets made during the implementation whether or not anyone names it as a choice.
This client made that decision before signing anything, and the project was scoped around it rather than around a data volume. That is the part worth copying.
If your organization or your client is heading into a NetSuite go-live with multi-year grants still open, let's talk through what a detailed load would involve.
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