Shopify + NetSuite Integration
Items, inventory, and pricing flow from NetSuite to Shopify. Orders land as sales orders with the right subsidiary, location, and tax nexus. NetSuite remains the financial record; Shopify never posts journals.
- mode:
- Bidirectional
- latency:
- Near real-time
- maturity:
- Production-tested
what syncs
What syncs, which way, and how fast
Every row is a real data flow with a real trigger. The frequency column is what you should expect in production, not a best case.
Items
- dir:
- NetSuite → Shopify
- frequency:
- Every 15 min
Internal id is the join key, not the display SKU. Matrix items map to Shopify variants, which is where most catalogue mismatches originate.
Inventory
- dir:
- NetSuite → Shopify
- frequency:
- Every 5 min
Available per location, honouring commitment rules. Multi-location needs an explicit location-to-location map before go-live.
Pricing
- dir:
- NetSuite → Shopify
- frequency:
- Every 15 min
Base price level to Shopify. Customer-specific price levels resolve at checkout for B2B rather than being pushed as variants.
Orders
- dir:
- Shopify → NetSuite
- frequency:
- Near real-time
Sales order with subsidiary, department, and class derived from the sales channel. Getting this wrong makes finance reporting unusable.
Customers
- dir:
- Bidirectional
- frequency:
- Near real-time
B2C to a generic web customer, B2B to real customer records with terms. Dedupes on email plus subsidiary.
Fulfillment
- dir:
- NetSuite → Shopify
- frequency:
- Near real-time
Item fulfillment closes the Shopify fulfillment and pushes tracking. Partial fulfillments create separate Shopify records per shipment.
architecture
How it actually works
NetSuite is cloud-native with a real API, so the constraint is not connectivity but governance: SuiteScript units and concurrency limits shape every design decision.
Shopify webhooks + queue
Order and fulfillment events queue before touching NetSuite, so a governance-throttled RESTlet never causes webhook failures on the Shopify side.
Connector or custom middleware
Celigo and Boomi have mature prebuilt Shopify NetSuite flows worth their licence for standard requirements. Custom middleware wins when your NetSuite is heavily customised or the licence cost exceeds the build.
RESTlet or SuiteTalk
RESTlets for bespoke logic that must run inside NetSuite; SuiteTalk REST for standard record CRUD. We avoid SOAP on new builds.
Saved searches for reads
Inventory and price reads come from saved searches rather than record-by-record gets. This is the difference between a sync that fits in governance and one that dies at 10am daily.
Governance-aware scheduler
Batch sizes tuned to usage units with concurrency held below your account limit, so integration traffic never starves the users actually working in NetSuite.
failure modes
What breaks, and what happens when it does
Every integration fails eventually. The difference between a good one and a bad one is whether it fails safely and tells you.
SuiteScript governance limits
The sync works in testing, then fails every morning once real order volume arrives.
handling
Usage units are budgeted per script execution, reads move to saved searches, and long jobs yield and reschedule instead of dying mid-run. Governance is a design constraint from day one, not a tuning exercise after launch.
Concurrency limit contention
NetSuite users complain the UI has become slow, and the integration blames NetSuite.
handling
Concurrency is capped below the account limit and heavy batch work is scheduled outside business hours, leaving headroom for humans. Your integration should never be the reason finance cannot close a period.
Matrix item and variant mismatch
Some variants never appear in Shopify, or appear without options.
handling
Parent and child matrix items map explicitly to Shopify products and variants, keyed on internal id. Unmapped combinations go to a reconciliation report rather than being auto-created with guessed options.
Tax nexus and subsidiary errors
Orders post to the wrong subsidiary and the tax figures fail audit.
handling
Subsidiary, nexus, and tax code are resolved from the Shopify sales channel and ship-to before order creation. Shopify tax is passed through rather than recalculated, then reconciled at line level.
Multi-location commitment rules
Shopify shows stock that NetSuite has already committed elsewhere.
handling
We sync available-after-commitment rather than on-hand, with location mapping agreed up front. On thin-margin fast movers a buffer is applied instead of claiming a polling sync can eliminate oversells.
Partial fulfillments across locations
A split shipment sends one notification with the wrong tracking number.
handling
Each item fulfillment becomes its own Shopify fulfillment scoped to those line items, so each parcel triggers its own accurate notification and the remaining lines stay open.
field mapping
A real slice of the mapping
This is an abridged Order → NetSuite SalesOrder mapping, shown so you can sanity-check it against your own system.
Order → NetSuite SalesOrder
shopify → netsuite
order.namesalesorder.otherrefnumCustomer PO field
order.idsalesorder.custbody_shopify_idCustom body field
line_item.skuitem.internalidResolved via lookup
line_item.quantityitem.quantityline_item.priceitem.ratesales_channelsalesorder.departmenttotal_taxsalesorder.taxtotalPassed through
shipping_line.titlesalesorder.shipmethod
Assumes a reasonably standard NetSuite. Custom body fields, approval routing, and multi-subsidiary logic are scoped in the audit.
implementation
Timeline and cost
typical duration
8 to 14 weeks
included in scope
- Discovery, data model, and field mapping document
- Six objects bidirectional with governance-safe batching
- Subsidiary, department, and tax nexus logic
- Queue, retry, dead-letter, and monitoring
- UAT against a NetSuite sandbox with production data
- Three weeks of hypercare and a handover runbook
what moves it up
- Multiple subsidiaries or OneWorld consolidation
- Heavily customised NetSuite with bespoke workflows
- B2B customer-specific price levels and approvals
- Historical migration of orders and customers
- Advanced inventory, kits, assemblies, or drop-ship flows
questions
Questions buyers actually ask
Should we use Celigo, Boomi, or a custom NetSuite integration?
Use a connector like Celigo or Boomi when your NetSuite is close to standard and your flows are conventional: the prebuilt flows are mature and the licence is cheaper than a build. Go custom when NetSuite is heavily customised, when you need logic the connector cannot express, or when annual licence cost exceeds a one-off build. We recommend against custom purely to have custom.
What are SuiteScript governance limits and why do they matter?
NetSuite charges every script execution in usage units and caps concurrent API connections per account. Exceed either and your sync fails or throttles, typically once real volume arrives rather than during testing. The practical consequences are batching reads through saved searches and capping concurrency below the account limit so NetSuite users keep their headroom.
How does inventory sync handle multiple locations?
Each Shopify location maps explicitly to one NetSuite location, and we sync availability after commitment rather than raw on-hand so committed stock is never offered twice. That mapping has to be agreed before build because changing it afterwards means re-syncing the entire catalogue.
Can Shopify orders post to the correct subsidiary automatically?
Yes. Subsidiary, department, and class are derived from the Shopify sales channel and ship-to address before the sales order is created. This is worth getting right early: misrouted subsidiaries make consolidated reporting unusable and are painful to correct retroactively.
Do you write to the NetSuite general ledger?
No. We create sales orders, customers, and fulfillments, then let your existing NetSuite posting rules handle the GL just as they do for any other channel. Finance keeps one auditable posting path, which is what auditors expect to see.
How long does a Shopify NetSuite integration really take?
Eight to fourteen weeks for a full bidirectional build, and most of that is not coding. Data mapping, cleaning existing item records, and UAT against a sandbox dominate the timeline. Projects that claim three weeks are usually syncing orders one way and leaving inventory and pricing manual.
shopify + netsuite
Get a NetSuite scope with governance costed in
Send your NetSuite edition, subsidiary count, and monthly order volume. You get an architecture recommendation and a fixed price, including whether a connector beats a custom build.