Inventory Sync Direction at a Glance
- One-way (NetSuite to store) is safer, simpler, and right for 80% of teams.
- Two-way requires every field to have a single declared owner — no exceptions.
- Start one-way for 90 days, then promote individual fields as ownership stabilises.
- Build the 3-number reconciliation report on day one regardless of direction.
Most integration questions sound like product questions but are really direction questions. The first decision on any WooCommerce-NetSuite or Shopify-NetSuite project is not which fields to sync — it is which way the data flows. Get that wrong and you will spend the next year writing reconciliation scripts.
This guide is part of the broader WooCommerce store-operations guide library — the field-ownership pattern below governs pricing and tax data too, not just inventory.
One-Way: NetSuite Is the Source of Truth
NetSuite owns every item field in one-way sync — inventory levels, prices, item descriptions — and the store only reads them on a schedule. The store never writes back to the item record. Orders flow the other direction: the store creates a sales order in NetSuite, and that outbound write is the store’s only write.
Use one-way when you have:
A single warehouse, a small SKU count (under 5,000), and an operations team that already lives inside NetSuite. It is also the right default for any new integration project.
One-way pitfall to watch:
Onboarding new SKUs is slow because everything must round-trip through NetSuite first. A staff member who creates a WooCommerce product directly without a corresponding NetSuite item will cause sync errors on the next run.
Two-Way: Both Systems Are Partial Sources of Truth
Two-way sync does not mean both systems can write everything — it means each field has exactly one owner, and the owners are split across the two systems by field, not by record. Prices in NetSuite. Marketing content (descriptions, images, categories) in the store. Inventory in NetSuite, but with a reservation that flows back from the store on order placement.
| Field | One-Way Owner | Two-Way Typical Owner | Risk if split |
|---|---|---|---|
| Price | NetSuite | NetSuite | Store override leads to wrong charges |
| Stock level | NetSuite | NetSuite (decrements from store) | Oversells on concurrent orders |
| Product description | NetSuite | Store (marketing owns this) | NetSuite clobbers SEO copy |
| Images | NetSuite or store | Store | Low — images rarely conflict |
| Customer record | Created in store, read-only in NetSuite | Both systems can create | Duplicate accounts, split order history |
| Order status | NetSuite updates store on ship | NetSuite updates store on fulfilment events | Store status diverges from NetSuite |
The two-way failure mode:
If your CSV importer in the store can overwrite a price, you have a bug, not an integration. Two-way sync requires field-level locks. If you cannot enforce them, run one-way.
The two places field ownership breaks in practice are not exotic edge cases — they are the same two bugs every one-way integration inherits the moment a field flips to two-way, and direction alone does not fix either one. The next two sections name them precisely.
The On-Hand vs Available Trap That Exists in Both Directions
Sync direction does not fix the single most common oversell bug: syncing Quantity On Hand to the storefront instead of Quantity Available. NetSuite’s own documentation defines Quantity On Hand as everything currently stocked, including quantity already committed to open sales orders, while Quantity Available is On Hand minus that committed quantity — and Available is the only number safe to show a shopper.
A one-way sync that reads the wrong field oversells exactly as often as a two-way sync that writes the wrong field. Direction is not the variable that matters here; field selection is. The symptom shows up first during a traffic spike, which is why sync cadence gets blamed when the field mapping is the actual bug.
Duplicate Orders Are a Retry Bug, Not a Direction Bug
The second failure mode that survives any direction choice is the duplicate sales order created when a client retries an order-create call that timed out but actually succeeded server-side. Neither one-way nor two-way sync prevents this by itself — only an idempotency key does.
NetSuite’s REST web services support this natively: writing an externalId on every order create and using the upsert operation makes a retried request update the existing record instead of creating a second one. Treat a timeout as an unknown outcome and query before you retry — never retry blind.
This is one of the seven recurring failure patterns we track across NetSuite-WooCommerce integrations, and it is typically the first one a new integration hits. Direction decides who owns a field; it never decides whether a retry is safe.
Two-Way’s Real Cost Is Concurrency, Not Just Field Locks
Two-way sync usually means more frequent, smaller writes in both directions, and every one of those writes counts against the same account-wide concurrency pool as everything else touching NetSuite. According to NetSuite’s own documentation, a Standard-tier account gets only 5 concurrent web-services and RESTlet requests account-wide; Premium gets 15, Enterprise and Ultimate get 20, and each SuiteCloud Plus license adds 10 more.
A near-real-time two-way sync that opens one connection per order change exhausts a Standard account at six simultaneous writes — before counting the RESTlets your ERP team, your customer portal, and your reporting saved searches also share that pool with. The failure mode and the retry pattern that survives it are covered in the rate-limiting guide. Batching writes, not opening a connection per record, is what makes two-way sync survive a flash sale on a Standard-tier account.
The Decision in One Paragraph
If you can list every synced field by name and say “this owner, that owner” without hedging, you are ready for two-way. If you cannot, run one-way for ninety days, watch what your team actually edits where, and then promote individual fields to two-way as ownership stabilises. Two-way is not a product feature — it is an organisational commitment. Treat it like one.
The test applies per field, not per integration — a store can run price and inventory one-way from NetSuite while marketing content is already two-way with the store as owner, as long as each field individually passes the test above. The checklist below turns that per-field test into a sequence you can run today.
Promoting a Field from One-Way to Two-Way
Promoting a field is a five-step sequence, not a settings toggle. Skipping a step is what turns “we went two-way on descriptions” into a support ticket about NetSuite clobbering marketing copy.
- Name the field’s single owner in writing and confirm no other system or import path can write it.
- Add a field-level lock or validation rule in the non-owning system so an accidental write fails loudly instead of syncing silently.
- Run the promoted field in parallel for one full order cycle, comparing the old one-way value against the new two-way value daily.
- Add the field to the daily reconciliation report so drift on this specific field surfaces within 24 hours, not at quarter close.
- Document the rollback: which value wins, and how to flip the field back to one-way if the promotion causes more conflicts than it resolves.
None of these steps are optional shortcuts. Each one is the direct fix for one of the failure modes covered above: unclear ownership, silent overwrites, and undetected drift.
The Reconciliation Report You Will Want Anyway
Whichever direction you pick, build this report on day one: a daily diff of item count, total on-hand inventory, and total open order value between the two systems.
Pull total active item count, sum of on-hand quantity, and total open SO value via SuiteQL.
Pull the same three numbers from WooCommerce or Shopify via REST API.
If any value differs beyond your defined tolerance, send an alert immediately. Do not wait for end-of-day reporting.
Write each comparison to a custom NetSuite record for an audit trail. 90 days of history catches slow-drift issues that single-day alerts miss.
That single three-number report has caught more integration bugs than any monitoring tool. It costs under an hour to build and saves a week of incident response during quarter close. It also tends to be the first signal that a webhook went quiet days ago — WooCommerce disables a webhook after enough consecutive failed deliveries, silently, with no dashboard warning.
Most teams should start one-way — we built for exactly that
NetSuite Integration Basic syncs items, prices, and inventory one-way with a built-in reconcile UI — the same three-number check this guide recommends, without hand-rolling the SuiteQL and REST calls yourself.
What Breaks at Multi-Warehouse or Multi-Channel Scale
Direction and field ownership both get harder once inventory is split across warehouses or channels — not because the rules change, but because more processes can write the same field.
Selling through Amazon FBA on top of NetSuite and WooCommerce adds a third source of on-hand changes that has to write through the same single owner NetSuite already holds for inventory — FBA inventory sync is a one-way pattern with an extra reader, not a new direction.
OneWorld accounts add a second axis: which subsidiary owns the transaction, not just which system owns the field. Get the subsidiary mapping wrong and the direction decision above stops mattering — the order posts to the wrong entity regardless of which way inventory flows.
References
- NetSuite Help: Item Record Header FieldsOracle NetSuite Documentation — standard item record header fields referenced throughout this guide.
- WooCommerce REST API DocumentationWooCommerce.com — REST endpoints for product and order data used in reconciliation queries.
- Shopify Admin API: InventoryLevel Resource (2026-07)Shopify Developers — inventory level endpoint for multi-location reconciliation; the REST Admin API is a legacy surface as of October 2024, still supported for existing private/custom apps.
- NetSuite Help: SuiteQL Syntax and ExamplesOracle NetSuite Documentation — SuiteQL syntax reference for building reconciliation queries against transaction and item records.
- NetSuite Help: Assessing Stock LevelsOracle NetSuite Documentation — defines Quantity On Hand, Quantity Available, and Quantity Committed.
- NetSuite Help: External IDs OverviewOracle NetSuite Documentation — external ID and upsert pattern for preventing duplicate records on retry.
- NetSuite Help: Concurrency Governance Limits Based on Service TiersOracle NetSuite Documentation — account-wide concurrent request limits by service tier and SuiteCloud Plus license.
Get the working checklists
The runbooks and decision checklists from these guides, as printable PDFs — free in the SoftXone guide library.
Frequently asked questions
When is one-way inventory sync the right choice?
When NetSuite is genuinely the single source of truth for prices and stock, and your team already works inside NetSuite rather than editing the storefront directly. It is the safer default for any new integration, not just a fallback — most teams should start here and only promote individual fields to two-way once they can name each field’s owner without hedging.
Why is two-way sync riskier than it looks?
Because both systems become partial sources of truth at once, and every field without an explicit, enforced owner becomes a race condition. A store CSV importer that can still overwrite a NetSuite-owned price is not an edge case — it is the default failure mode until you add a field-level lock that rejects the write instead of silently accepting it.
Do I still need a reconciliation report?
Yes, in either direction. A scheduled diff of item count, on-hand inventory, and open order value catches drift neither system reports on its own, including the on-hand-vs-available mix-up and the duplicate-order bug covered above — both happen regardless of sync direction, and neither system flags them by itself.
Does syncing inventory two-way fix overselling?
No. Overselling is usually caused by syncing Quantity On Hand instead of Quantity Available, and that mistake is just as easy to make in a two-way integration as a one-way one. Fixing which field you sync matters more than fixing the direction — check NetSuite’s own definitions of on-hand versus available stock for the exact distinction.
Can I run one direction for some fields and the other for others?
Yes — this is normal, not a compromise. Price and inventory commonly stay one-way from NetSuite while marketing content like descriptions and images runs two-way with the store as owner, because different fields have different natural owners. Apply the ownership test per field, not once for the whole integration, and promote fields individually as each one’s ownership stabilizes.
