At a Glance — NetSuite Shopify Inventory Sync

  • Use quantityAvailable, not quantityOnHand — onHand includes stock already committed to open orders; wrong field causes Shopify oversells within 2–3 days of go-live
  • Real-time sync: Works for <2,000 active SKUs at a single Shopify location; poll every 2–5 min using a lastModifiedDate saved search filter
  • Batch sync: Better for 2,000+ SKUs, multi-location setups, or when data consistency matters more than latency (nightly or twice-daily)
  • Multi-location: Map each NetSuite location ID to a Shopify location ID in a static lookup table — add a lookup-not-found alert so new locations don't silently fail to sync
  • Bundle SKUs: Assembly items in NetSuite don't auto-explode to components — need a custom flow to derive component-level availability for Shopify

Why inventory sync is harder than it looks

The basic version of NetSuite → Shopify inventory sync is straightforward: read inventoryItem.quantityAvailable from NetSuite on a schedule, write it to Shopify's inventory_levels endpoint per location. Celigo's native connector covers that case with minimal custom logic.

The hard version — which is what most mid-sized businesses actually have — involves multiple NetSuite subsidiary locations, Shopify markets with different fulfilment sources, bundle SKUs that don't exist as discrete items in NetSuite, and the question of what "available" actually means when you have open sales orders, drop-ship POs, and a 3PL in the mix.

This article covers the decisions you need to make before you configure the flow, not after.

Decide what "available" means first

NetSuite exposes several quantity fields per item per location:

Most teams default to quantityAvailable and that is usually right. But if you fulfil from one warehouse while purchasing into another, you may want to aggregate across locations before writing to Shopify — in which case you need a SavedSearch that sums across location IDs, not a direct item lookup.

Common mistake

Using quantityOnHand instead of quantityAvailable means Shopify will show stock that is already committed to other orders. This usually surfaces as oversells within two to three days of going live.

Batch vs real-time: the honest trade-off

Celigo supports both scheduled and real-time (webhook-triggered) flows. For inventory sync the decision is not about preference — it is about volume and error tolerance.

Real-time works when your NetSuite item count is low (under roughly 2,000 active SKUs), your Shopify store is a single location, and you can accept the additional API call load. You set up a NetSuite saved search with a lastModifiedDate filter, poll every two to five minutes, and push delta changes to Shopify.

Batch works when you have high SKU counts, multiple locations, or when your team cares more about data consistency than latency. A nightly or twice-daily full sync is easier to debug and easier to test.

NetSuite saved search filter — delta sync SuiteScript expression
criteria.addFilter({
  name: 'lastmodifieddate',
  operator: 'onOrAfter',
  values: ['{lastRunDate}']
});

Multi-location mapping

If Shopify has multiple locations you need to map each NetSuite location ID to a Shopify location ID. Celigo handles this in the import's field mapping step using a static lookup table or a handlebar expression that reads from a reference dataset.

The main failure mode here is when a new NetSuite location is added and no one updates the mapping. The flow continues running silently and the new location's inventory never reaches Shopify. Build a lookup not found alert on the mapping step to catch this before it causes a problem.

Bundle SKUs and assembly items

If you sell bundles in Shopify that correspond to Assembly Items or Kit Items in NetSuite, the inventory calculation is not a direct field read. Options:


What to build first

Our recommended sequence: start with a batch full sync on a six-hour schedule for all simple items (no bundles, single location). Validate the data matches in both systems. Then layer in delta sync for high-velocity SKUs. Then tackle bundles as a separate flow that reads component quantities from a saved search.

If you try to solve everything in one flow on day one, you will spend three weeks debugging edge cases that affect 3% of your catalogue while 97% of your inventory is just fine.

Work with us

We have built this flow for several Shopify + NetSuite clients. If you want to walk through your specific catalogue structure before configuring anything, get in touch at [email protected] — it is usually a 20-minute conversation.

Frequently asked questions

How does NetSuite Shopify inventory sync work with Celigo? Celigo's NetSuite Shopify Integration App syncs inventory from NetSuite to Shopify by pushing the available quantity for each SKU on a scheduled basis (typically every 15–60 minutes) or in near-real-time via event-triggered flows. The sync maps NetSuite item records to Shopify product variants using SKU as the linking field. You configure which NetSuite quantity field to use as the Shopify inventory source — Quantity Available, Quantity On Hand, or a custom calculated field — and which Shopify location(s) to update.

Should I use real-time or batch sync for NetSuite to Shopify inventory? For most merchants, scheduled batch sync every 15–30 minutes is the right choice. Real-time sync via NetSuite Saved Search triggers adds complexity (requires a persistent polling mechanism or webhook from NetSuite) and is rarely necessary unless you operate with very low safety stock and sell high-velocity items where a 15-minute lag would cause oversells. Batch sync is simpler to configure, easier to monitor, and sufficient for most D2C and wholesale operations. Real-time makes sense for flash sales, limited-edition drops, or perishable inventory.

What is the best NetSuite quantity field to sync to Shopify? The right field depends on your business model. Most teams use Quantity Available (On Hand minus committed) because it reflects what you can actually sell. Quantity On Hand includes items already committed to open orders — using it can cause oversells. Some teams create a custom NetSuite formula field that applies a safety stock buffer (e.g., Quantity Available minus 5 units) before pushing to Shopify, which prevents the last few units from selling out online before they can be picked. Agree on this definition before configuration begins — changing it post-launch requires re-mapping the flow.

How does multi-location inventory work in a NetSuite Shopify integration? If you have multiple NetSuite locations (warehouse A, warehouse B, 3PL, etc.) and want Shopify to show a combined available quantity, the integration needs to aggregate quantities across locations before pushing. Celigo handles this through a formula in the mapping layer — summing specific location quantities rather than using the NetSuite total, which may include locations you don't want to fulfill from (a showroom, a returns location, etc.). If you use Shopify Markets or multiple Shopify locations, you also need to decide which NetSuite location maps to which Shopify location.

How do bundle SKUs work in NetSuite Shopify inventory sync? Bundle SKUs (Shopify bundles or NetSuite Kit/Assembly items) require special handling. Shopify doesn't natively support inventory tracking at the bundle level — it tracks inventory on the component SKUs. If you sell a bundle on Shopify but track components in NetSuite, the integration needs to calculate the bundle's available quantity as the minimum available across all components (i.e., how many complete bundles you can assemble). This is custom logic that the standard Celigo connector doesn't handle out of the box — it requires a custom NetSuite Saved Search or a transformation formula in the integration.

What is the typical setup time for NetSuite Shopify inventory sync? Inventory sync alone (single location, no bundles) can be configured and tested in 1–3 weeks as part of a broader NetSuite Shopify integration. If inventory sync is part of a full build including orders, fulfillment, and returns, the total project timeline is 4–8 weeks. Multi-location and bundle SKU complexity adds 2–4 weeks. Celigo's prebuilt Integration App covers the standard flow out of the box; custom logic for location aggregation or bundle SKUs adds scope.