crossary
How it worksSee it workTrustPricingFree template
Log inStart free
Start free
Worked example

QuickBooks Online to NetSuite: a customer mapping, exactly as it came out

Two public vendor specs in, one mapping out, nothing edited afterwards. It proposed a source for 29 of NetSuite's 139 customer fields and refused to guess at the rest — which is the part worth looking at.

Updated August 2026

What went in

Two documents, both published by the vendors themselves, both used as-is:

  • Source — Intuit’s QuickBooks Online Accounting API reference for the Customer entity: 42 fields with types, requiredness and descriptions.
  • Target — NetSuite’s public SuiteTalk schema for the Customer record: 139 fields, taken straight from the XSD.

Both files were read in full — no truncation, nothing dropped. That matters, because a mapping drafted from part of a spec that presents itself as a mapping of the spec is the first way this kind of tool lies to you.

Crossary's Fields tab for this run: 181 of 181 extracted fields applied, the 42 QuickBooks Online source fields listed with object, type and description, and a clarifying-questions panel whose first blocker asks which NetSuite subsidiary should receive migrated customers.
181 fields out of two documents.The inventory both sides are mapped against — 42 from QuickBooks, 139 from NetSuite. The panel on the right is the extraction phase already stopping on the subsidiary problem: NetSuite requires one, QuickBooks has nothing to supply it.

What came out

Of the 139 NetSuite customer fields, the run proposed a source for 29 and abstained on 110, raising 21 questions along the way — nine of them serious enough to stop on, covering eight distinct problems. The abstentions are not a shortfall. QuickBooks Online has no credit limit, no sales rep, no territory, no subsidiary, no partner-and-campaign lineage; a tool that returned 139 confident rows here would have invented 110 of them.

Crossary's mapping review table for this run: 29 of 139 target fields mapped, 110 not yet mapped, and rows reading 'no source' each carrying the question the AI raised instead of a guess — customForm, entityId, isPerson, defaultAddress, subsidiary. The panel on the right holds eight unanswered blocker questions.
The gaps are rows, not silence.Each unmapped target sits in the table carrying the question it raised, rather than being quietly dropped or filled with a plausible guess. The eight blockers on the right hold the review frozen until a human answers them — that freeze is deliberate.

The 29 it proposed

Unedited and in export order. Confidence is the model’s own self-assessment — a cue for what to read first, never a verification. The evidence underneath it is the proof.

QuickBooks OnlineNetSuiteTypeConfidence
DisplayNamealtNamedirecthigh
AlternatePhonealtPhonetransformationhigh
Notescommentsdirecthigh
CompanyNamecompanyNamedirecthigh
CurrencyRefcurrencylookuphigh
PrimaryEmailAddremailtransformationhigh
IdexternalIddirecthigh
Faxfaxtransformationhigh
GivenNamefirstNamedirecthigh
—internalIdgeneratedhigh
ActiveisInactiveconditionalhigh
FamilyNamelastNamedirecthigh
MiddleNamemiddleNamedirecthigh
MobilemobilePhonetransformationhigh
BalanceopeningBalancedirecthigh
OpenBalanceDateopeningBalanceDatetransformationhigh
ParentRefparentlookuphigh
PrimaryPhonephonetransformationhigh
PrintOnCheckNameprintOnCheckAsdirecthigh
ResaleNumresaleNumberdirecthigh
Titlesalutationdirecthigh
Taxabletaxabledirecthigh
TaxabletaxExemptconditionalhigh
SalesTermReftermslookuphigh
BillAddr + ShipAddraddressbookListtransformationmedium
PreferredDeliveryMethodemailTransactionsconditionalmedium
PreferredDeliveryMethodprintTransactionsconditionalmedium
DefaultTaxCodeReftaxItemlookupmedium
WebAddrurltransformationmedium

Three rows worth reading closely

A straight CompanyName → companyName needs no justification. A derived rule does, so those rows carry the verbatim line from the spec they rest on.

isInactiveconditionalhigh

CASE WHEN Active IS NULL THEN NULL ELSE NOT Active END

NetSuite inactivity is the logical inverse of QBO's enabled-for-use indicator.

“If true, this entity is currently enabled for use by QuickBooks.” — QuickBooks Online, Active

A polarity flip. Copy this one straight across and every active customer arrives in NetSuite switched off — and the quote is what lets a reviewer confirm the inversion in two seconds instead of trusting it.

parentlookuphigh

Lookup NetSuite Customer where externalId = ParentRef.value; return its RecordRef

QBO ParentRef identifies the immediate parent, and the parent can be resolved through the migrated QBO external identifier.

“A reference to a Customer object that is the immediate parent of the Sub-Customer/Job in the hierarchical Customer:Job list.” — QuickBooks Online, ParentRef

It didn’t just pair two fields — it worked out that the parent has to be resolved through the external ID the migration itself writes, which constrains the load order.

internalIdgeneratedhigh

Assigned by NetSuite when the Customer record is created

No source field applies: the target system produces this value itself.

No quote on this row — it makes no claim about the source document, so there is no passage to cite.

Not every unmapped field is a gap. This one has no source because it can’t have one, and saying so is different from shrugging.

The eight it stopped on

Nine blocker-severity questions came out of the run, covering eight distinct problems — the subsidiary one was flagged independently in both the field and the mapping phase. If you have done this migration, you have had these exact arguments:

  • Which NetSuite subsidiary should receive migrated customers? (raised in both phases)
  • Which QBO value should become the NetSuite Customer entityId?
  • What rule should determine NetSuite isPerson?
  • Which QBO address, if any, should populate NetSuite defaultAddress?
  • How should QBO tax identifiers be migrated given that API responses mask them?
  • How will customer receivables balances be migrated?
  • Which NetSuite account should be used for openingBalanceAccount when opening balances are loaded?
  • How should BillAddr and ShipAddr be represented in NetSuite addressbookList?

None of these can be answered from the two specs, which is precisely why they are questions and not mappings. The subsidiary one alone decides whether the load runs at all.

What this does not show

  • It is not a reviewed workbook. This is raw output. A real deliverable has a human decision on every row; that step is the product, and it hasn’t been done here.
  • The 29 are not verified correct. They are proposals with their evidence attached so you can check them quickly. At least one — url — carries an explicit assumption that the exact emitted property needs confirming.
  • Your specs are messier than these. Vendor API references are unusually clean. A client’s half-finished requirements sheet will produce more questions, not fewer.
  • It maps the spec, not your data. Nothing here touched a customer record, and nothing moves anything: Crossary produces the design a developer then implements.
Run on 2 August 2026 against the vendors’ then-current public specs. Both documents are the versions their owners publish; neither was edited before upload, and no mapping row was edited after. The blank version of this deliverable is available as a free source-to-target mapping template.
Try it on your own specs — freeOr walk a smaller worked sample first
crossary

Source-to-target data mapping that shows its work — and flags the gaps instead of guessing.

Product
The reviewed rowHow it worksThe guided sampleFree mapping templatePricing
Trust
Trust mechanicsFAQSecurityPrivacy & data
Company
SupportTermsLog in
© 2026 Crossary. All rights reserved.AI proposes · you decide · nothing ships you didn't approve.
TermsPrivacyCookiesSubprocessorsDPA