Migrate from NetSuite to ERPNext: what the move involves and who does it
If a NetSuite renewal, a licensing change, a residency requirement or lock-in pressure has brought you here, plan the move as a data, configuration and customization rebuild, not a software swap. It usually needs an implementer who has done ERP cutovers, plus named finance and operations owners inside your organization who can sign off balances, master data and process changes. ERPNext is licensed under GPL-3.0 and built on the Frappe Framework, which is MIT-licensed, so the license itself adds no fee to the move. The effort comes from what you have built in NetSuite over the years: custom records, saved searches, workflows, SuiteScript logic, integrations and the volume of history you intend to carry forward. You can host ERPNext in three ways: on Frappe Cloud, with Docker Compose using the production images in the frappe_docker repository, or manually with the bench command line tool. Your choice should follow your hosting and residency requirements, and it affects who runs backups, upgrades and the Redis, MariaDB and worker services. Check the supported version list before you pick a release line, since Frappe's support calendar determines how long you can stay on a given major version. Ask your implementer to inventory every SuiteScript script, custom field, workflow and scheduled job, then classify each as a configuration setting, a rebuild, or something you retire. That inventory, not the license, sets the scope and the quote. Before you commit, confirm three things in writing. First, which NetSuite customizations are business-critical and which are dormant, because dormant logic is the cheapest to drop. Second, who owns each decision on the ERPNext side, including chart of accounts design, tax setup and period close. Third, who will maintain the system after go-live, whether an internal team, your implementer under a retainer, or a Frappe Cloud support plan. Those answers determine the cost components you will carry each year, so ask every bidder to price them separately.
Which NetSuite capabilities map cleanly to ERPNext and which need rework
This table maps the NetSuite objects and customizations most often in scope for a move to ERPNext against their closest ERPNext equivalents, labeled clean, needs rework or gap. Read each row as a planning label, not a guarantee: confirm every mapping against the ERPNext version, apps and configuration you plan to run before you commit to a scope.
| NetSuite capability | ERPNext equivalent | Migration label | What to confirm |
|---|---|---|---|
| Chart of accounts and account types | Chart of Accounts per company with account types and root types | Clean | Confirm your account hierarchy, account types and any NetSuite-only account flags survive the Data Import templates |
| Customers and vendors | Customer and Supplier doctypes with addresses and contacts | Clean | Map internal IDs to a stable external reference so transactions can be re-linked after import |
| Items and inventory items | Item doctype with variants, units of measure and stock settings | Needs rework | Matrix items, serialized and lot tracking, and item pricing rules often need a second pass after the first load |
| Open transactions (invoices, bills, orders) | Sales Invoice, Purchase Invoice, Sales Order and Purchase Order | Needs rework | Decide whether to load open items only or full history, and confirm child table rows import cleanly |
| Historical transaction detail | Imported documents or archived exports outside ERPNext | Needs rework | Full history is rarely worth loading in bulk; confirm your retention and audit needs before choosing |
| Saved searches and reports | Script Reports, Query Reports and standard report views | Needs rework | Each saved search must be rebuilt; confirm each report's filters and totals against NetSuite output |
| Roles and permissions | Roles, User Permissions and Permission Manager | Needs rework | NetSuite role sets rarely map one to one; design roles from job functions and test with sample users |
| SuiteScript customizations | Server Scripts (disabled by default from version 15) or a custom Frappe app | Gap | Server Scripts must be enabled and are not allowed on Frappe Cloud public shared benches; most logic needs a custom app |
| SuiteFlow workflows | Workflow doctype | Needs rework | Simple approvals usually map; multi-step logic with custom scripts requires rebuilding |
| Subsidiaries and OneWorld | Multiple companies within one ERPNext instance | Needs rework | Confirm intercompany transactions and consolidated reporting meet your needs before design |
| Multi-currency | Multi-currency accounts, exchange rates and revaluation | Needs rework | Confirm revaluation and realized gain or loss treatment with your accountant against your jurisdiction |
Which NetSuite exports to use and which integrations to rebuild
Before any data moves, you need to know what NetSuite will let you export and which connections depend on it. The cards below cover the export options, the integrations that must be rebuilt, and the ERPNext access controls that replace NetSuite's login model.
Full CSV Export scope
Full CSV Export is limited to users with the Administrator role and covers lists such as customers, vendors, items, employees and a transaction detail report. Oracle states it does not currently export all data as CSV files, so treat the export as a starting set rather than a complete copy. Run it with an Administrator account, record who ran it and when, and compare row counts against the live lists before you accept the files.
Saved search and report gap fills
Where Full CSV Export does not cover an object, NetSuite documents exporting saved search results and reports as CSV files. Build saved searches that include internal IDs, parent references and open balances, since those fields carry the relationships you must rebuild in ERPNext. Confirm with your NetSuite administrator which fields each search returns, because a search that hides a column will hide it from the migration too.
Rebuilding SuiteTalk integrations
Any system that calls NetSuite through SuiteTalk SOAP or REST web services will stop working at cutover. Inventory every integration by its endpoint, record type and direction, then decide which ones ERPNext must replace through its REST API and which ones retire. Test each replacement against a copy of the target site, using sample payloads taken from production logs.
Third-party connectors and scheduled jobs
Third-party connectors, middleware flows and scheduled NetSuite saved searches often run outside NetSuite's own code and are easy to miss. List each connector with its owner, credentials, schedule and the fields it reads or writes. Decide whether ERPNext's integration features or an external workflow tool will take over the job, and assign a named owner for each one before cutover.
SuiteScript logic and server scripts
SuiteScript customizations that run on record events must be reviewed one by one, not copied across. In ERPNext, Frappe Server Scripts run Python on document events or as API endpoints, but from version 15 they are disabled by default and must be enabled with the server_script_enabled setting. Frappe Cloud public shared benches do not allow them, so confirm your hosting model before you rebuild any logic.
LDAP and social login for ERPNext
NetSuite users sign in through NetSuite's own credentials, so ERPNext needs a deliberate access model. ERPNext supports LDAP integration and Frappe supports social login keys, which you can configure against your existing directory or identity provider. Confirm which login path each user group needs, test role mapping with a pilot group, and keep a local administrator account for recovery.
Migration sequence from inventory to decommission
This sequence moves NetSuite data, logic and reporting into a self-hosted ERPNext site in controlled stages, so each stage has a documented output before the next begins. It ends with NetSuite read-only and retired, with an archive kept for audit and reference.
Inventory customizations, saved searches and integrations
Your team, with the NetSuite administrator and the finance and operations leads, lists every SuiteScript, workflow, custom record, custom field, saved search, report, SuiteTalk integration and scheduled job in use. Each item is tagged with its owner, its business purpose and whether it is still used. The output is a signed-off inventory that separates logic to rebuild from logic to retire. Confirm which items depend on NetSuite-only features, since these usually need a design decision before any data moves.
Build the mapping workbook with internal IDs
Create one workbook that maps each NetSuite object to its ERPNext target: chart of accounts, customers, vendors, items, price lists, tax templates and transaction types. Keep the NetSuite internal ID as a column in every master-data sheet, because it is the only reliable key when you later rebuild links between customers, invoices and payments. Note which Data Import template each sheet feeds and which fields have no equivalent. The output is a reviewed workbook that finance and operations both approve.
Pilot one company or subsidiary on a test site
Install a test ERPNext site, using Docker Compose from the frappe_docker repository or the bench command line tool, and load one company or subsidiary with its masters and a sample of transactions. Run the Data Import templates, then check accounts, balances, tax and currency settings against NetSuite reports for the same period. The frappe_docker single-file demo is intended for short-lived evaluation only, so the pilot should run on a production-style setup. The output is a pilot defect list with each issue assigned and closed or accepted.
Import masters in batches, in dependency order
Load data in this order: chart of accounts, customers and vendors, then items, and finally open transactions. Each file should hold a few thousand records at most, because the ERPNext documentation advises importing only a few thousand records at a time. Keep the NetSuite internal ID in a custom field so re-imports can update existing records instead of duplicating them. The output for each batch is a row-count and error log, reconciled against the source export before the next batch starts.
Rebuild server scripts and apps
Rewrite each retained SuiteScript as a Frappe server script or, where the logic is larger, as a Frappe app with its own code, tests and version control. Note that from version 15 onward server scripts are disabled by default and must be enabled with the server_script_enabled setting, and Frappe Cloud public shared benches do not allow them, so confirm your hosting choice first. Test each rebuilt rule against the pilot data. The output is a tested rule register that lists each NetSuite script and its ERPNext equivalent or its retirement decision.
Run in parallel and reconcile
Keep NetSuite live for the agreed reconciliation window while ERPNext processes the same transactions for the test company. Compare trial balances, open receivables and payables, inventory valuation and key sales and purchase reports between the two systems each cycle. Record every variance with its cause and fix. The output is a signed reconciliation pack that finance approves, showing that balances agree or that every difference is explained.
Cut over at a period close
Plan the cutover at a period close so that opening balances in ERPNext match the closed NetSuite trial balance. Enter opening balances with a dated journal entry, load open transactions with their internal ID references, freeze NetSuite for new entries, and run a final delta import for anything posted after the last extract. Ask your auditors how they want the cutover evidenced before you start. The output is a cutover record with balance tie-outs and the date NetSuite was frozen.
Archive data and decommission NetSuite
After the cutover, export the final NetSuite data sets in the formats the documentation supports, including Full CSV Export for lists and saved search or report CSVs for the rest, and store them in a controlled archive. Confirm with Oracle and your contract administrator the terms that govern access to historical data and the exit steps for the subscription. Then remove integrations, revoke user access and close the account. The output is a decommission checklist, a sealed archive index and written confirmation that the subscription has ended.
What drives migration cost and duration
This table lists the migration drivers that move cost and effort when leaving NetSuite for ERPNext, why each one matters and what to do about it. Read it as a checklist to size your own scope before asking for a fixed-scope quote, since the same driver can cost very little in one company and a great deal in another.
| Driver | Why it changes cost or effort | How to keep it down |
|---|---|---|
| Customization count | Each SuiteScript user event, scheduled script, workflow, custom record and saved search must be rebuilt as a Frappe server script, custom app or standard configuration. Server scripts are disabled by default from version 15 and must be enabled, and Frappe Cloud public shared benches do not allow them, so some logic needs a custom app. | Inventory every script and workflow, then sort them into standard ERPNext configuration, a server script, or a custom app. Retire logic nobody uses before migration starts. |
| Subsidiaries and currencies | Each legal entity needs its own company setup, chart of accounts, tax rules, bank accounts and intercompany treatment. Each currency adds exchange rate history, revaluation rules and reporting checks that must reconcile to the NetSuite figures. | Confirm the entity list and the reporting currency with finance early. Migrate one entity or period at a time when the business allows it, and document intercompany pairs before loading balances. |
| Transaction history depth | Years of invoices, payments, journal entries and inventory movements mean more records to load in batches and more linked documents to verify. Importing a few thousand records at a time, as the Data Import documentation advises, multiplies batch count with volume. | Decide how far back transactions must be live in ERPNext versus kept as read-only archive exports. Opening balances for closed periods usually need far fewer records than full history. |
| Integration count | Payment gateways, banks, ecommerce, shipping, tax engines and BI tools connected to NetSuite through SuiteTalk, SuiteAnalytics Connect or bundles each need a new connector, credential handling and a test cycle on the ERPNext side. | List every connected system with its owner and data direction. Retire unused connections and prioritize those that must work on cutover day. Use the ERPNext API for new connectors. |
| Data quality | Duplicate customers, inactive items, unused vendors and inconsistent units of measure slow every import and cause rejected rows. Records without stable identifiers are harder to relate to transactions after export. | Clean masters in NetSuite before export. Keep internal IDs in the export so child rows and transactions can be related reliably, and agree on naming rules for items and customers before mapping. |
| Hosting choice | Self-hosting with Docker or bench means your team or implementer pays for servers, backups, Redis and MariaDB or PostgreSQL operations, upgrades and monitoring. Frappe Cloud shifts part of this to a subscription. Support coverage differs: warranty from Frappe requires a listed version and a matching Frappe Cloud support plan. | Ask for a written split of hosting, backup, upgrade and support responsibilities. Choose the version line you will run and confirm its support end date with the Frappe supported versions page before scoping. |
| Reconciliation scope | Each opening balance, open AR and AP item, inventory valuation, bank balance and tax position must match NetSuite at the cutover point. Reconciliation work usually grows with the number of accounts, currencies and periods being carried over. | Agree the cutover date and the reconciliation report set in advance. Run at least one trial load and compare trial balances, aging and stock values before the production load. |
Replacing SuiteScript with Frappe server scripts or apps
SuiteScript logic has to be rewritten for ERPNext, not translated line by line. Frappe Server Scripts run Python on document events, such as validate or on_submit, or expose an API endpoint, so a SuiteScript user event or RESTlet maps to a Server Script only when it is a short, document-level rule. Before writing anything, export your SuiteScript inventory and classify each script by trigger, the records it touches and whether it calls external systems. Pricing rules, approval routing and field defaults are usually simple Server Scripts. Scripts that call a third-party API, run scheduled batch jobs or change many doctypes at once belong in a custom Frappe app.
Server Scripts are disabled by default from version 15 onward. You must enable them through the server_script_enabled setting in the site configuration, and a system administrator must have the rights to create them. On Frappe Cloud, public shared benches do not allow Server Scripts at all, so any plan that depends on them needs a dedicated bench or a self-hosted deployment, which fits the self-hosting model of this migration. Confirm the exact setting name and enabling steps for the ERPNext version you select in the Frappe documentation, and test on the same version you will run in production.
Plan the custom app as a separate workstream with its own code review, version control and test environment. A Frappe app is Python code packaged with its own doctypes, hooks and fixtures, which makes it easier to upgrade than a pile of Server Scripts pasted into the UI. Ask your implementation partner to document each rebuilt rule with its NetSuite source, the ERPNext equivalent and the test cases used to confirm the result, including the numbers that must match at period close. Assign an owner for every rebuilt script, because the supplied ERPNext release cadence means you will be upgrading regularly.
What usually goes wrong in NetSuite to ERPNext migrations
Most failed NetSuite to ERPNext moves break in the same few places: records lose their links, balances stop tying out, and imports land in the wrong order. The cards below cover each failure point and the prevention step that addresses it, so the problems are caught in rehearsal rather than after go-live.
Broken internal ID links
NetSuite internal IDs tie customers to invoices, items to purchase orders and subsidiaries to journal entries. Full CSV Export gives you the lists, but relationships only survive if you export the internal IDs alongside each record and keep a mapping table from NetSuite IDs to ERPNext document names. Without that table, child rows and linked documents import as orphans. Prevention: export internal IDs with every list, build the mapping before the first import, and test one customer with its full transaction history end to end.
Opening balances that do not reconcile
Opening balances are where most finance teams lose days. Receivables, payables, bank balances and inventory valuation can each drift when open items are rebuilt from partial exports, or when subsidiary currencies are converted at a different rate than NetSuite used. Reconciliation must tie to the NetSuite trial balance at a fixed cut-off date. Prevention: agree the cut-off and the conversion rules in writing, then reconcile every account group against the NetSuite trial balance before the books are opened for users.
Imports run out of dependency order
ERPNext validates links at import time, so a sales invoice that references a customer or item not yet loaded will fail or land incomplete. The order matters: company and chart of accounts first, then items, customers, suppliers and price lists, then open transactions. The Data Import documentation advises loading only a few thousand records per batch, which makes batch sequencing a planning task. Prevention: write the load order as a runbook, load each batch into a staging site, and keep a log of failed rows for correction before retry.
Undocumented SuiteScript behavior
Many NetSuite behaviors live in SuiteScript user events, workflows and custom records that nobody wrote down. Those rules, such as automatic tax codes, approval thresholds or numbering sequences, often disappear silently in migration. In ERPNext they must be rebuilt as Frappe server scripts or custom apps. Server Scripts are disabled by default from version 15 and must be enabled with the server_script_enabled setting, and Frappe Cloud public shared benches do not allow them. Prevention: inventory every script and workflow in the NetSuite account, confirm the hosting plan allows server scripts, and sign off each rebuilt rule with the business owner.
Unsupported versions and support gaps
Frappe's support policy covers only listed versions, and warranty coverage from Frappe requires a matching Frappe Cloud support plan. Teams that pick an older branch because a test site worked, or that plan to self-host without a support contract, can end up on a release that no longer receives fixes. Confirm the target version's end-of-life date before the build starts, and set the upgrade path as part of the project. Prevention: choose a supported version, check the support-versions page for its end date, and decide in writing who provides patches and upgrades after go-live.
Users not trained on the new workflow
NetSuite users carry habits from saved searches, dashboards and approval routing that do not map one to one onto ERPNext screens. Finance staff may close periods differently, and sales teams may not find where pricing rules or credit limits now live. Untrained users then create duplicate records or bypass controls, which corrupts the data the migration just cleaned. Prevention: build role-based training around the actual transactions each team runs, use a rehearsal site with real migrated data, and confirm sign-off on the first live month-end before NetSuite access is removed.
How the migration changes by company size and starting point
A single legal entity with one chart of accounts, one currency and a standard set of modules usually has the shortest path. The main work is clean master data: deduplicating customers, consolidating items and confirming that the chart of accounts maps one to one onto ERPNext accounts. Because there is one set of books, opening balances can be loaded once at a clean period boundary.
- Master data cleanup: Merge duplicate customers and items in NetSuite before export, since the Data Import tool works best with a clean source file.
- One opening balance load: Plan a single cutover period and load receivables, payables, stock and bank balances as of that date.
- Standard modules: Accounting, selling, buying and stock usually map directly, with fewer custom fields to rebuild.
- Smaller user base: User accounts, roles and permissions are fewer, so access setup and testing take less time.
- Parallel run scope: A short reconciliation run against NetSuite reports is usually enough to confirm balances.
Confirm with your own NetSuite administrator how many saved searches, custom records and scripts are actually in use, because a single entity can still hide years of accumulated customization.
A group with several subsidiaries, intercompany transactions and consolidated reporting has to decide how entities, companies and currencies are represented in ERPNext before importing anything. Each company in ERPNext holds its own chart of accounts, so intercompany accounts, currency settings and consolidation logic need explicit design. Cutover is often staggered by entity or by period close, which changes how balances are split.
- Company structure first: Decide how each subsidiary, cost center and intercompany pair is modeled, since this drives every later import file.
- Intercompany balances: Reconcile intercompany receivables and payables at the cutover date so that both sides agree.
- Multi-currency opening balances: Confirm the exchange rates and revaluation approach used for each currency before loading balances.
- Staggered cutover: Moving one entity at a time requires a bridge for shared customers, vendors and items.
- Consolidation reports: Rebuild the group reports that management and auditors rely on and test them against NetSuite output.
Ask your implementation partner how they will handle shared master data across companies, and confirm which group reports must be reproduced exactly before the first cutover.
An account with years of SuiteScript, custom records, workflows and integrations has the largest rebuild effort. Server-side logic does not transfer directly. In ERPNext, Server Scripts run Python on document events or as API endpoints, but from version 15 they are disabled by default and must be enabled with the server_script_enabled setting. Frappe Cloud public shared benches do not allow them, so a self-hosted deployment or a dedicated bench is required for this kind of logic.
- Inventory of scripts: List every SuiteScript, workflow, saved search and integration, then classify each as retire, replace with configuration, or rebuild as a Frappe app.
- Server Scripts versus apps: Small document-event rules can become Server Scripts, while larger logic belongs in a versioned Frappe app with tests and code review.
- Enabling Server Scripts: Confirm that the target environment permits
server_script_enabledbefore you design around it. - Integrations: Replace SuiteTalk-based integrations with APIs or middleware that you control, and test them against real data volumes.
- Custom fields and records: Map each custom record to a DocType or custom field, and keep the internal IDs from NetSuite so relationships can be rebuilt.
Ask for a written list of customizations with an estimate of rebuild work per item, since this list determines most of the project scope.
Manufacturers and distributors that license NetSuite's warehouse or manufacturing add-ons face extra scope because those functions often hold the most operational data and the most daily-use process logic. Bills of materials, routings, work orders, bin locations, pick strategies and barcode workflows each need a decision. Stock valuation and open purchase and sales orders must balance on cutover day, or the first weeks of operation will show discrepancies.
- Warehouse execution: Review the NetSuite WMS replacement page to decide how putaway, picking, cycle counts and scanning will be covered by Odoo Inventory or ERPNext stock.
- Manufacturing logic: Check the NetSuite Advanced Manufacturing alternative before moving bills of materials and work orders.
- Open transactions: Decide whether open purchase orders, sales orders and work orders are closed in NetSuite or carried over as imported documents.
- Stock valuation: Confirm the valuation method and reconcile item quantities and values by warehouse at the cutover date.
- Shop floor and devices: Confirm that scanners, label printers and mobile devices are supported by the chosen configuration.
Confirm which add-on licenses are active in your account, because the scope of WMS and manufacturing replacement depends on which features you actually use.
Questions buyers ask before moving from NetSuite to ERPNext
What drives the cost of moving from NetSuite to ERPNext?
The cost depends on scope, data volume and how much NetSuite customization you need to rebuild, not on a license fee, because self-hosting ERPNext is free according to the ERPNext pricing page. The main cost components are the infrastructure you run or rent, the implementation work (data mapping, imports, custom logic, testing, cutover), your internal staff time, and ongoing support and upgrades. Frappe Cloud hosting and certified partner implementation are priced separately, so ask each provider for its own quote. Costs rise with the number of SuiteScript scripts, workflows, custom records, integrations and subsidiaries. Ask any quote to itemize one-time work from recurring hosting and support.
How long does a NetSuite to ERPNext migration take?
No fixed duration applies to every migration, so treat any timeline as something to agree in writing against your own scope. The schedule is driven by how many entities, transaction years and customizations you move, how clean your master data is, and how many import rounds you need before reconciliation passes. Most of the calendar time usually goes into mapping, test imports in batches and reconciling balances, not into the import itself. Ask for a phased plan with a test cutover, a parallel reconciliation period and a final cutover date, and confirm which dependencies (integrations, payroll, warehouse processes) sit on the critical path.
What does our internal team need to provide during the migration?
Your finance, operations and IT staff must own decisions that no vendor can make for you. The usual inputs are:
- A finance owner who approves the chart of accounts mapping and opening balance approach
- Master data owners for customers, vendors and items who can resolve duplicates
- An IT contact for hosting, identity and access, backups and network rules
- Process owners who confirm which SuiteScript-driven workflows must survive cutover
Plan for their time during mapping, test import review and user acceptance testing. Confirm these named roles and their availability in the written scope.
Can we migrate from NetSuite to ERPNext ourselves?
Yes, a capable internal team can do a small, standard migration alone, because ERPNext ships with Data Import templates for CSV and Excel files and its documentation recommends importing a few thousand records at a time. The harder parts are the ones that need judgment: restructuring the chart of accounts, rebuilding SuiteScript logic as Frappe server scripts or apps, handling multi-currency and multi-subsidiary balances, and hardening a production deployment. Be honest about your team's experience with Frappe, Python and accounting migrations. Many organizations split the work, keeping data preparation in-house and buying implementation for logic and cutover.
Which Frappe versions and support plans should we choose?
Pick a version that is still supported for the whole life of the new system, not only for go-live. According to Frappe's supported versions page, version 14 reached end of life on January 31, 2026, version 15 is planned to be supported until the end of 2027, and version 16 until the end of 2029. Frappe's supported versions policy also says that warranty coverage from Frappe requires being on a listed version and subscribed to a matching Frappe Cloud support plan. Confirm the current status on the supported versions page before you start, and plan upgrades as part of the run cost.
How do we handle opening balances when moving off NetSuite?
Most teams load opening balances as of a single cutover date, then reconcile them to NetSuite's trial balance, open payables and receivables, and open inventory before go-live. You will need to decide whether to migrate open transactions, summarize historical periods or keep NetSuite read-only for reference. Map internal IDs carefully so that open invoices, payments and stock balances link to the right customers, vendors and items. Ask your partner to deliver a reconciliation pack that shows each balance from NetSuite, the imported figure and any difference, signed off by your finance owner.
Do payroll and warehouse management need separate decisions?
Yes. Payroll usually needs a country-specific decision because tax tables, statutory filings and provider certifications differ by jurisdiction and are not a simple data import. Warehouse execution, such as barcode picking, putaway strategies and cycle counts on mobile devices, also needs its own check against ERPNext stock features and any extra modules you require. Decide early whether payroll stays with NetSuite, moves to a specialist provider or is handled in ERPNext, and whether WMS processes are replaced or only the stock ledger is migrated. Confirm both in the written scope, since they affect cutover dates and testing effort.
How DeployOpen scopes and runs a NetSuite to ERPNext migration
DeployOpen scopes a NetSuite to ERPNext migration as a fixed-scope engagement with scope, deliverables and timelines agreed in writing before any work starts. For this move, the scope document should name the NetSuite sources in use (Full CSV Export lists, saved search and report CSVs, and any transaction detail extracts), the ERPNext version and hosting model, the companies and currencies in play, and the custom logic that must be rebuilt. Each of these changes the amount of mapping and testing, so ask for them to be written down at the start rather than discovered during the import runs.
Typical deliverables include a mapping workbook that links each NetSuite chart of accounts segment, item, customer and vendor field to its ERPNext equivalent, an import runbook that sets the order of loads (accounts, masters, then opening balances) and the batch sizes used, and reconciliation evidence showing record counts, balances and sample transactions compared between the two systems. The hardening work covers the self-hosted stack itself: access control, Frappe server script settings, backups, and the production layout of the Docker deployment. Ask for each deliverable to name its acceptance check, and confirm which items the vendor and your own finance team sign off.
DeployOpen does not publish prices. A quote follows from the written scope, and the main drivers are the number of companies, the volume of history to migrate, the amount of SuiteScript logic to rebuild and the hosting work. Ongoing upgrades and support are available as retainers, which matter because ERPNext releases arrive frequently and the supported major versions have defined end-of-life dates. DeployOpen is not an official Frappe or ERPNext partner, so confirm with any implementer whether they hold a partner status and what that status covers.

