Mapping console

Every source column is matched to a target column automatically, then shown to you for confirmation. Nothing is written until you approve it.

81
source entities
189
target records
2,309
source fields
7,117
target fields

Where these definitions come from

Source — Intuit's published XSD schemas, the same ones that generate Intuit's official QuickBooks V3 SDK. Field names, types and permitted values are read directly from them.

Target — Oracle's published SuiteTalk schemas, version v2019_1_0.

Two limits worth knowing before you start.
Target field names are read from the SOAP schema, which is public. If the migration writes over REST, confirm the names against your own NetSuite account before the production run — custom fields and anything added after that schema version will not appear here.

The source schemas also cannot tell us which fields are mandatory: almost everything is optional in the schema because one file serves both QuickBooks Online and Desktop. Requiredness is left blank until a profiling run measures it against your actual data.
0 mapping hints were discarded — every curated alias resolved against both catalogs at load.

Choose what to migrate

Load order matters. Accounts, customers and vendors must exist before the transactions that point at them.

Master data

Ambiguous: QuickBooks Item maps to a family of NetSuite item records, chosen per record by Item.Type — a routing rule, not a single mapping.

Transactions

A QuickBooks SalesReceipt is paid at point of sale; NetSuite models this as CashSale.
Ambiguous: covers cash, cheque and credit-card spend; NetSuite splits this across Check, VendorBill and other records by payment type.
Ambiguous: no single NetSuite record — usually a JournalEntry or bank transfer depending on account types.

Dimensions

QuickBooks "Class" is NetSuite "Classification".

Tax

Ambiguous: depends on whether the target account uses SuiteTax. Verify against the account's metadata before mapping.

Match the columns

10
approved
10
curated
21
to review
31
source fields

Confident matches are ticked already. The ones below them are guesses — read those.

Source fieldTarget field TransformRequiredConfidenceWhy
Idstring none Curated Becomes the NetSuite externalId — what makes re-runs idempotent
Namestring none Curated Account name
AcctNumstring none Curated Account number
AccountTypeenum · 16 values value map Curated Systems spell the values differently — translated below
Activeboolean negate Curated NetSuite stores the inverse — value must be negated
OpeningBalancedecimal none Curated Parsed as exact minor units, never floating point
ParentRefReferenceType ref_to_externalid Curated Hierarchy parent, resolved by externalId
CurrencyRefReferenceType ref_to_externalid Curated Reference resolved to a NetSuite RecordRef
Descriptionstring none Curated Direct correspondence
OpeningBalanceDatedate date_format Curated NetSuite carries the opening balance date on tranDate
SyncTokenstring none None QuickBooks version stamp — usually dropped, but only you decide
SubAccountboolean none None No proposal — nothing on the target resembles this field
Showing the Account grid. In the shipped console every entity's full field list renders here; this mock-up carries Account's verified rows.
Value translation — AccountType → acctType 16 values · 16 matched
Source valueTarget valueMatch
Bank_bankHigh
Accounts Receivable_accountsReceivableHigh
Accounts Payable_accountsPayableHigh
Cost of Goods Sold_costOfGoodsSoldHigh
Long Term Liability_longTermLiabilityHigh
Non-Posting_nonPostingHigh
All sixteen values resolved from the two vendors' published enumerations. Any value left blank sends its records to the rejects file rather than guessing.

Proof the numbers survived

After loading, the engine recomputes each figure from the source and reads the same figure back out of NetSuite. Anything that disagrees is reported with the records behind it.

Every source row is accounted for: loaded, rejected or deliberately skipped.
The sum of each amount column matches between the two systems.
Total debits equal total credits in NetSuite after the load.
Open receivable per customer matches what QuickBooks had.
Open payable per vendor matches what QuickBooks had.
Every account arrived, under the same parent, with the same type.
Nothing points at a record that never made it across.
Each rejected record listed with the rule it failed.

Review and export

4
entities
69
column matches
0
blocking issues
Account: 21 columns have requiredness unverified · Customer: 48 · Vendor: 56 · Invoice: 81. The engine will refuse to run until a profiling pass decides them — that refusal is the safety interlock, not a bug.
; QuickBooks Online -> NetSuite migration configuration
; Generated by the mapping console

[provenance]
qbo_catalog_source = https://github.com/intuit/QuickBooks-V3-Java-SDK
netsuite_wsdl_version = v2019_1_0
netsuite_catalog_is_provisional = true

[engine]
batch_size = 100
rate_limit_rps = 10
reject_unverified_required = true
; Refuse to start if any mapping still carries required = UNVERIFIED.

[entity.Account]
enabled = true
load_order = 1
netsuite_record_type = Account
operation = upsert

[mapping.Account.001]
source_path = Id
target_path = externalId
required = UNVERIFIED

[mapping.Account.005]
source_path = Active
target_path = isInactive
transform = negate
; NetSuite stores the inverse. Value must be negated.

[valuemap.Account.AccountType]
map[] = Bank|_bank
map[] = "Accounts Receivable"|_accountsReceivable
; …16 entries…
unmapped_action = REJECT
Downloads migration_config.ini, dq_rules.ini and the full review state — the exact files the engine runs from.
Interactive product walkthrough · sample data is shown for demonstration