Connect Salesforce to NetSuite
Why teams connect Salesforce and NetSuite
Sales lives in Salesforce, finance lives in NetSuite, and the handoff between them is usually a spreadsheet, a nightly export, or a person rekeying orders. That gap is where revenue leaks and month-end slows down.
- Closed-won deals become NetSuite sales orders without manual re-entry, so fulfillment starts the same day
- Customers and items are matched, not duplicated, using external IDs on both sides
- Invoice, payment, and fulfillment status flows back to Salesforce, so reps stop asking finance for updates
- Every sync is a run you can inspect, so a disputed order has a record of what moved and when
Worked example
The order-to-cash flow most teams turn on first.
Closed-won Opportunity to NetSuite Sales Order, status back to Salesforce
Started when an Opportunity reaches Closed Won, with a human approval step for any order above a threshold.
- Trigger: Salesforce
New or updated opportunity, polled on the schedule you set, with a Filter that continues only whenStageName = Closed Won. For an immediate start, use a Live stream trigger on Change Data Capture instead. - Resolve customer: NetSuite
Upsert by external idonCustomer, keyed on the SalesforceAccount.Id, from the Account fields. - Resolve items: read the
OpportunityLineItemrows with a SOQL query, and match each NetSuiteItembyProduct2.ProductCode → itemId. - Approval: if
Amount > 50,000, a Wait for form step sends finance an approval task by email link. Otherwise continue. - Write order: NetSuite
Upsert by external idonSalesOrder, keyed on the Opportunity ID, mapping the fields in the table below. - Write back: a Salesforce update on the Opportunity, setting
NetSuite_SO_Number__candOrder_Status__c = Submitted. - Ongoing: a second flow polls NetSuite invoices and item fulfillments with the
Record Created or Changedtrigger and updatesOrder_Status__con the Opportunity.
Field mapping
The starting map for the Opportunity to Sales Order step. Adjust to your NetSuite form and Salesforce customizations.
| Salesforce | NetSuite | Notes |
|---|---|---|
Account.Id | Customer.externalId | Match key. Creates the customer if missing. |
Opportunity.Id | SalesOrder.externalId | Idempotency key. The upsert updates the same order on a retry. |
Opportunity.CloseDate | SalesOrder.tranDate | Order date. |
Opportunity.CurrencyIsoCode | SalesOrder.currency | Fails the run if the currency is not set up in NetSuite. |
OpportunityLineItem.Quantity | SalesOrder.item.quantity | Line level. |
Product2.ProductCode | SalesOrder.item.item | Resolved to internal item ID before write. |
OpportunityLineItem.UnitPrice | SalesOrder.item.rate | Override, so NetSuite price rules do not restate the quoted price. |
Owner.Email | SalesOrder.salesRep | Resolved to a NetSuite employee record. |
What syncs, each direction
- Orders and customers. Closed-won opportunities become sales orders. New accounts become customers. Quote revisions update the open order. (Salesforce to NetSuite)
- Billing and fulfillment status. New invoices, payments, and shipments picked up by polling update order status and paid-through date on the Opportunity. (NetSuite to Salesforce)
- Financial account fields. Credit hold, payment terms, and account balance sync onto the Salesforce Account so reps see risk before they quote. (NetSuite to Salesforce)
- Product and price book. New items and price changes keep the Salesforce price book and NetSuite item list aligned. (Either direction)
Governance and audit
The same controls apply to this sync as to every other Neblex workload.
- Run history. Every sync is a run with step-level status and errors. A failed run can be replayed from the step that failed; steps that already succeeded are not repeated.
- Approval steps. Add a Wait for form step wherever a person should decide: large orders, credit holds, or first orders for a new customer.
- Scoped access. The connection uses a service account with only the objects this sync needs, not broad admin access.
- Environments. Build and test against a Salesforce sandbox and a NetSuite sandbox account, then promote the same flow to production.
Frequently asked questions
Is the Salesforce to NetSuite sync immediate or batched?
Either. The order-to-cash flow can start from a Salesforce Change Data Capture stream as each change arrives, or from the polled opportunity trigger every minute or more. High-volume item or customer syncs usually run on a schedule.
How are duplicate customers and orders prevented?
Both sides are matched on external IDs (Salesforce record IDs stored on the NetSuite records), and the writes use Upsert by external id, so a retry updates the existing order rather than creating a second one.
What happens when a sync fails midway?
The run stops at the failed step with the error and the data in context. Fix the cause, for example an unmapped item, and replay from that step. Steps that already succeeded are not repeated.
Do we need NetSuite SuiteScript or a bundle?
No. The connector uses NetSuite's REST web services and SuiteQL. No code is deployed into your NetSuite account.
Can we customize the field mapping?
Yes. The mapping above is a starting point. Every field, including custom fields on both sides, is mappable in the flow editor.
Connectors used
Salesforce
CRM & Sales
- Operations
- 1,296
- Operations with typed output
- 57.9%
- Change triggers
- 31 (poll)
- Signs in with
- OAuth 2.0 sign-in
NetSuite
ERP & Enterprise Systems
- Operations
- 271
- Operations with typed output
- 0%
- Change triggers
- 1 (poll)
- Signs in with
- Connection details
NetSuite does not describe its output fields in advance, so check the field mapping with Test this step when you build the flow.
Bring one real integration
We will build it with you against your own systems, with the run log open.