Connect Shopify to NetSuite
Push paid Shopify orders into NetSuite as sales orders, matching shoppers to customers and line items to items, hold high-risk orders for review before they post, and send fulfillment status and inventory levels back to the store. Every order is an ordered run you can inspect and replay.
Why teams connect Shopify and NetSuite
The store runs in Shopify, the business runs in NetSuite, and between them sits a person exporting orders to a CSV each morning, or a rigid connector that drops an order when a SKU is missing. Order volume grows and the gap turns into backlog and mis-shipments.
- Paid orders become NetSuite sales orders on the next poll, so fulfillment and invoicing start the same day
- Shoppers are matched to customers on email and an external ID, and a missing item holds the order for review instead of dropping it
- High-risk orders, flagged by Shopify's fraud analysis, pause for a human before they ever reach finance
- Fulfillment, tracking, and inventory levels flow back, so the storefront shows the truth and support stops guessing
Worked example
The order-to-cash flow most stores turn on first.
Paid Shopify order to a NetSuite Sales Order, with a fraud hold and a SKU guard
Triggered when an order is paid, with two branches that keep bad data out of NetSuite.
- Trigger: Shopify
orders/paidwebhook, carrying the order, line items, customer, and addresses. - Risk check: read the order's fraud risk. If the recommendation is
cancelorinvestigate, post to#order-reviewwith the order link and stop until a human releases it. - Resolve customer: upsert NetSuite
Customerkeyed onexternalId = shopify_customer_id, from the mapping below. - Resolve items: for each line, match NetSuite
Itembyline.sku → itemId. If any SKU does not match, hold the whole order in the review queue rather than creating a partial order. - Create order: NetSuite
Create recordonSalesOrder, keyed onexternalId = shopify_order_id, adding a shipping line and a discount line from the order totals. - Write back: write the NetSuite internal ID to a Shopify order metafield
custom.netsuite_so_id. - Ongoing: a second flow listens for NetSuite
ItemFulfillmentand creates the Shopify fulfillment with the tracking number, and a scheduled flow pushes inventory levels from NetSuite to the Shopify location.
Field mapping
The starting map for the Shopify order to NetSuite Sales Order step.
| Shopify | NetSuite | Notes |
|---|---|---|
order.id | SalesOrder.externalId | Idempotency key. A redelivered webhook updates the order, not a second one. |
customer.id | Customer.externalId | Match key. Creates the customer if missing. |
customer.email | Customer.email | Secondary match when the customer ID is absent (guest checkout). |
order.created_at | SalesOrder.tranDate | ISO 8601 with timezone. Converted to the NetSuite account timezone. |
order.currency | SalesOrder.currency | Fails the run if the currency is not set up in NetSuite. |
line_items[].sku | SalesOrder.item.item | Resolved to internal item ID. A miss holds the order. |
line_items[].quantity | SalesOrder.item.quantity | Line level. |
line_items[].price | SalesOrder.item.rate | Override, so NetSuite price rules do not restate the charged price. Amounts are strings in Shopify; cast to number. |
total_shipping_price_set | SalesOrder.item (shipping item) | Added as a non-inventory line, not the header shipping cost field. |
total_discounts | SalesOrder.discountItem | Single order-level discount line. Line-level discounts are pre-applied to rate. |
order.name | SalesOrder.otherRefNum | The #1001 style store order number, for support lookups. |
What syncs, each direction
- Orders and customers. Paid orders become sales orders. New shoppers become customers. Refunds create credit memos against the original order. (Shopify to NetSuite)
- Fulfillment and tracking. An item fulfillment in NetSuite creates the Shopify fulfillment with the carrier and tracking number, which notifies the shopper. (NetSuite to Shopify)
- Inventory levels. Available quantity per item is pushed to the matching Shopify location on a schedule, so the storefront does not oversell. (NetSuite to Shopify)
- Products and pricing. New items and price changes keep the Shopify catalog and the NetSuite item list aligned, with one system set as the source of truth. (Either direction)
Governance and audit
The same controls apply to this sync as to every other Neblex workload.
- Ordered run log. Every order is an event log with the payload, the customer and item resolution, and the sales order it created. Replay a run without re-charging or re-fulfilling.
- Approval and holds. High-risk orders and orders with unmapped SKUs pause in a review queue. A person releases or rejects each one.
- Scoped access. Shopify uses an admin API token with only the order and inventory scopes. NetSuite uses a role limited to sales orders, customers, and items.
- Environments. Build against a Shopify development store and a NetSuite sandbox, then promote the same flow to production.
Frequently asked questions
Is the order sync prompt or batched?
Close to it. The order-to-cash flow runs off Shopify's orders/paid webhook pointed at a Neblex endpoint and creates the sales order when the webhook arrives. Inventory push runs on a short schedule instead.
What happens to an order with a SKU that is not in NetSuite?
The whole order holds in a review queue with the unmapped SKU named, rather than creating a partial sales order. Add the item mapping and release it, and the flow resumes.
How are duplicate orders prevented?
The sales order is keyed on the Shopify order ID as an external ID. A redelivered webhook updates the existing order rather than creating a second one.
How are refunds handled?
A Shopify refund creates a NetSuite credit memo against the original sales order, with the refunded lines and any restock reflected.
Does anything get installed in NetSuite?
No. The connector uses NetSuite's SOAP and REST web services. No SuiteScript or bundle is deployed.
Can we run more than one store into one NetSuite account?
Yes. Each store is its own connection, and a subsidiary or a class can be set per store on the sales order.
Connectors on this page
Shopify
Finance & Commerce
- Operations
- 367
- Typed outputs
- 100%
- Change triggers
- Poll or inbound webhook
- Authentication
- None
NetSuite
Applications
- Operations
- 271
- Typed outputs
- 0%
- Change triggers
- 1 (poll)
- Authentication
- ConnectionString
NetSuite does not publish typed output schemas yet, so the field mapping on this page is configured in the flow rather than pre-verified.
Bring one real integration
We will build it with you against your own systems, with the run log open.