Articles in this section

Salesforce - Netsuite (Lead to Cash) implementation guide

This guide walks Salesforce administrators, NetSuite administrators, and implementation teams through deploying the Salesforce – NetSuite Lead to Cash template. The integration connects your Salesforce org to NetSuite so both systems share one accurate version of your account, contact, product, and transaction data. It ships as 53 pre-built flows across 15 modules, and it supersedes the earlier Salesforce – NetSuite quickstart template. Unlike the Salesforce – NetSuite integration app, every flow, mapping, filter, and script in this template is open for you to customize.

Note: This guide assumes working knowledge of both Salesforce (Accounts, Opportunities, Quotes, Cases, Work Orders, Return Orders) and NetSuite (Customers, Sales Orders, Estimates, Item Fulfillments, Return Authorizations). General navigation in either product is out of scope; concepts are explained only where the integration gives them special meaning.

Just getting started? Start here

If you only need core lead-to-cash sync, accounts, contacts, products, opportunities, and orders, you don't need every module on day one. Work through the sections in order: Prerequisites > Install the template > Initial setup > Settings > core flows > enable and schedule. Add quotes, cases, contracts, work orders, returns, and file sync later, once their prerequisites are met.

What this template does

Opportunities and orders closed in Salesforce become NetSuite sales orders in real time. Fulfillments, invoices, payments, and returns processed in NetSuite flow back to Salesforce so sales and service teams see live order economics without leaving CRM. The template reaches full parity with the Salesforce – NetSuite Integration App and adds service, contract, field service, asset, and return merchandise authorization (RMA) use cases that were previously unavailable in either offering.

Benefits for Sales, Operations, Finance, Service, and Returns teams

  • Sales sees NetSuite order status, financials, fulfillment, and project progress on the Opportunity and Account, with no ERP login required.
  • Operations stops re-keying orders: closed-won opportunities, quotes, contracts, and work orders create NetSuite transactions automatically, with line-level fidelity.
  • Finance gets invoice, payment, credit memo, and deposit visibility on the Salesforce Account, plus dated exchange rate sync for multi-currency orgs.
  • Service teams work cases in either system, with bidirectional case sync and attachments, and see an install base (Assets) built automatically from NetSuite fulfillments.
  • Support and returns teams run the full RMA lifecycle: Salesforce-initiated return orders become NetSuite return authorizations with line items, and NetSuite return status flows back automatically.

All 53 flows at a glance

All flows are installed disabled. You enable them in the sequence described in Enable flows and schedule, after completing setup. Flows marked Real-time have no schedule; enabling one activates event listeners in the source system instead.

Module Flows Direction Trigger
Account NetSuite Customer to Salesforce Account Add/Update NS > SF Real-time
Salesforce Account to NetSuite Customer Add/Update SF > NS Real-time
Contact NetSuite Contact to Salesforce Contact Add/Update NS > SF Real-time
Salesforce Contact to NetSuite Contact Add/Update SF > NS Real-time
NetSuite Contact Tasks to Salesforce Contact Tasks NS > SF Scheduled
NetSuite Contact Emails to Salesforce Contact Emails NS > SF Scheduled
NetSuite Events to Salesforce Events NS > SF Scheduled
Salesforce Converted Leads to NetSuite Contact-Customer Link SF > NS Scheduled
Salesforce Account Contact Relationships to NetSuite Contact Attach SF > NS Scheduled
Customer NetSuite Customer Tasks to Salesforce Account Tasks NS > SF Scheduled
NetSuite Customer Emails to Salesforce Account Email Messages NS > SF Scheduled
Opportunity Salesforce Opportunity to NetSuite Sales Order SF > NS Real-time
NetSuite Sales Order to Salesforce Opportunity Add/Update NS > SF Real-time
Salesforce Order to NetSuite Sales Order Add/Update SF > NS Real-time
NetSuite Sales Order to Salesforce Order Add/Update NS > SF Real-time
NetSuite Sales Order Status to Salesforce Order Status NS > SF Scheduled
NetSuite Sales Order Lines to Salesforce Opportunity Products (Line ID Write-back) NS > SF Scheduled
Salesforce Opportunities to NetSuite Opportunities SF > NS Scheduled
Salesforce Opportunities to NetSuite Projects (Add/Update) SF > NS Scheduled
NetSuite Project Status to Salesforce Opportunities NS > SF Scheduled
NetSuite Opportunity Tasks to Salesforce Opportunity Tasks NS > SF Scheduled
NetSuite Opportunity Emails to Salesforce Opportunity Email Messages NS > SF Scheduled
Salesforce Opportunity Attachments to NetSuite Order Attachments SF > NS Scheduled
Salesforce Opportunity Contact Roles to NetSuite Sales Order SF > NS Scheduled
Salesforce Opportunity Line Schedules to NetSuite Sales Order Lines SF > NS Scheduled
Salesforce Discount Item to NetSuite Sales Order SF > NS Scheduled
Product NetSuite Item to Salesforce Product NS > SF Scheduled
Salesforce Product to NetSuite Item Add/Update SF > NS Scheduled
NetSuite Item Group to Salesforce Product Add/Update NS > SF Scheduled
NetSuite Item Inventory Levels to Salesforce Product NS > SF Scheduled
Financial NetSuite Customer Financials to Salesforce Account NS > SF Scheduled
NetSuite Transaction Financials to Salesforce Financials NS > SF Scheduled
NetSuite Customer Price Levels to Salesforce Accounts NS > SF Scheduled
NetSuite Exchange Rates to Salesforce Exchange Rates NS > SF Real-time
Fulfillment NetSuite Item Fulfillment to Salesforce Item Fulfillment NS > SF Real-time
File Salesforce Files to NetSuite File SF > NS Scheduled
NetSuite PDFs to Salesforce Files NS > SF Scheduled
Quotes & CPQ Salesforce Quote to NetSuite Estimate Add/Update SF > NS Scheduled
NetSuite Estimate (Quote) to Salesforce Quote Add/Update NS > SF Scheduled
Salesforce Quote Notes to NetSuite Estimate Notes SF > NS Scheduled
Contract Renewal NetSuite Contract to Salesforce Contract Add/Update (SWV) NS > SF Scheduled
NetSuite Opportunity to Salesforce Opportunity Add (Renewals) NS > SF Scheduled
Cases Salesforce Cases to NetSuite Support Cases (with attachments) SF > NS Scheduled
NetSuite Support Cases to Salesforce Cases (with attachments) NS > SF Scheduled
Contract Salesforce Contract to NetSuite Sales Order SF > NS Scheduled
NetSuite Sales Order to Salesforce Contract NS > SF Scheduled
Work Orders Salesforce Work Orders to NetSuite Sales Orders SF > NS Scheduled
NetSuite Sales Orders to Salesforce Work Orders NS > SF Scheduled
Assets & Returns NetSuite Fulfillment Lines to Salesforce Assets NS > SF Scheduled
Salesforce Return Orders to NetSuite Return Authorizations SF > NS Scheduled
NetSuite Return Authorizations to Salesforce Cases NS > SF Scheduled
NetSuite Return Authorization Status to Salesforce Return Orders NS > SF Scheduled
Leads Salesforce Leads to NetSuite Customers (Lead Stage) SF > NS Scheduled

Prerequisites

Note: Complete every item in this section before you install the template. A missing bundle, package, or permission is the most common cause of errors on new installations, and discovering one after install means reconfiguring connections and re-running setup steps.

NetSuite requirements

  1. Enable required features. Go to Setup > Company > Enable Features. Under Data management, select File Cabinet. Under SuiteCloud, select Custom Records, Client SuiteScript, Server SuiteScript, SOAP Web Services, and Token-Based Authentication, then select Save.
  2. Allow the two Celigo SuiteApps. The template uses SuiteApps, not SuiteBundles. During installation, you install the Celigo integrator.io SuiteApp (com.celigo.integratorio), which provides the SuiteApp 2.0 restlets and user event scripts every NetSuite-side flow depends on, including the real-time listeners, and the Celigo Salesforce SuiteApp (com.celigo.salesforceio), which provides the celigo_sfio_* link and qualifier fields. Make sure the NetSuite user who installs the template can install SuiteApps from the SuiteApp Marketplace. The legacy Celigo integrator bundle (ID 20038) isn't required, and accounts already running it are unaffected.
  3. Enable optional features per module. Enable only the features your business needs:
    1. Opportunities (Setup > Sales), required by NetSuite Opportunity to Salesforce Opportunity (Renewals) and Salesforce Opportunities to NetSuite Opportunities.
    2. Projects/Jobs, required by the Projects and Project Status flows.
    3. Return Authorizations, required by the Assets & Returns module.
    4. SWV Contract Renewals bundle (Software Vertical, bundle ID 187488), required only by the SWV Contract flow and NetSuite-driven renewal opportunities.
  4. Note account-specific mandatory fields. If your account makes Order Type, End User, Subsidiary (OneWorld), or Location mandatory on transactions, collect the correct default values now. The NetSuite defaults settings supply them automatically, and flows omit them when the corresponding setting is left blank.

Salesforce requirements

  1. Install the Celigo Integrator Adaptor package. This managed package (integrator_da) provides the Real Time Sync registry, the Apex triggers for standard objects, and the queued-message machinery the real-time flows depend on. Install for Admins Only.
  2. Install the Celigo Salesforce – NetSuite [AT] package. This package adds the celigo_sfnsio__* custom fields (NetSuite ID, order economics fields) that the real-time flows and ID write-backs depend on. Install for Admins Only. You can install both packages ahead of time, or when the installer prompts you (steps 3 and 4 of Install the template).
  3. Confirm optional feature availability. The corresponding flows ship disabled and can be enabled once the feature exists in your org:
Salesforce feature Flows that require it
Quotes (Setup > Quote Settings) Quote and Estimate sync, Quote Notes
Multi-Currency (irreversible) Multi-currency item pricing (settings toggle)
Advanced Currency Management / dated exchange rates (irreversible) Dated conversion rate portion of the Exchange Rates flow
Product Schedules Opportunity Line Schedules
Contacts to Multiple Accounts Account Contact Relationships
Field Service (WorkOrder object) Work Orders sync
Order Management (ReturnOrder object) Salesforce Return Orders to NetSuite Return Authorizations, and the RA status back-sync

Note: Orgs without the ReturnOrder object still get full returns visibility: the NetSuite Return Authorizations to Salesforce Cases flow has no feature prerequisites.

Celigo requirements

  • An active integrator.io account with administrative access and an endpoint subscription covering Salesforce and NetSuite.
  • A NetSuite connection using token-based authentication, and a Salesforce connection authorized by an integration user with API access and visibility to every object referenced in this guide.

Install the template

  1. Find the template in the Celigo Marketplace. Go to Marketplace, select Salesforce or NetSuite, find Salesforce – NetSuite Lead to Cash, and select Preview. Review the template contents and the ReadMe, then select Install now.
  2. Configure the Salesforce connection. Select Configure and select an existing Salesforce connection, or set up a new one. Use an integration user with API access.
  3. Install the integrator.io package in Salesforce. Select Install. You're redirected to Salesforce to install the integrator.io distributed adaptor package (integrator_da), which provides the real-time export triggers and the Real Time Sync registry. Sign in, complete the install, then return to integrator.io and select Verify now.
  4. Install the NetSuite package in Salesforce. Select Install and complete the package install the same way. This package adds the celigo_sfnsio__* custom fields and objects that the flows' cross-system links, status fields, and ID write-backs depend on.
  5. Configure the NetSuite connection. Select Configure and select an existing NetSuite connection, or set up a new one (token-based authentication recommended).
  6. Install the integrator.io SuiteApp in NetSuite. Select Install. Setup checks whether the Celigo integrator.io SuiteApp (com.celigo.integratorio) is installed in the NetSuite account and opens its SuiteApp Marketplace listing if it isn't. The legacy Celigo integrator bundle (ID 20038) isn't required; accounts already running it are unaffected.
  7. Install the Salesforce SuiteApp in NetSuite. Select Install to add the Celigo Salesforce SuiteApp (com.celigo.salesforceio). It provides the NetSuite-side celigo_sfio_* link and qualifier fields that the Salesforce flows use.
  8. Copy resources. Select Install to create the integration tile with all 53 flows. Everything installs disabled: no data moves until you finish initial setup and enable flows deliberately.

Note: If an install request times out, check whether the integration tile was already created before you retry. Retrying a timed-out install can create a duplicate integration.

Initial setup

Complete these six one-time steps in order. Steps 1 and 2 prepare NetSuite, steps 3 through 5 prepare Salesforce, and step 6 activates the real-time listeners. Budget 30 to 60 minutes.

Step 1: Install the template's NetSuite SuiteApp

The template ships its NetSuite customizations as a SuiteApp named Celigo SF-NS Lead to Cash Template Components. Install it from the NetSuite SuiteApp Marketplace (the application ID is on the template listing). It provides:

Component Purpose
custbody_celigo_sf_financial_id (transaction body) Financials write-back: stamps the Salesforce financial record ID onto NetSuite invoices
custbody_celigo_primary_contact (transaction body) Opportunity Contact Roles to NetSuite sales order primary contact
custcol_celigo_schedule_date (transaction column) Opportunity Line Schedules to NetSuite order line schedule dates
custentity_celigo_sf_record_url (entity) Clickable Salesforce record link on NetSuite customers
custentity_celigo_sfio_sf_id (entity) Salesforce ID link on customers and contacts, used for dedupe matching
custbody_celigo_sfio_sf_id, custbody_celigo_sfio_send_so_to_order, custbody_celigo_sfio_sf_pricebook_id, custbody_celigo_sfio_sf_originated_ord (transaction body) Sales order link, qualifier, and pricebook fields used by the real-time order flows
Celigo SFNS Search Creator Suitelet Creates every template saved search with a fixed script ID (step 2)

Note: The celigo_sfio_* link and qualifier fields are also part of the Celigo Salesforce SuiteApp (com.celigo.salesforceio) installed in step 7 of Install the template. If they already exist in your account, they're reused.

Step 2: Create the saved searches

Several flows read from NetSuite saved searches with fixed script IDs. Rather than building them by hand, open the Celigo SFNS Search Creator Suitelet once from a signed-in NetSuite session (Setup > Scripting > Script Deployments > Celigo SFNS Search Creator > URL, installed by the SuiteApp in step 1). It creates every search in the following table and prints a per-search result. Re-running it is safe: existing searches report a duplicate-ID error and are skipped.

Script ID Used by
customsearch_celigo_sfns_txn_financials NetSuite Transaction Financials to Salesforce Financials
customsearch_celigo_sfns_txn_pdfs NetSuite PDFs to Salesforce Files
customsearch_celigo_sfns_opp_tasks NetSuite Opportunity Tasks to Salesforce Opportunity Tasks
customsearch_celigo_sfns_opp_emails NetSuite Opportunity Emails to Salesforce Opportunity Email Messages
customsearch_celigo_sfns_item_groups NetSuite Item Group to Salesforce Product Add/Update
customsearch_celigo_sfns_item_details NetSuite Item Group to Salesforce Product Add/Update (item group member details)
customsearch_celigo_sfns_returns NetSuite Return Authorizations to Salesforce Cases, NetSuite Return Authorization Status to Salesforce Return Orders
customsearch_celigo_sfns_ff_lines NetSuite Fulfillment Lines to Salesforce Assets

Each flow in the preceding table reads directly from its saved search, so create all of them before you enable those flows. The template uses saved searches for these flows because NetSuite's REST-based data provider returns only a limited set of columns from an ad hoc search on a transaction record.

Note: Don't rename, delete, or manually recreate these searches under a different script ID. Flows reference them by script ID, and a mismatch fails with "That search or mass update does not exist." Saved search script IDs are also length-limited to about 33 characters, including the customsearch_ prefix; a longer ID saves under a different, generated ID and breaks the lookup.

Step 3: Create the Salesforce custom fields

Create the unmanaged fields in the following table, or deploy the metadata package included with the template. Only the modules you plan to use require their fields.

Object Field API name Type Needed by
Activity (Task/Event) NS_TaskId__c Text(80) Task, email, and event sync dedupe
Email Message NS_MessageId__c Text(80), External ID Email sync dedupe
Work Order NS_Id__c Text(80), External ID, Unique NetSuite Sales Orders to Salesforce Work Orders
Product2 NS_Quantity_Available__c, NS_Quantity_On_Hand__c, NS_Quantity_Backordered__c Number(18,2) Inventory levels
Case External_ID__c Text(80), External ID Case sync, if not already present
Case NS_Return_Status__c Text(80) NetSuite Return Authorizations to Salesforce Cases (raw NetSuite status)
ReturnOrder NS_Id__c Text(80), External ID, Unique Return authorization status back-sync dedupe
ReturnOrder NS_Return_Status__c Text(80) Return authorization status back-sync
Asset NS_Fulfillment_Key__c Text(80), External ID Fulfillment Lines to Assets dedupe
Account NS_Price_Level__c Text(80) Customer Price Levels to Accounts
Opportunity NS_Project_Status__c Text(80) Project Status to Opportunities
Quote NetSuite_Id__c Text(80), External ID Quote and Estimate sync. If your org's Celigo managed package adds celigo_sfnsio__NetSuite_Id__c automatically once Quotes is enabled, use that managed field instead and repoint the three quote mappings.

Step 4: Grant field-level security correctly

Grant the integration user read and edit access on every field in step 3. The template ships a Celigo NS Integration Fields permission set for this purpose.

Note: Permission set entries of the form Activity.<field> deploy without an error but are silently dropped by Salesforce. Grant field-level security for NS_TaskId__c through Task and Event entries instead; a Task entry automatically creates the shared Task and Event permission. Without this, every task, email, and event flow fails with "No such column 'NS_TaskId__c.'"

Step 5: Create the ContentVersion trigger

The Integrator Adaptor package ships Apex triggers for Account, Contact, Opportunity, Order, Product, and OpportunityLineItem, but not for ContentVersion. Both file flows (Salesforce Files to NetSuite File Cabinet, and Opportunity Attachments to NetSuite) run on a schedule with delta detection on ContentVersion.LastModifiedDate, so they work with or without this trigger. Create it only if your Celigo package version supports real-time ContentVersion events and you want files to sync immediately instead of on the next scheduled run:

trigger CeligoContentVersionUpdate on ContentVersion (after insert, after update) {
  integrator_da.RealTimeExportResult res = integrator_da.RealTimeExporter.processExport();
}

Step 6: Activate the real-time syncs

Real-time flows have listeners in both systems:

  • Salesforce side: enabling a real-time flow registers a record on the Real Time Sync tab (integrator_da__Real_Time_Sync__c). If a real-time flow doesn't trigger on record saves, open that tab and confirm the matching record has Disabled unchecked and a Connector ID set. Delete stale duplicate rows for the same object if the org has been through repeated installs.
  • NetSuite side: the integrator.io SuiteApp's user event scripts fire on record saves. Verify by editing a synced record in the NetSuite UI; the job should appear within a minute.

Note: NetSuite-side real-time triggers deliberately ignore writes made by integration flows to prevent sync loops, so test them with a genuine UI edit. Salesforce-side triggers fire on both API and UI saves.

Global settings for the Salesforce – NetSuite Lead to Cash template

Open the integration tile, then select Settings. Values you set here are configuration, not customization inside individual flows: set each one once and every relevant mapping picks it up. Leave optional values blank when they don't apply to your org; flows omit them automatically.

General

Setting What it does
Map NetSuite Currency to Salesforce Currency (optional) Maps NetSuite currency names to Salesforce ISO currency codes when they differ, for example, "US Dollar" to "USD". Leave empty when the names already match. The multi-currency flows use it to resolve the currency on synced records.
Unique key for an Item in NetSuite (default: itemid) The NetSuite field that holds each item's unique key. Its values must match the Salesforce product unique key.
Unique key for a Product in Salesforce (default: ProductCode) The Salesforce field that holds each product's unique key. Its values must match the NetSuite item unique key.
Track discount items using (optional) The default NetSuite discount item that all line-level discounts post against. The discount appears on the NetSuite sales transaction as a separate line directly below the original line item.
Enable test mode (off by default) When on, only records flagged for testing sync between Salesforce and NetSuite; when off, only live records sync. A Salesforce record is flagged for testing when celigo_sfnsio__Test_Mode_Record__c is checked. Use it to validate the integration before go-live.

NetSuite defaults

Setting What it does
Default Subsidiary (NetSuite internal ID, OneWorld only) Internal ID of the subsidiary assigned when creating NetSuite customers and contacts, including from accounts and leads. Required for OneWorld accounts; leave blank otherwise.
Default Order Type (NetSuite) (optional) Supplied on sales orders, estimates, and return authorizations if your account makes Order Type mandatory. Enter a valid list value, such as "Contract - New".
Default End User (NetSuite internal ID) (optional) Internal ID of the default end-user entity, supplied on transactions if your account makes End User mandatory.
Default Location internal ID (conditional) Applied to transactions that require a location, such as return authorizations created from Salesforce, when Location is mandatory. The location must belong to the customer's subsidiary.

Products & pricing

Setting What it does
Salesforce Multi-Currency enabled (off by default) Turn on only when Multiple Currencies is active in your Salesforce org. When on, the product pricing flows sync currency (CurrencyIsoCode) on price book entries, using per-price-level pricebooks, and the exchange rate flow maintains dated conversion rates. Leave off for single-currency orgs, where pricing uses the Standard Price Book.
Discount Product Family (Salesforce) (default: Discount) The Product2.Family value that identifies discount products for the Discount Item flow.

Files (settings)

Setting What it does
NetSuite File Cabinet Folder ID (required) Internal ID of the NetSuite File Cabinet folder where files synced from Salesforce are stored.

Per-flow settings (real-time flows)

Every real-time flow except NetSuite Exchange Rates to Salesforce Exchange Rates has its own settings, available from the flow's settings. Use them to tune the flow without editing its exports or imports:

  • Sync criteria, such as Criteria for Account Sync or Criteria for Opportunity Sync, is applied to the export's qualifier and controls which records sync.
  • Additional data to export from Lookup fields and Additional data to export from Related Lists or Sublists (Salesforce-to-NetSuite flows) add referenced fields and related records to the export.
  • Lookup criteria, such as Primary Customer Lookup Criteria and Secondary Customer Lookup Criteria, decide how an existing record is matched in the destination to prevent duplicates. Keep the primary criteria as shipped and add your own conditions to the secondary criteria.

The NetSuite Sales Order to Salesforce Opportunity Add/Update flow adds three order-origin settings:

Setting What it does
Advanced Settings for Opportunity Sync (off by default) When on, the flow uses Criteria for NetSuite Sales Order Sync (to Salesforce Opportunity) as its qualifier, and the two originated-order settings that follow are ignored.
Sync updates on NetSuite Originated Orders (off by default) Syncs updates on existing sales orders that were created in NetSuite to their Salesforce Opportunities. When off, those updates aren't synced.
Sync Salesforce Originated Orders (off by default) Syncs NetSuite updates on sales orders that originated from a Salesforce Opportunity back to that Opportunity. When off, those updates aren't synced back.

Flow group settings

The Account, Opportunity, Product, and Financial flow groups have their own settings. Open the integration tile, select the flow group, then open its settings.

Flow group What it does
Account Map Salesforce Account Type to NetSuite Customer Stage and Status
Opportunity Allow Opportunity/Order updates to approved Sales Orders; Sync account with opportunity; Select lookup field to be synced as NetSuite customer; notes, attachments, files, DocuSign, and EchoSign sync toggles; Enable team selling, split types, 0% contribution members, and role map; Sync sales teams from NetSuite to Salesforce
Product Select Price Master; Map NetSuite Price Level to Salesforce Price Book; Salesforce Standard Price Book; NetSuite Items to Sync; product-to-item-type mapping; item and item group saved search overrides
Financial Sync transaction types, transaction lines, and transaction files to Salesforce; saved search overrides for transaction, line, and customer financial records

Core flows: accounts, contacts, and products

Account: NetSuite Customer and Salesforce Account (bidirectional)

The NetSuite Customer to Salesforce Account sync is a bidirectional, real-time pair and the master-data backbone. A company customer created or updated in NetSuite appears as a Salesforce Account within seconds, and the reverse holds too. Both directions carry name, phone, billing and shipping addresses (with automatic street-line splitting), description, and the cross-system ID links.

  • By default, the NetSuite-to-Salesforce direction skips individual (person) customers. To include them, change Criteria for Customer Sync in the flow's settings.
  • By default, the Salesforce-to-NetSuite direction syncs only Accounts that already have a NetSuite ID (Criteria for Account Sync is celigo_sfnsio__NetSuite_Id__c != ''). New Accounts are created in NetSuite when their first opportunity syncs, because the Salesforce Opportunity to NetSuite Sales Order flow creates the customer, its contact, and any parent customers that don't exist yet. To send new Accounts to NetSuite directly, change Criteria for Account Sync.
  • The Salesforce-to-NetSuite direction matches an existing NetSuite customer by either the customer's stored Salesforce ID or the Account's stored NetSuite ID (celigo_sfnsio__NetSuite_Id__c). Accounts linked before real-time was enabled get matched, and back-linked, on their first real-time touch instead of being duplicated.
  • OneWorld accounts: set the Default Subsidiary internal ID before enabling the Salesforce-to-NetSuite direction.
  • Parent-account hierarchies sync when the parent account is itself linked; parentless accounts sync without a parent.
  • If your NetSuite account requires an address on customer records, a Salesforce account synced without any street errors until an address is added.

Contact: sync and activities

NetSuite Contact and Salesforce Contact sync bidirectionally in real time. The NetSuite-side trigger only fires for contacts that have a company; contacts without one are skipped by design. When a new NetSuite contact syncs, the flow writes its Salesforce ID back to the NetSuite contact. In the other direction, a Salesforce contact syncs only when its Account is already linked to a NetSuite customer.

Five scheduled flows bring NetSuite activity history onto the matching Salesforce record: contact tasks, contact emails, customer (account) tasks, customer emails, and calendar events. Each reads the parent entity with activity fields joined directly on the search, so titles, dates, priorities, statuses, and bodies arrive with full fidelity, and each dedupes on NS_TaskId__c or NS_MessageId__c. The Events flow links each event to the Salesforce contact whose celigo_sfnsio__NetSuite_Id__c matches the NetSuite attendee; events for a contact that isn't yet synced report the standard parent-record lookup error and succeed on a later run.

When a Salesforce lead converts, the resulting contact is linked to its NetSuite counterpart. Orgs with Contacts to Multiple Accounts enabled can also attach one NetSuite contact to several customers, mirroring Salesforce Account Contact Relationships.

Product: items, item groups, and inventory

NetSuite items sync bidirectionally with Salesforce products, including pricing. In single-currency mode (the default), base price entries land in the Standard Price Book. In multi-currency mode (the settings toggle), per-price-level pricebooks are created with the correct CurrencyIsoCode for each entry. Item groups sync as products with member-item detail, and inventory levels update the three NS_Quantity_* fields on Product2. The item group flow reads from the customsearch_celigo_sfns_item_groups and customsearch_celigo_sfns_item_details saved searches from step 2.

Note: Every order, quote, asset, and return flow resolves its lines through Product2.celigo_sfnsio__NetSuite_Id__c. Complete a full product sync before you enable any transaction flow.

Leads

Unconverted Salesforce leads become lead-stage customers in NetSuite, so marketing and sales pipelines are visible to ERP users before conversion. The flow dedupes on the Salesforce lead ID; company name falls back to the lead's last name for person leads. OneWorld accounts must set the Default Subsidiary internal ID before enabling this flow.

Transaction flows: opportunities, orders, and quotes

Opportunity and Order to Sales Order (bidirectional)

The Opportunity and Order to Sales Order sync, in both directions, is the transaction backbone. Closed-won opportunities and activated orders create NetSuite sales orders with line items in real time; NetSuite-originated sales orders create Salesforce opportunities and orders with priced line items. IDs are written back in both directions, so later edits update rather than duplicate the record.

  • The Salesforce pricebook is resolved dynamically by name, falling back to the Standard Price Book; no org-specific record IDs are hard-coded.
  • Each order line resolves its PricebookEntry by product code against the resolved book. Line identity uses the globally unique NetSuite line key, so multiple lines of the same item never collide.
  • Custom fields on the NetSuite sales order gate the NetSuite-to-Salesforce direction. A sales order with custbody_celigo_sfio_send_so_to_order checked routes to the Order flow. A sales order with custbody_celigo_sfio_send_so_to_oppty checked and no Salesforce ID (custbody_celigo_sfio_sf_id) routes to the Opportunity flow. A sales order matching neither qualifier is ignored by design. You can change both qualifiers in each flow's settings.

The Salesforce-to-NetSuite direction stamps the Opportunity ID as the sales order's externalid, so a re-sync updates the same sales order instead of creating a new one. After each create or update, the NetSuite sales order internal ID is written back to the Opportunity (celigo_sfnsio__NetSuite_Id__c), which is also the value the NetSuite-to-Salesforce direction matches on. By default, only Opportunities with a Closed Won stage sync; change Criteria for Opportunity Sync in the flow's settings to sync other stages.

Supporting scheduled flows keep the order lifecycle rich: NetSuite order status posts back to Salesforce; NetSuite line IDs write onto Opportunity Products; Salesforce discount line items, identified by the Discount Product Family setting, post to the NetSuite order; the primary Opportunity Contact Role lands on the sales order; and Opportunity Product schedules populate line-level schedule dates. NetSuite opportunity tasks and emails also sync to the Salesforce Opportunity, using the customsearch_celigo_sfns_opp_tasks and customsearch_celigo_sfns_opp_emails saved searches from step 2.

For services businesses, Salesforce opportunities can also create NetSuite Opportunities (requires the Opportunities feature) or Projects. The Project Status flow closes the loop: NetSuite project status, such as "In Progress" or "Won," appears on the originating Salesforce Opportunity in NS_Project_Status__c.

Quote and Estimate sync (bidirectional)

Quotes and their line items sync to NetSuite Estimates with quantity, rate, and description; the NetSuite estimate ID writes back to the Quote. NetSuite-originated estimates come back as Salesforce Quotes, and Quote Notes post to the estimate memo. This module requires the Salesforce Quotes feature.

Note: Salesforce CPQ quote sync isn't included, since Salesforce CPQ is end-of-sale. For the Revenue Cloud path, use the Salesforce ARM – NetSuite template.

Financial, fulfillment, and file flows

Financials

Invoices, credit memos, payments, deposits, and refunds sync as financial records related to the Account, carrying amounts, balances, due dates, and status. The Salesforce record ID writes back onto the NetSuite invoice. Customer-level balances land on the Account, and customer price levels sync to Account.NS_Price_Level__c. This module depends on the customsearch_celigo_sfns_txn_financials saved search from step 2.

Currency saves in NetSuite update Salesforce currency types immediately through a real-time flow. Dated conversion rates additionally require Salesforce Advanced Currency Management; without it, that portion of the flow reports "entity type cannot be inserted: Dated Conversion Rate."

Fulfillment and assets

Fulfillments saved in NetSuite update the linked Salesforce Order within seconds, including status, ship dates, and tracking context, through a real-time flow. This requires the parent Order to be synced first.

A separate scheduled flow builds the install base automatically: every shipped fulfillment line becomes, or updates, a Salesforce Asset with product, quantity, serial numbers, and install date, linked to the correct Account. Credit and negative-quantity lines are skipped, and the flow dedupes on a fulfillment-plus-line key. It depends on the customsearch_celigo_sfns_ff_lines saved search.

Note: Against a large fulfillment history, scope the first run, for example by adding a date or customer criteria overlay on the saved search. Every line belonging to an account that isn't yet synced reports the standard "sync parents first" error until accounts are loaded.

File sync flows

Files uploaded in Salesforce land in the configured File Cabinet folder, named with their original extension, on a delta schedule against ContentVersion.LastModifiedDate. Files attached to Opportunities are also copied to the File Cabinet and attached to the linked NetSuite Sales Order, so ERP users see deal documents in context. Invoice, order, estimate, and credit memo PDFs stored on NetSuite transactions appear as Salesforce Files on the corresponding record; this direction depends on the customsearch_celigo_sfns_txn_pdfs saved search.

Service and field flows

Cases

Service teams can work cases in either system. Cases sync with subject, description, status, priority, and origin, deduped on External_ID__c, and case attachments transfer in both directions between Salesforce Files and the NetSuite File Cabinet.

Contracts and work orders

Contracts and Field Service work orders convert to NetSuite sales orders and back. Work orders require the Salesforce Field Service feature (the WorkOrder object) and dedupe on WorkOrder.NS_Id__c.

Note: The NetSuite Sales Order to Salesforce Contract and Work Order flows consider all sales orders by default. Add an export filter or search criteria, such as order type, so only the intended orders create contracts or work orders.

Contract renewals

For accounts running the NetSuite Software Vertical (SWV) Contract Renewals bundle (bundle ID 187488), NetSuite contracts sync to Salesforce Contracts, and NetSuite-generated renewal opportunities appear in the Salesforce pipeline. Review the SWV field mappings against your bundle configuration before enabling this module; they ship minimal.

Returns (RMA)

The Assets & Returns module covers the full return lifecycle in three flows:

  • Salesforce Return Orders to NetSuite Return Authorizations: service agents initiate returns from Salesforce using the standard ReturnOrder object. Submitted and approved return orders create NetSuite return authorizations with line-level fidelity, including product, expected quantity, unit price, and reason. Settings-driven defaults supply order type, end user, and location where your account requires them.
  • NetSuite Return Authorizations to Salesforce Cases: universal returns visibility with no feature prerequisites. Every NetSuite return authorization becomes a Salesforce Case on the correct Account, carrying the RMA number and live NetSuite status detail in NS_Return_Status__c. Closed NetSuite statuses map the Case to Closed; agent-managed statuses are preserved otherwise. This flow depends on the customsearch_celigo_sfns_returns saved search.
  • NetSuite Return Authorization Status to Salesforce Return Orders: for returns initiated from Salesforce, this flow writes the NetSuite RA number and status progression, from pending approval to pending receipt to refunded or closed, back onto the originating Return Order.

Enable flows and schedule

First-time enablement sequence

Enable flows in dependency order. Each stage assumes the previous stage completed an initial run without unresolved errors.

  1. Master data: Account, Contact, and Product modules. Run each NetSuite-to-Salesforce flow once for the initial load, then enable the real-time pairs. Verify a sample of records carries the cross-system IDs before moving on.
  2. Transactions: the Opportunity/Order real-time pairs, then order status, line write-back, and financial flows.
  3. Activities and files: task, email, event, attachment, and PDF flows, all of which depend on their parent records being linked.
  4. Optional modules: Quotes, Cases, Contracts, Work Orders, Assets & Returns, Leads, and Contract Renewals, once their feature prerequisites are met.

Initial data load

  • Use each flow's Run now with a start date option for historical loads; scheduled runs after that use delta detection automatically.
  • Expect "sync parents first" errors on the first pass of child-record flows while the parent set is still loading; they resolve on the next run.
  • Flows that update existing records skip unsynced records by design (ignoreMissing).

Troubleshooting

Most integrator.io error messages explain themselves and suggest a fix. The following patterns cover the errors specific to this template.

"Unable to find lookup value..."

Message: Unable to find lookup value for Salesforce <Object> field "Id" given the query conditions "(celigo_sfnsio__NetSuite_Id__c = '...')"

The parent record (account, contact, product, or order) isn't synced yet. This is the standard dependency signal, not a defect. Run the parent module's flow, then retry the errors, or let the next scheduled run pick the records up.

"No such column '...' on entity..."

A required Salesforce custom field is missing, or it is invisible to the integration user. Check the custom-field table first. If the field exists, it is a field-level security problem. Remember the Activity trap: field-level security for NS_TaskId__c must be granted through Task and Event permission entries, since Activity.* entries deploy but are silently ignored by Salesforce.

"Failed to load search... That search or mass update does not exist"

A saved search from step 2 is missing, renamed, or was created under a different script ID. Re-run the Search Creator Suitelet; it reports CREATED for missing searches and a safe duplicate-ID error for existing ones. If you created a search manually, confirm the script ID matches exactly and stays within NetSuite's script ID length limit.

"Please enter value(s) for: ..." (NetSuite mandatory fields)

Field named in the error Fix
Order Type or End User Set the Default Order Type or Default End User setting.
Subsidiary OneWorld account: set the Default Subsidiary internal ID.
Location Set the Default Location internal ID. The location must belong to the transaction customer's subsidiary.
Address (customer save) The Salesforce account has no street address; add one, or relax the NetSuite address requirement.
Posting period errors on dated transactions The transaction date falls outside an open accounting period; open the period or adjust the date.

Real-time flow not firing

  1. Confirm the flow is enabled. Real-time flows only listen while enabled.
  2. On the Salesforce side, open the Real Time Sync tab and check the record for the flow's export: Disabled must be unchecked and Connector ID set. Stale rows from earlier installs can block triggering. Delete rows whose Disabled box is checked, or that duplicate the same object, then disable and re-enable the flow in integrator.io to register a new row.
  3. On the NetSuite side, remember that integration-made writes never trigger a sync loop by design; test with a genuine UI edit, then check Customization > Scripting > Script Execution Logs for the Celigo user event script immediately after your save.
  4. Check qualifiers: the contact trigger requires a company; the sales order flows are gated by the Send SO to Order, Send SO to Opportunity, and Salesforce-origin custom fields; and the account trigger skips records whose Skip Export to NetSuite flag is set. Each real-time flow's sync criteria can be reviewed in its settings.
  5. Confirm the Celigo Apex trigger exists for the object (Setup > Apex Triggers). ContentVersion needs the manually created trigger from step 5.

Records don't sync during testing

If Enable test mode is on in Settings, only Salesforce records with celigo_sfnsio__Test_Mode_Record__c checked sync, and live records are skipped. Turn test mode off before go-live.

File-sync errors

Symptom Cause and fix
SAXException: Invalid type: null on file import The file name reached NetSuite without an extension, and NetSuite derives file type from it. The shipped mapping appends the extension; if you customized the name mapping, preserve {{data.FileExtension}}.
Job succeeds but no file appears The File Cabinet Folder ID setting is blank or points to a folder that does not exist, or a customized blob step no longer produces a blob key. Verify the folder ID first.
Attachment lands but isn't attached to the transaction The parent Opportunity or Order isn't yet linked to a NetSuite sales order; sync the parent first.

Currency and exchange rate errors

  • entity type cannot be inserted: Dated Conversion Rate: Salesforce Advanced Currency Management isn't enabled. Currency types still sync; enable Advanced Currency Management for dated rates.
  • CurrencyIsoCode query errors on pricing flows: the Multi-Currency setting is on but the org is single-currency, or the reverse. Match the setting to your org.
  • duplicate value found: celigo_sfnsio__NetSuite_Line_Id__c: a customized line mapping is using the item internal ID instead of the unique NetSuite line key. Restore the shipped extract.

General debugging

  • Verify content, not just job counts. A completed job with wrong data usually means a mapping references a field the source record no longer carries; inspect a failed or sampled record's retry data to see exactly what reached the import.
  • Change one thing at a time. Fix a mapping, retry the errored records (retry preserves the original data), and confirm the fix before moving to the next error group.
  • Check both systems' audit trails. NetSuite script execution logs and the Salesforce setup audit trail reveal listener-side issues that never reach integrator.io.
  • Errors passed through from Salesforce or NetSuite, such as governor limits, validation rules, or workflow interference, are documented by the respective platform; the integration surfaces them verbatim.

Related articles