NetSuite Integration Help
How to connect your Shopify store to Oracle NetSuite and set up each sync. Labels match the ones you see in the app. Pick a topic below, or press / to search.
Overview
NetSuite Integration connects one Shopify store to one NetSuite account. Each kind of record syncs in a set direction, and every sync can be switched on or off on its own settings page.
| Record | Direction | When it runs | What is created |
|---|---|---|---|
| Orders | Shopify → NetSuite | When an order is created or updated in Shopify | Sales Order (default), Cash Sale, or Invoice for POS orders. Optional Customer Deposit, and an Invoice or Cash Sale created from the Sales Order. |
| Fulfillments | Either direction (you choose one) | NetSuite → Shopify: hourly, or on demand. Shopify → NetSuite: when the Shopify order is fulfilled. | Shopify fulfillments with tracking, or NetSuite Item Fulfillments. |
| Refunds | Both directions | Shopify → NetSuite: when a refund is created in Shopify. NetSuite → Shopify: hourly. | Cash Refund, or Return Authorization with Item Receipt and Cash Refund; Shopify refunds from refunded Return Authorizations. |
| Customers | Both directions | Shopify → NetSuite: when a customer is updated and with every order. NetSuite → Shopify: automatically on the app's schedule while import is on, or when you click Import Customers. | NetSuite Customers (individual or company) and Contacts; new Shopify customers. |
| Companies (B2B) | NetSuite → Shopify | With the customer import | Shopify B2B companies with their contacts, optionally assigned to a catalog. |
| Products | NetSuite → Shopify | Automatically on a schedule, or when you click Import Product / Test Sync | New Shopify products and variants; optional updates to existing ones. Enterprise |
| Inventory & prices | NetSuite → Shopify | Every few hours, or when you click Process Inventory Sync | Shopify stock levels per location and variant prices; market and company catalog prices on Enterprise. |
| Purchase orders | Shopify → NetSuite | When an order is created or updated in Shopify and matches your condition | NetSuite Purchase Order instead of a Sales Order. |
Items are matched between the two systems by the SKU Mapping Field you choose during setup (for example the NetSuite Item Name/Number matched to the Shopify SKU). Prices come from the NetSuite Price Level you choose. Get these two right first, because orders, inventory, prices and products all depend on them.
Before you start
The app signs in to NetSuite with Token-Based Authentication (TBA). You need a NetSuite administrator to prepare five things. Do this in a sandbox account first if you have one.
1. Enable NetSuite features
- In NetSuite, go to Setup > Company > Enable Features and open the SuiteCloud subtab.
- Under SuiteTalk (Web Services), check SOAP Web Services and REST Web Services. The app writes records through SOAP and reads data through REST (SuiteQL queries), so both are needed.
- Under Manage Authentication, check Token-Based Authentication.
- Click Save and accept the terms if NetSuite asks.
2. Create a role for the integration
Create a dedicated role (Setup > Users/Roles > Manage Roles > New) and assign it to the user who will own the token. Using a dedicated role, not Administrator, keeps access limited to what the integration needs.
| Permission tab | Grant |
|---|---|
| Setup | Log in using Access Tokens, SOAP Web Services, REST Web Services. Add User Access Tokens if this user will create their own token. |
| Transactions | The records you plan to sync: Sales Order, Cash Sale, Invoice, Customer Deposit, Customer Payment, Item Fulfillment, Return Authorization, Item Receipt, Cash Refund, Purchase Order. Full level for records the app creates. |
| Lists | Customers, Contacts, Items, Locations, Currency, Price Levels / Pricing, Tax records, Promotions (if you sync discounts as promotion codes), Documents and Files (if you sync product images). |
If you add a feature later (for example refunds or fulfillments), check that the role can read and create the matching NetSuite records. Also give the role access to the subsidiaries, locations and custom fields your orders use.
3. Create an integration record
- Go to Setup > Integration > Manage Integrations > New.
- Enter a name such as Shopify NetSuite Integration and set the state to Enabled.
- Under Authentication, check Token-Based Authentication.
- Save. NetSuite shows the Consumer Key / Client ID and Consumer Secret / Client Secret once. Copy them somewhere safe.
4. Create an access token
- Go to Setup > Users/Roles > Access Tokens > New.
- Choose the integration record from step 3, the user, and the role from step 2.
- Save. NetSuite shows the Token ID and Token Secret once. Copy them.
5. Find your Account ID and API endpoint
- Go to Setup > Company > Company Information.
- Copy the Account ID. A production account looks like
1234567; a sandbox looks like1234567_SB1. - Open the Company URLs subtab and copy the value of SUITETALK (SOAP AND REST WEB SERVICES), for example
https://1234567-sb1.suitetalk.api.netsuite.com. This is the app's API Endpoint.
Copy the Account ID exactly as NetSuite shows it, including the _SB1 suffix for a sandbox, and copy the API endpoint from the same account. Mixing a sandbox ID with a production URL (or the other way round) fails the connection test.
Install and connect
- Install NetSuite Integration from the Shopify App Store and approve the requested permissions.
- Choose a plan on the Plans page (see Plans & billing) and approve the charge in Shopify.
- Open Configurations. The setup guide has three steps: NetSuite API Connection, General Configuration and Ready To GO! A progress bar at the top shows how many of the three are complete. Each step opens once the step before it is done.
Once all three steps are complete, opening the app takes you straight to the Dashboard. You can come back to these steps at any time from Configurations.
Step 1: NetSuite API Connection
This step connects your store to one NetSuite account using token-based authentication. Create the integration record and access token first (see Before you start), then copy the values into the form. Hover the ? icon next to each field in the app for where to find the value in NetSuite.
| Setting | How it works | Default |
|---|---|---|
| API Endpoint | The web services address of your NetSuite account. In NetSuite go to Setup > Company > Company Information, open the Company URLs subtab and copy the SuiteTalk (SOAP and REST Web Services) URL. It must be a full URL starting with https://. Required. | Empty |
| Account ID | Your NetSuite account ID from Setup > Company > Company Information, for example 1234567 for production or 1234567_SB1 for a sandbox. Enter it exactly as NetSuite shows it. Required. | Empty |
| Consumer Key / Client ID | Shown once when you save the integration record (Setup > Integrations > Manage Integrations > New). Required. | Empty |
| Consumer Secret / Client Secret | Shown together with the Consumer Key. The field is masked. Required. | Empty |
| Token ID | Shown once when you create the access token for the integration, user and role. Give the role the recommended permissions (see the NetSuite role). Required. | Empty |
| Token Secret | Shown together with the Token ID. The field is masked. Required. | Empty |
| Notification Email | The address that receives an email when an order fails to sync to NetSuite. The email names the Shopify order and the error. Use a shared inbox your team watches. Optional. You can stop these emails with Disable Order Notifications in the Order additional settings (see Orders). | Not set: failure emails go to your Shopify store's contact email |
Click Establish Connection. The app saves the values and tests them against NetSuite straight away. On success the step shows NetSuite Account is Connected, the app loads your NetSuite price levels, and Step 2 opens. If the test fails, the step shows Invalid Login Credentials; check the values against Common setup mistakes and try again.
Each time you click Establish Connection, the SKU Mapping Field in Step 2 goes back to its default (Item Name/Number) and the Price level toggle under the Order line item settings is switched off. This keeps old matching rules from being used against a different NetSuite account. After saving the connection, open Step 2 and the Order line item settings and set them again.
How the app checks the connection
The app tests the connection again every time you open the Dashboard or Configurations, and when you open the Orders, Customers, Products, Inventory or Purchase Orders pages. If NetSuite rejects the saved credentials (for example, the token was revoked or the role changed), the app sends you back to Configurations with a Connection Error banner: Please provide valid NetSuite credentials. Fix the values in Step 1 and click Establish Connection again.
Switching from a sandbox to production (or to another NetSuite account) is done here: enter the other account's values in Step 1, then redo Step 2 and use Clear Temporary Cache in Step 3.
Step 2: General Configuration
This step tells the app how to match Shopify products to NetSuite items and which NetSuite price level to use. Both choices are shared by inventory, price, product and order sync, so set them before you configure anything else. The app's settings pages become available once this step is saved.
| Setting | How it works | Default |
|---|---|---|
| SKU Mapping Field | The NetSuite item field that holds the same value as your Shopify variant SKU. The app looks up items by this field for price, inventory and order sync. Options:
| Item Name/Number |
| Price Level Name | The NetSuite price level used for your website prices. The list shows the active price levels in your NetSuite account, for example Base Price or Online Price. Price sync sends this price level to Shopify, and order sync uses it on order lines when the Price level toggle is on in the Order line item settings (see Orders). Required: you cannot save this step without it. | Not set: must be chosen to finish setup |
Click Save Changes. If the price level list is empty, check that the connection in Step 1 is working and that the role can see price levels.
Step 3: Ready To GO!
The final step confirms the connection and links to the Dashboard (sync history), Inventory Settings, Customer Settings and Order Settings. It also has Clear Temporary Cache.
The app keeps a record of which Shopify customers and products it has already matched to NetSuite records, so later syncs don't have to search NetSuite again. Clearing the cache removes those saved matches. It does not delete anything in Shopify or NetSuite. On the next sync the app searches NetSuite again and saves new matches.
| Setting | How it works | Default |
|---|---|---|
| Clear Customer Data | Removes the saved links between your Shopify customers and NetSuite customer records. The next time a customer or their order syncs, the app searches NetSuite again (using your customer search settings) and links or creates the customer. | Unchecked |
| Clear Product Data | Removes the saved links between your Shopify products and variants and NetSuite items. The next sync matches them again using the SKU Mapping Field. | Unchecked |
| Clear Cache (button) | Runs the clear for the boxes you checked and shows how many records were cleared. The button is disabled until at least one box is checked. The boxes reset after a successful clear. | — |
Use Clear Temporary Cache only if you switch to a different NetSuite account (for example from sandbox to production), change the SKU Mapping Field, or support asks you to. Clearing customer data when nothing has changed makes the next syncs slower, because every customer is looked up in NetSuite again.
Set up Inventory & prices first and check that stock matches, then Customers, then Orders. Turn on order sync last, once items match by SKU.
Orders
Open Orders Settings from the app menu. This page controls how Shopify orders are written to NetSuite, and how refunds and fulfillments move between the two systems. The page has eight cards: General Settings, Order Tax Settings, Line Item Settings, Refund Settings, Fulfillment Settings, Additional Settings, POS Settings and Fields Conditional Mapping. Each card has its own save bar, so save one card before you move to the next. Most cards can only be saved after Order sync is switched on in General Settings.
Before you switch on order sync, finish General Configuration (SKU Mapping Field and Price Level Name) and check that your Shopify SKUs match NetSuite items. Then set Sync orders from this date onwards in Additional Settings to your go-live date, so older orders are not sent when they are edited.
How an order syncs
Orders sync when Shopify reports that an order was created or changed, usually within a few seconds. The same order is never created twice: every record the app creates carries the NetSuite External ID shopify_ followed by the Shopify order ID, and the app checks for it before creating anything. Below is what happens to each order, in order.
- Checks. The order is skipped if Order sync is off or the order was created before Sync orders from this date onwards.
- Record type. The app decides what to create: a Sales Order or a Cash Sale (from Sync order as), an Invoice for fulfilled POS orders when POS Settings say so, or a Purchase Order when your purchase order rules match.
- Customer. The app finds the NetSuite customer by email (and phone, if that search is on), or creates one, including for guest checkouts. The rules are in How customers are found and created. You can instead send every order to one customer, or send orders with no email and no phone to a fallback customer (see Additional Settings).
- Items. Each Shopify line is matched to a NetSuite item. The app uses the link saved by earlier syncs, or searches NetSuite by your SKU Mapping Field. Gift card products and custom (non-catalog) lines can be mapped to fixed NetSuite items. A line that matches no NetSuite item cannot be added to the order, so make sure every SKU exists in NetSuite.
- Prices, discounts, shipping and tax. Line rates, amounts and price levels follow Line Item Settings. Discounts become promotion codes or discount lines (General and Line Item Settings). Shipping goes on the order header or as a shipping item line. Duties and gift card payments can be added as lines. Tax codes follow Order Tax Settings. When your Shopify prices include tax, the app sends pre-tax amounts.
- Header fields. Billing and shipping addresses and the email are copied, then your conditional mapping rules fill fields such as subsidiary, location, department, class or custom body fields.
- Follow-on records. Depending on General Settings, the app also creates a Customer Deposit, an Invoice or Cash Sale from the Sales Order, and a payment that marks that invoice paid.
When the order changes in Shopify
Edits in Shopify (items, quantities, addresses, notes) update the NetSuite record while it is still open: Pending Approval, Pending Fulfillment, Partially Fulfilled, Pending Billing/Partially Fulfilled or Pending Billing. Once a Sales Order is billed or closed in NetSuite, Shopify edits are no longer written to it. Cash Sales are updated whenever the order changes. If items or quantities change, the app replaces the deposit, invoice or cash sale it created from that Sales Order so they match the new totals. To stop updates entirely, use Disable Order Update Setting.
Cancellations, refunds and fulfillments
- Cancel: with Cancel Order on, cancelling a Shopify order deletes its NetSuite Sales Order.
- Refunds, Shopify to NetSuite: a Shopify refund becomes a Cash Refund, or a Return Authorization that is received and refunded in NetSuite. See Refund Settings.
- Refunds, NetSuite to Shopify: every hour, refunded Return Authorizations in NetSuite are recorded as refunds on the Shopify order.
- Exchanges: for Cash Sale shops, an exchange can create a new Cash Sale and fully refund the previous one.
- Fulfillments: choose one direction. Either Shopify fulfillments create Item Fulfillments on the Sales Order, or NetSuite Item Fulfillments become Shopify fulfillments with tracking every hour. See Fulfillment Settings.
Orders that fail are listed on the dashboard with the NetSuite error, and you can resubmit them after fixing the cause (see Dashboard and resubmitting an order). A failure email is also sent unless you turn it off.
Order General Settings
The General Settings card turns order sync on and picks the NetSuite record type, the follow-on records, shipping cost, order-level discounts and cancellation. Some options appear only after you switch on or choose the option above them. Saving this card with Order sync on also tells Shopify to start sending order updates to the app.
| Setting | How it works | Default |
|---|---|---|
| Order sync | Sends Shopify orders to NetSuite when they are created or changed. Nothing is sent while it is off. Shipping cost, customer deposits, order discounts, tax settings and the other order cards need it on before they can be saved. Turn it on only after items match by SKU. | Off |
| Sync order as | Appears when Order sync is on. The NetSuite record each order becomes. Options:
| Sales Order (when the card is saved with no choice) |
| Invoice/CashSale sync | Shown for Sales Orders. Also creates a billing record from the Sales Order. Options: SO Invoice (an Invoice transformed from the Sales Order) or SO CashSale (a Cash Sale transformed from the Sales Order). Leave it on Select Type to create only the Sales Order. After choosing a type, choose when to create it:
| Select Type (no invoice or cash sale). On Order Creation is preselected when you pick a type. |
| Customer Deposit | Shown for Sales Orders when Invoice/CashSale sync is Select Type or SO Invoice. Creates a NetSuite Customer Deposit against the Sales Order for the order's current total, to record the payment taken in Shopify. Choosing SO CashSale turns it off, because the cash sale already records the payment. | Off |
| Mark Invoice as Paid | Shown when Invoice/CashSale sync is SO Invoice. After the invoice is created, the app records a customer payment against it so the invoice shows as paid in NetSuite. | Off |
| Sync shipping cost | Sends the order's shipping charge (without tax) as the NetSuite shipping cost, and sets the ship method to the Shipping method internal ID you enter (required when on). If Shipping cost as line item is also on, the ship method is still set but the header shipping cost is 0 and the charge goes on the shipping line instead. | Off (no shipping cost or ship method on the order) |
| Apply order total discounts | Sends Shopify discounts to NetSuite. When on, pick a Discount Item from your NetSuite discount items (required) and one option:
| Off. Sync dicount as promotion code is preselected when switched on. |
| Cancel Order | When a Shopify order is cancelled, its NetSuite Sales Order is deleted. Saving with it on tells Shopify to send cancellations to the app; turning it off stops that. Applies to orders synced as Sales Orders. The NetSuite order must still be deletable (for example, not yet fulfilled or billed). | Off (cancellations are not sent to NetSuite) |
With Cancel Order on, a cancellation in Shopify removes the Sales Order from NetSuite rather than closing it. Leave it off if you need an audit trail in NetSuite, and close cancelled orders there by hand.
Order Tax Settings
The Order Tax Settings card decides which NetSuite tax codes go on order lines and shipping. Pick one Tax Type; the options below it change with your choice. Order sync must be on to save this card. Your NetSuite tax setup (SuiteTax or legacy tax, nexuses) decides which option fits; if unsure, ask your NetSuite administrator which tax codes your sales orders normally use.
| Setting | How it works | Default |
|---|---|---|
| Tax Type | Options:
| Select tax type (no tax codes sent) |
| Tax Code | Shown for Sync Shopify Tax. The NetSuite tax code put on taxable lines and on taxed shipping. The list comes from your NetSuite account and can be searched. Required. | Not set |
| Apply tax on | Shown for Sync NetSuite Tax. Options:
| Not Required |
| Sync taxes | Shown for Apply single Tax Code for entire store, and must be on for that option to save. Reveals the tax code list; pick the NetSuite tax code to use on every taxable line and on taxed shipping. | Off |
| Tax countries | Shown with Sync taxes. Limits the single tax code to orders shipped to the countries you select. Orders to other countries, and orders with no shipping address, get no tax code. Leave blank to apply the tax code to all countries. | Blank (all countries) |
| Country / Collection / Tax Code / Apply for Shipping | Shown for Apply Tax Code based on product collection/Country. Click (+)Add to add a rule, and fill in:
| No rules |
Order Line Items
The Line Item Settings card controls the price fields on each order line and adds extra lines for discounts, shipping, duties and gift cards. Fields that ask for an internal ID need the number NetSuite shows for that record.
| Setting | How it works | Default |
|---|---|---|
| Price level | Puts the Price Level Name from General Configuration on each line, so NetSuite shows which price list the sale came from. You must choose a price level in General Configuration before you can save this on. The Shopify amount is still sent unless Include amount from NetSuite is on. Use either Price level or Include rate, not both. | Off |
| Include rate | Sends the Shopify unit price as the line rate, with the price level set to Custom. Use it when Shopify prices differ from NetSuite and you want the Shopify price on the order. | Off |
| Include amount from NetSuite | When on, the app does not send the line amount, so NetSuite calculates it from the rate or price level and the quantity. When off, the app sends the Shopify line total (less line discounts, unless they go on separate discount lines). | Off (the Shopify amount is sent) |
| Sync line item discounted price | Sets each discounted line's rate to its discounted unit price (line total after discount divided by quantity), so the discount is built into the rate. Cannot be on together with Shopify item discount as line item; saving one switches the other off. | Off |
| Shopify item discount as line item Enterprise | After each discounted line, adds a negative line for that line's discount using the Discount Item you select (required). Keeps the full price on the product line and shows the discount separately. If an order-level Discount Item is set in General Settings, that item is used for these lines too. | Off |
| Shipping cost as line item | Sends the shipping charge as an item line, using the Shipping item internal ID you enter (required), instead of the order's shipping cost field. A line is added only when the order has a shipping charge. Use a NetSuite shipping, service or other charge item available to your subsidiary. | Off |
| Sync duties as line item | Adds the order's import duties as a line, using the Duties item internal ID you enter (required). A line is added only when the order has duties. | Off |
| Sync gift card for purchase as line item Enterprise | Shopify gift card products on an order are sent as the NetSuite item whose NetSuite item internal ID you enter (required), at their positive amount, instead of being matched by SKU. | Off |
| Sync gift card for redemption as line item Enterprise | When an order is paid fully or partly with a gift card, adds a negative line for the gift card amount, using the NetSuite item internal ID you enter (required), so the order total matches what was paid by other means. | Off |
| Location | The inventory location set on order lines. Options:
| Not Required |
Fields that ask for an internal ID need the number NetSuite shows for that record (turn on Show Internal IDs under Home > Set Preferences to see them in lists). The item must be available to your subsidiary and, for shipping, set up as a shipping or service item.
Order Refund Sync
The Refund Settings card syncs refunds in either or both directions, and handles exchanges for Cash Sale shops. Refunds are recorded against the NetSuite Sales Order or Cash Sale the app created for that order, and each refund is sent only once.
| Setting | How it works | Default |
|---|---|---|
| Shopify to NetSuite | When a refund is created in Shopify, it is recorded in NetSuite. Saving with it on tells Shopify to send refunds to the app. Pick the refund type:
| Off. Return Authorization is preselected when switched on. |
| Create new order on exchange | Appears when Shopify to NetSuite is on, and only applies when orders sync as Cash Sales. On each Shopify exchange, a new NetSuite Cash Sale is created with the items still kept plus the exchange items, and the previous Cash Sale is fully refunded. The exchange refund itself is not sent as a separate refund. Use it to keep one current Cash Sale that matches what the customer has. | Off |
| NetSuite to Shopify | Every hour, Return Authorizations with status Refunded in NetSuite are recorded as refunds on the matching Shopify order, for the returned lines and their amount including tax. Applies to paid orders that are fulfilled. Each Return Authorization is sent once. | Off |
If both directions are on, a refund made in Shopify is written to NetSuite, and a return refunded in NetSuite is written to Shopify. Make each refund in one system only, or the customer may be refunded twice.
Order Fulfillment
The Fulfillment Settings card keeps shipments in step. Choose one Fulfillment Flow; the options for that direction appear below it. Fulfillment sync applies to orders synced as Sales Orders. Partial fulfillments are supported in both directions: each Shopify fulfillment or NetSuite Item Fulfillment is synced once.
| Setting | How it works | Default |
|---|---|---|
| Fulfillment Flow | Options:
| Select Fulfillment flow (no fulfillment sync) |
| Fulfillment Item Location | Shown for Shopify to Netsuite Fulfill. The location set on Item Fulfillment lines. Options:
| Default Location |
| Notify Customer on Fulfillment Enterprise | Shown for Netsuite to Shopify Fulfill. Shopify sends its shipping confirmation email to the customer when the app creates the fulfillment. | Off (no email) |
| Sync shipping carrier from Enterprise | Shown for Netsuite to Shopify Fulfill. Which Item Fulfillment field becomes the tracking company in Shopify. Options: Shipping carrier (the carrier, for example UPS or FedEx) or Shipping method (the ship method name). Choose Shipping method if your ship method names match carriers Shopify recognizes, so tracking links work. | Shipping carrier |
| Netsuite To Shopify Update (button) | Shown for Netsuite to Shopify Fulfill after the card is saved. Runs the NetSuite-to-Shopify fulfillment check now instead of waiting for the hourly run. | — |
For Netsuite to Shopify Fulfill, the NetSuite role used by the app needs permission to view Item Fulfillments and their packages, and the item ship carrier and ship method. If tracking does not reach Shopify, ask your NetSuite administrator to check the role.
Order Additional Settings
The Additional Settings card covers free shipping coupons, fixed customers, custom items, the start date and notifications. Each toggle that asks for an ID cannot be saved until the ID is entered.
| Setting | How it works | Default |
|---|---|---|
| Enable Free Shipping Coupon Sync | Links a Shopify free-shipping coupon to a NetSuite promotion. Enter the Netsuite Free Shipping Promotion Internal Id and the Shopify coupon code (Enter Shopify Coupon Code). When an order uses that code, or a Shopify free-shipping discount, the NetSuite promotion is applied to the order. | Off |
| Map all orders to single customer | Every order is created under one NetSuite customer (enter its Customer Internal Id) and no customers are looked up or created. Useful for a single "Web Customer" or "Cash Customer" setup. | Off (each order gets its own customer) |
| Default Customer for Missing Details | Orders with neither an email nor a phone number go to this NetSuite customer (enter its Customer Internal Id). Without it, those orders fail with a missing customer error. | Off |
| Map custom item to one product | Shopify custom items (lines added by hand that are not catalog products) are sent as one NetSuite item, whose Product Internal Id you enter. Without it, custom lines cannot be matched and are left off the NetSuite order. | Off |
| Sync orders from this date onwards | Only orders created on or after this date sync. Older orders are ignored, even when they are edited. Leave blank to sync all. Set it to your go-live date so historic orders are not sent. | Blank (all orders) |
| Disable Order Update Setting | After an order is created in NetSuite, later Shopify edits no longer change it. Fulfillments from Shopify, the invoice or cash sale on fulfillment, the customer deposit and exchange cash sales still sync. Use it when your team edits orders in NetSuite. | Off (Shopify edits update the order) |
| Disable Order Notifications | Stops the email sent when an order fails to sync. Failures still appear on the dashboard. The email address is set in Notification Email. | Off (emails are sent) |
POS Settings
Shopify POS orders sync like online orders, using the settings above. The POS Settings card lets you create fulfilled POS sales as invoices instead.
| Setting | How it works | Default |
|---|---|---|
| Enable POS Order Sync | Turns on separate handling for orders placed in Shopify POS. When off, POS orders are treated like any other order. | Off |
| Create POS as | Shown when Enable POS Order Sync is on. Options: Sales Order (same as online orders) or Invoice. With Invoice, a fulfilled POS order (the usual over-the-counter sale) is created as a NetSuite Invoice. A POS order that is not fulfilled yet, such as a ship-to-customer sale, is created as your usual record type. | Sales Order |
| Mark Invoice as Paid | Shown when Create POS as is Invoice. Records a payment against each POS invoice so it shows as paid in NetSuite. | Off |
Order Conditional Mapping
Use Fields Conditional Mapping to set NetSuite order header fields that the other cards do not cover, such as subsidiary, department, class, location, sales rep, memo, terms or your own custom body fields. Each rule is a card; click (+)Add More to add one and Remove to delete it. Rules apply when the order is created and each time it is updated.
| Setting | How it works | Default |
|---|---|---|
| Operation | What the rule does. Options:
| — |
| Shopify Field Source | For the two Shopify-based operations. Where the value comes from: Customer Field, Customer Meta Field, Order Field, Order Meta Field or Order Notes Attribute. Then pick the field from the list (customer and order fields, such as email, order number, coupon code, shipping method, payment gateway, PO number or address parts), or type the metafield key (the key only, without the namespace) or the note attribute name. | — |
| Where and Shopify Field Value | For the condition-based operation. The comparison (IS, IS NOT, CONTAINS, DOES NOT CONTAINS) and the value to compare the Shopify field with. | — |
| Prefix to append | For Map NetSuite Field to Shopify Field. Optional text added before the copied value, for example SHOP-. | None |
| Attribute Type | Default Netsuite Field (pick a standard order field from the list, such as subsidiary, location, department, class, salesRep, memo or terms) or Custom Netsuite Field (type the field ID, such as custbody_sales_channel). | — |
| NS Field | The NetSuite field to set. For list fields such as subsidiary, location, department or class, the value must be the internal ID of the list entry. | — |
| NS Field Type | For custom fields. Must match the field's type in NetSuite: Custom String Field, Custom Select Field (value is the internal ID of the list value), Custom Multi-Select Field, Custom boolean, Custom CurrDate Field, Custom Date Time or Custom Record Ref. | — |
| NS Field Value | For the fixed-value operations. The value written to the NetSuite field. | — |
| Exclude in update | Sets the field only when the order is first created. Later Shopify edits leave it alone, so changes your team makes in NetSuite are kept. | Off (the field is set again on every update) |
Check the field ID and type on the NetSuite form (Customization > Lists, Records & Fields > Transaction Body Fields). A wrong type or a list value that is not available to the order's subsidiary makes NetSuite reject the whole order, and the error shows on the dashboard.
Customers
Open Customers Settings from the app menu. The page has three cards: Customer Export Settings (Shopify to NetSuite), Customer Import Settings (NetSuite to Shopify, including B2B companies) and Fields Conditional Mapping (extra NetSuite customer fields). Each card has its own save bar, so save one card before you move on to the next. Before the app creates any NetSuite customer it looks for an existing one, so the same shopper is not created twice.
Customer Export Settings
These settings control how Shopify customers are created and updated in NetSuite. They apply in two places: when a customer is edited in Shopify (only while Customer sync is on), and every time an order syncs, because each NetSuite order needs a customer. Some options only appear after you switch on the option above them.
| Setting | How it works | Default |
|---|---|---|
| Customer sync | Sends customer changes from Shopify to NetSuite whenever a customer is created or edited in Shopify. Switching it on and saving also tells Shopify to start notifying the app about customer changes; switching it off stops that. This toggle does not affect orders: the customer on every synced order is still found or created in NetSuite, using the rest of the settings on this card. | Off |
| Sync as company | Creates NetSuite customers as company records instead of individuals. When on, choose one option:
| Off. When switched on, When company name is present on billing address is preselected. |
| Customer Search Method | Appears only when Sync as company is on. Picks the extra way the app looks for an existing NetSuite customer. Only one method can be active:
| Neither selected (email search) |
| Sync customer info as contact | Appears only when Allow company based search is selected. After the NetSuite customer is created or updated, the shopper's name, email and phone are also saved as a contact record under that customer. Useful when you keep one NetSuite company per business and want each buyer listed as a contact. | Off |
| Allow phone based search | When no NetSuite customer matches the email, or the customer has no email, the app searches by phone number before creating a new customer. Without it, a customer who has no email cannot be created in NetSuite. | Off |
| Auto generation enabled on NetSuite Customer Entity ID | Turn this on if your NetSuite account numbers customers automatically (Set Up Auto-Generated Numbers). Turn it off to have the app fill the NetSuite Customer ID with the shopper's email. You can still set the Customer ID another way with a conditional mapping rule on entityId. The ID is only set when a customer is created, never on update. | Off in the form. Until this card is saved for the first time, the app leaves the Customer ID for NetSuite to fill. |
| Disable customer update | When the app finds an existing NetSuite customer (or contact), it links to it and uses it for orders, but never changes its name, email, phone, addresses or mapped fields. New customers are still created. Turn this on when NetSuite is your master record for customer details. | Off (existing customers are updated) |
Domain search matches on the part after the @. If any NetSuite company customer uses a public address such as @gmail.com, unrelated shoppers with Gmail addresses can be attached to that company. Use domain search only when your NetSuite company customers use their own business domains.
How customers are found and created in NetSuite
Each time a Shopify customer is sent to NetSuite, from a customer edit or from an order, the app works through the steps below. The first match wins. The table lists each step and the setting that controls it.
| Step | How it works | Default |
|---|---|---|
| 1. Already linked | If this Shopify customer was synced before, the app reuses the NetSuite customer it is linked to, after checking that the record still exists in NetSuite. | Always on |
| 2. Company name | With Allow company based search, a NetSuite customer with the same company name is matched, and the shopper becomes a contact under it. | Off |
| 3. Email | Searches active NetSuite customers by exact email. With Search customer by domain in email, the domain search described above is used instead. With Sync customer info as contact, contacts with that email are checked too. | Always on |
| 4. Phone | With Allow phone based search, searches by phone when the email finds nothing or is missing. | Off |
| 5. Create | No match: a new NetSuite customer (individual or company, per Sync as company) is created with name, email, phone (when longer than 6 characters), addresses and your conditional mapping fields. | — |
| Update | A match is updated with the latest Shopify details and mapping fields, unless Disable customer update is on. | Updates on |
Guests, addresses and special cases
- Guest checkouts: an order placed without a customer account still gets a NetSuite customer. The app uses the email or phone on the order and the name and address from the order, and runs the same search steps before creating one.
- No email and no phone: the app cannot search or create a customer. Set Default Customer for Missing Details in Order Additional Settings so these orders go to a NetSuite customer you choose; otherwise they fail with a missing customer message.
- One customer for all orders: with Map all orders to single customer in Order Additional Settings, orders go to that one NetSuite customer, and Shopify edits to customers who have placed an order are not sent to NetSuite.
- Addresses: when a customer is edited in Shopify, their Shopify addresses are sent to NetSuite. When a customer syncs with an order, the order's billing and shipping addresses are added to the NetSuite customer if they are not already in its address book.
- Inactive or lead records: the email search only looks at active NetSuite customers. A shopper whose email is only on an inactive customer or a lead gets a new customer record.
Customer Import Settings
These settings bring customers from NetSuite into Shopify. The import runs automatically on the app's schedule while any of Sync customer, Customer update or Sync Company is on, and on demand with the Import Customers button at the top of the page. The button appears once one of those three toggles is on. The import reads your whole Shopify customer list first, so a large store can take a while; progress and errors show on the Logs page.
| Setting | How it works | Default |
|---|---|---|
| Sync customer | Creates Shopify customers for NetSuite individual customers whose email is not in Shopify yet. A NetSuite customer is imported only if it has an email and at least one address, and has no contacts attached. The app copies the email, phone, first and last name and addresses (address lines, city, zip, country and company name). Each imported customer gets the Shopify tag ns_customer_id_ followed by its NetSuite internal ID, so you can find it later. Existing Shopify customers are never changed by this toggle. | Off |
| Sync Company | For Shopify B2B stores: creates Shopify companies from NetSuite company customers. See Company (B2B) import for details. Switching it on shows Add catalog. | Off |
| Add catalog | Appears when Sync Company is on. Choose one of your Shopify B2B catalogs from the list. Every company location the import creates is added to that catalog, so the new company sees the right products and prices straight away. The list shows catalogs already used by company locations in your store; if it is empty, assign a catalog to at least one company location in Shopify and reload the page. Companies that already exist in Shopify are not changed. | Off, no catalog |
| Customer update | Updates existing Shopify customers from NetSuite. Customers are matched by email, and the Shopify first and last name are overwritten with the NetSuite values. When Sync customer is also on, new customers are created first and existing ones updated after. | Off |
| NetSuite Checkbox Field for Customer Sync | Appears once any import toggle is on. Enter the ID of a checkbox field on the NetSuite customer record, for example isonline or your own custentity_sync_to_shopify. Only NetSuite customers with that box checked are imported, updated or created as companies. Use the field ID exactly as NetSuite shows it, not its label. Leave blank to include every customer. | Blank (all customers) |
Use a checkbox field (for example a custom "Sync to Shopify" box) to control which NetSuite customers reach Shopify, rather than importing your whole customer list. Tick it on a few test customers, click Import Customers and check the result before ticking the rest.
The app writes to the Shopify customer Note on customers it imports or updates from NetSuite, to keep track of its own changes. Keep any notes you need on those customers somewhere else, such as a customer metafield or tag.
Company (B2B) import
With Sync Company on, each import also creates Shopify companies from your NetSuite company customers. It needs Shopify's B2B features on your store. Companies are matched by name: a NetSuite company whose name already exists as a Shopify company is skipped. The import creates companies only; it does not update companies that already exist in Shopify.
| What is created | How it works | Default |
|---|---|---|
| Which NetSuite records | NetSuite customers saved as companies (not individuals) whose name is not yet a Shopify company. If NetSuite Checkbox Field for Customer Sync is filled in, only companies with that box checked. | All NetSuite company customers |
| Company | A Shopify company named after the NetSuite company name (or its first and last name, when those are filled in on the NetSuite record). | — |
| Location | One company location with the same name, using the NetSuite customer's default shipping and billing addresses. | — |
| Contacts | Each contact on the NetSuite company that has an email is added as a contact of the Shopify company. Contacts without an email are skipped. | — |
| Catalog | The new location is added to the catalog chosen in Add catalog, when that is on. | No catalog |
Because companies are matched by name, keep company names identical in NetSuite and Shopify. Renaming a company on one side only leads to a second company being created on the next import.
Company catalog prices Enterprise
To give B2B companies NetSuite pricing, map their catalogs to NetSuite price levels. This setting lives on the Inventory page under Price Sync, as Price Mapping for Company Catalog (see Price Mapping for Company Catalog). It appears once Price Sync is on. Catalog prices are refreshed after each product price update from NetSuite.
| Setting | How it works | Default |
|---|---|---|
| Price Mapping for Company Catalog | Turns catalog price mapping on and shows the mapping table. Click (+)Add for each row and the trash icon to remove one. | Off |
| Company Catalogs | One or more Shopify company catalogs that share the same pricing. A catalog can be used in one row only. | — |
| NetSuite Currency | The NetSuite currency whose prices are used for these catalogs. Required. | — |
| NetSuite Price Level | The NetSuite price level (for example Wholesale) whose prices are written to the catalogs' price lists. Required. | — |
Customer Conditional Mapping
The Fields Conditional Mapping card sets extra fields on the NetSuite customer record, such as subsidiary, category, price level, terms, sales rep or your own custom entity fields. It works like Order Conditional Mapping. Rules are applied every time a customer is created or updated in NetSuite, from a customer edit or from an order. Add as many rule cards as you need; Remove deletes one.
| Setting | How it works | Default |
|---|---|---|
| Operation | What the rule does:
| — |
| Shopify Field Source | For the two Shopify-based operations: where the value comes from. Customer Field (email, name, phone, note, tax exempt, default or shipping address parts, payment terms and similar), Customer Meta Field, Order Field, Order Meta Field or Order Notes Attribute. Order sources only have a value when the customer syncs as part of an order; on a plain customer edit they are empty and the rule is skipped. | — |
| Customer Field / Order Field | Pick the Shopify field from the list. | — |
| Customer Meta Field / Order Meta Field / Order Notes Attribute | Type the metafield key or the note attribute name exactly as it appears in Shopify. | — |
| Where and Shopify Field Value | For the conditional operation: compare the Shopify field with a value using IS, IS NOT, CONTAINS or DOES NOT CONTAINS. | — |
| Prefix to append | For Map NetSuite Field to Shopify Field: optional text added in front of the copied value, for example WEB-. | None |
| Attribute Type | Default Netsuite Field for standard customer fields, or Custom Netsuite Field for your own entity fields. | — |
| NS Field | For default fields, pick the NetSuite customer field (for example subsidiary, category, priceLevel, terms, salesRep, entityId). For custom fields, enter the field ID, for example custentity_channel. | — |
| NS Field Type | For custom fields: the field's type in NetSuite (Custom String Field, Custom boolean, Custom Select Field, Custom Multi-Select Field, Custom CurrDate Field, Custom Date Time or Custom Record Ref.). It must match the field's real type or NetSuite rejects the value. | — |
| NS Field Value | The value to set. For list and record fields (subsidiary, category, terms, select fields) enter the NetSuite internal ID of the value, not its name. | — |
| Exclude in update | When on, the rule is applied only when the customer is first created in NetSuite and left alone on later updates. Use it for values your team may change in NetSuite afterwards, such as terms or sales rep. | Off (applied on create and update) |
If your NetSuite account uses OneWorld, add a fixed-value rule for subsidiary so new customers are created in the right subsidiary.
Products
Product Import Settings creates products in Shopify from your NetSuite items and, if you choose, keeps existing Shopify products up to date from NetSuite. It is available on the Enterprise plan. Product sync only reads from NetSuite; nothing is written back to NetSuite.
- Items whose SKU (your SKU Mapping Field) is not on any Shopify variant are created as new products. Matrix items become one product with options and variants.
- With Enable Product Update on, products that already exist in Shopify are updated from NetSuite as well.
- Only items that have a price in your selected Price Level Name are included.
- Check the SKU Mapping Field and Price Level Name in General Configuration. Product sync uses both.
- Turn on Enable Product Sync, fill in the mapping sections below, and click Save in the save bar.
- Click Test Sync. It adds the first two new products from your catalog to Shopify so you can check them.
- When they look right, click Import Product to run the full import. After that, product sync also runs once a day on its own while Enable Product Sync is on.
How product sync works
Each run (Test Sync, Import Product or the daily run) works in the background. It reads the SKUs of all your Shopify variants, reads the eligible items from NetSuite, then updates the products that already exist and creates the ones that don't.
| Setting | How it works | Default |
|---|---|---|
| Which NetSuite items are read | Items whose checkbox in NetSuite Checkbox Field for Product Sync is checked and that have a price in your Price Level Name. Matrix child items are not read on their own; they come in as variants of their parent. | Items with Display in Web Store (isonline) checked |
| Matching to Shopify | The value of your SKU Mapping Field on the NetSuite item is compared with Shopify variant SKUs. A NetSuite item counts as already in Shopify if its own value, or the value of any of its matrix child items, is the SKU of a Shopify variant. Items with no value in the SKU Mapping Field are skipped. Shopify variants with no SKU are ignored. | SKU Mapping Field from General Configuration |
| Create | Items not found in Shopify are created as new products with the mapped fields, price, images and metafields. Inventory tracking is turned on for each variant and its quantity starts at 0; stock levels then come from Inventory sync. | Always, while Enable Product Sync is on |
| Update | With Enable Product Update on, items found in Shopify are updated first, then new items are created. The Shopify product is rewritten from NetSuite: title, description, product type, vendor, variants, prices, images, status and metafields. | On |
| Price | Each variant's price is the item's price in your Price Level Name, in your Shopify store currency. | — |
| Publishing | Created and updated products are published to the sales channels chosen in Shopify Sales Channels for Synced Products. | No channel: products are not published to any sales channel |
With Enable Product Update on, each run sets the product back to what NetSuite has. Changes made in Shopify to the synced fields, images or status are overwritten on the next run. If you want to manage some products by hand in Shopify, turn Enable Product Update off or uncheck the NetSuite checkbox field on those items.
Use the same SKU values in NetSuite and Shopify before the first import. A product that exists in Shopify under a different SKU is not recognised and is created again.
Product sync options
These settings are in the General Settings card at the top of the page. The options below Enable Product Sync can only be changed while it is on.
| Setting | How it works | Default |
|---|---|---|
| Enable Product Sync | Master switch for product sync. On: the daily run includes your store and the Test Sync and Import Product buttons work. Off: nothing runs and the buttons reply "Product Sync is not enabled". When it is on, at least one row in Product fields mapping must be filled in before you can save. | Off |
| NetSuite Checkbox Field for Product Sync | The ID of a checkbox field on the NetSuite item record that marks which items go to Shopify, for example isonline or your own custitem_sync_to_shopify. Only items with this box checked are read. For a matrix item, check it on the parent item. Enter the field ID exactly as NetSuite shows it. | Blank: isonline (Display in Web Store) |
| Default Product Status on Shopify | Active: products are live in the sales channels they are published to. Draft: products are created hidden until you set them to Active in Shopify. The status is applied when a product is created and, with Enable Product Update on, again on every update. Choose Active or Draft; leave it on Select Status only if you want Shopify's own default. Recommended: Draft until you have reviewed the first import. | Not chosen: Active (Shopify's default) |
| Shopify Sales Channels for Synced Products | The sales channels (Online Store, Point of Sale, and others installed in your store) that created and updated products are published to. You can pick several. The list is loaded from your Shopify store each time the page opens. Select at least one channel, usually Online Store, or the products will not appear in any channel until you publish them yourself. | None: products are not published to any channel |
| Enable Product Update | On: products already in Shopify (matched by SKU) are updated from NetSuite on every run, then new products are created. Off: only new products are created and existing products are left untouched. Test Sync never updates; it only creates. | On |
Product fields mapping
Choose which Shopify product fields are filled from NetSuite. For each row, tick the Shopify field, type the NetSuite field ID in Mapped NetSuite Field, and pick its NS Field Type. The grey text in each box is only a hint; a field is used only when its box is ticked and a field ID is entered. Every ticked row needs a field ID, and every row with a field ID must be ticked, or the page will not save.
| Setting | How it works | Default |
|---|---|---|
| Title | The Shopify product title. Common choices: itemid (Item Name/Number), displayname (Display Name) or storedisplayname (Store Display Name). | Not mapped: the item's full name in NetSuite |
| Append uom to title | Shown under the Title field. Adds the item's stock unit name to the end of the title, for example "Coffee Beans Case". Useful when the same product is sold in several units. | Off |
| Description | The Shopify product description. HTML in the NetSuite field is kept. Common choices: storedetaileddescription, salesdescription or a custom field. | Not mapped: empty |
| Product Type | The Shopify product type. Use a text field such as itemtype, or a custom list field with Select Field so the list value's name is used. | Not mapped: empty |
| Vendor | The Shopify vendor. Use a text field that holds the brand or vendor name, or a custom list field with Select Field. | Not mapped: empty |
| Weight | The variant weight, usually weight. The unit is taken from the item's NetSuite weight unit (lb, kg, oz or g). | Not mapped: no weight. Unit not set in NetSuite: kilograms |
| Barcode | The variant barcode (UPC, EAN, ISBN), usually upccode. | Not mapped: no barcode |
| HS code | The Harmonized System code used for customs, set on the variants of matrix items. Map the NetSuite field that holds it, often a custom field. | Not mapped: no HS code |
| Country code of origin | The country of origin used for customs, set on the variants of matrix items. The value must be a two-letter country code such as US, for example from countryofmanufacture. | Not mapped: none |
NS Field Type
| Setting | How it works | Default |
|---|---|---|
| String Field | The field's value is used as it is. Use it for text, number and free-form fields such as itemid, description or weight. | Select Type (value used as it is) |
| CurrDate Field, Date Time, Boolean | The value is used as NetSuite stores it, the same as String Field. | — |
| Select Field, Record Ref | For list fields, where NetSuite stores an internal ID. The app looks up the list value's name instead. This works for the class field and for custom list fields whose list ID matches the field ID (field custitem_brand uses list customlist_brand). For other fields, choose String Field. | — |
Media Mapping
Map the NetSuite item field that holds the product's image. Images are added when a product is created and sent again on each update. Tick the row, enter the field ID in Mapped NetSuite Field, and choose the NS Field Type.
| Setting | How it works | Default |
|---|---|---|
| Main product image | The first image of the Shopify product, read from the parent item. Use storedisplayimage or a custom image field. | Not mapped: no image |
| NS Field Type (for images) | Record Ref or Select Field: the field points to a file in the NetSuite File Cabinet (image fields such as storedisplayimage work this way). The app builds the file's address from your NetSuite account. String Field: the field already holds a full image address (URL), for example an image on your own CDN. | Select Type (the value is used as an address) |
Shopify downloads each image from its address, so the image must be reachable without logging in to NetSuite. For File Cabinet images, mark the file (or its folder) Available Without Login. File Cabinet images are read from the account in your connection settings, so the API Endpoint must be the SuiteTalk URL of that same account.
Metafield mapping
Copy NetSuite item fields into Shopify metafields. Turn on Add metafields in product, then click Add mapping for each metafield. Each mapping is written to the product (from the parent item) and to every variant (from each matrix child item). A metafield is skipped for an item when the NetSuite field is empty. Rows with a blank key or field ID are ignored.
| Setting | How it works | Default |
|---|---|---|
| Add metafields in product | Turns metafield mapping on. Off: the mappings below are kept but not used. | Off |
| Key name | The Shopify metafield as namespace.key, for example netsuite.sku_uk. If you enter only key (for example netsuite_sku_uk), the custom namespace is used, which matches metafield definitions created in Shopify admin. | Namespace custom |
| NS field ID | The NetSuite item field to read, for example custitem_sku. The value is read as plain text. | — |
| Shopify metafield type | single_line_text_field, multi_line_text_field, decimal, integer, date, date_time or boolean. If a metafield definition already exists in Shopify, choose the same type, or Shopify rejects the value. The NetSuite value must already be in the format the type needs; checkbox fields come through as T/F and dates in your NetSuite date format, so map those as text unless the field already holds true/false or an ISO date (2026-10-23). | single_line_text_field |
Matrix items and variants
A NetSuite matrix item (a parent with child items, for example a shirt in several sizes and colours) becomes one Shopify product. Each child item becomes a variant. An item without children becomes a product with a single variant.
| Setting | How it works | Default |
|---|---|---|
| Options | The Shopify options (for example Size, Colour) come from the matrix option fields in the parent item's Matrix Item Name Template. Each option's name is the label of the matrix option field in NetSuite, and its values are the list values the child items use. Standard fields in the template (such as Item Name, Class, Department, Location) are not turned into options. Make sure every matrix option field is in the template. | — |
| Variant SKU | Each variant's SKU is the child item's value in your SKU Mapping Field. Child items without a value are left out. | — |
| Variant details | Price, weight, barcode, HS code, country of origin and metafields are read from each child item. The title, description, product type, vendor and main image come from the parent. | — |
| Which children are included | Only child items with a price in your Price Level Name, in your store currency, become variants. | — |
The option names and values of each matrix option list are remembered for up to a day. If you add a value to a matrix option list in NetSuite, it may take until the next day to appear on new variants.
Test Sync, Import Product and the daily run
The buttons at the top of the Products page start a run straight away. Save your settings first; a run uses the last saved settings. A run takes from a few minutes to much longer for large catalogs, and its progress and result are shown on the Logs page.
| Setting | How it works | Default |
|---|---|---|
| Test Sync | Creates only the first two new products found, so you can check titles, variants, prices, images and metafields in Shopify. It never updates existing products. The products are published to your selected sales channels. Delete them in Shopify if you want to change the mapping and test again; otherwise they count as existing on the next run. | — |
| Import Product | Runs the full sync: updates existing products (when Enable Product Update is on), then creates all new products, then publishes them. | — |
| Daily run | While Enable Product Sync is on, the full sync runs automatically once a day on Enterprise plans. There is nothing else to switch on. | Runs once a day when Enable Product Sync is on |
| Waiting between runs | After you start a run, the same button can't be used again for 15 minutes. It shows "Product sync is currently processing please try after some time". Wait for the current run to finish before starting another. | 15 minutes |
Run Test Sync and check the two products. Then confirm the SKU Mapping Field matches your existing Shopify SKUs: any NetSuite item whose SKU is not found in Shopify is created as a new product.
Inventory & prices
Inventory & Price Settings (the page is titled Price & Inventory Settings) keeps Shopify stock levels and variant prices in line with NetSuite. The sync goes one way, from NetSuite to Shopify: NetSuite is the source of truth and the Shopify values are overwritten. The page has two cards, Price Sync and Inventory Sync, and each has its own save bar. Save one card before you change the other.
How the sync runs
Stock and prices are updated in the same run. A run reads every variant in your Shopify store, matches each variant's SKU to a NetSuite item using the SKU Mapping Field from General Configuration, reads the stock and prices of the matched items from NetSuite, and writes them back to Shopify. Variants whose SKU has no matching NetSuite item are left unchanged.
| Setting | How it works | Default |
|---|---|---|
| Automatic sync | Runs on its own about every four hours once Update Stock Levels from NetSuite to Shopify or Update Product Price from NetSuite to Shopify is on. Nothing needs to be scheduled by you. The automatic run is skipped while your NetSuite connection fails or your app subscription is not active, so fix those first if stock stops updating. | Runs every few hours when either sync is on |
| Process Inventory Sync | The button at the top of the page starts a run now, with the settings you last saved. At least one of the two syncs must be on; otherwise you see a message asking you to enable Price Sync or Inventory Sync. Inventory Processed Successfully means the run has started: it continues in the background and can take several minutes on a large catalog. Check the result under Logs > Inventory Sync. Save your settings before you click it. | — |
| What is overwritten | Stock: the quantity at each Shopify location the sync covers is replaced with the NetSuite value (not added to or subtracted from). Price: the variant's Price is replaced with the NetSuite price. Market and company catalog prices are written to the price lists of the catalogs you map. Shopify products, titles, images and other fields are not changed by this sync. | — |
Each run replaces the Shopify quantity with what NetSuite has at that moment. A Shopify sale only lowers the NetSuite quantity once the order reaches NetSuite, so keep order sync on and working. Then NetSuite, and the next inventory run, already account for the units sold online.
Inventory Sync
The Inventory Sync card controls which NetSuite items are read, how quantities are converted, and whether stock is held back. Click Save in the save bar labelled Inventory Sync to apply your changes; they are used from the next run.
| Setting | How it works | Default |
|---|---|---|
| Item Type | The NetSuite item types whose stock is read. Pick Inventory Item, Assembly Item, or both. Select Assembly Item if you sell items that NetSuite builds from components (assemblies) and want their built stock in Shopify. Variants whose NetSuite item is another type (for example non-inventory or kit items) get no stock update. At least one type is always kept: if you clear both, Inventory Item is saved. | Inventory Item |
| Update Stock Levels from NetSuite to Shopify | Turns the stock sync on. When on, every run sets the stock of matched variants from NetSuite. When off, stock is not touched (prices still sync if Price Sync is on). Override Track Quantity, Enable Units and the quantity field can only be saved while this is on. | Off |
| Override Track Quantity | On: the sync turns on Track quantity for matched variants in Shopify and sets the NetSuite quantity on them, including variants that were not tracked before. Off: variants with Track quantity turned off in Shopify are skipped and keep selling without a stock limit. Turn it on if you want NetSuite to control stock for every matched product. Leave it off if some products (for example made-to-order items) should stay untracked. | Off |
| Enable Units | Turn on if your NetSuite account uses Units of Measure and your items are stocked in a unit other than the base unit. The NetSuite quantity is then converted using the unit's conversion rate from NetSuite. See the quantity field options below for which number is sent. | Off |
| Inventory Quantity Buffer Enterprise | Holds back reserve stock so it is not offered in Shopify, which helps prevent overselling. Choose the buffer type, Fixed (a number of units) or Percent (a percentage of the stock), and enter the amount in Set buffer quantity. The buffer is applied to every synced variant and location. Leave the amount at 0 for no buffer. | Fixed, 0 (no buffer) |
Which variants are updated
- Only variants whose SKU matches a NetSuite item of a selected Item Type.
- Shopify bundle variants (products made from other products) are skipped, because Shopify works out their stock from their components.
- Untracked variants are skipped unless Override Track Quantity is on.
- Fractional NetSuite quantities are rounded to a whole number of units.
Inventory Location Mapping
This setting decides which NetSuite locations feed which Shopify locations. It is part of the Inventory Sync card and is saved with it. The NetSuite and Shopify location lists are loaded from both accounts each time you open the page.
| Setting | How it works | Default |
|---|---|---|
| Inventory Location Mapping | Off: the stock of each item is added up across all your NetSuite locations and set as the On hand quantity at your primary (default) Shopify location. Other Shopify locations are not changed. Use this when you sell from one Shopify location. On: you add mapping rows (below) and each Shopify location gets stock only from the NetSuite locations you map to it. | Off |
| Quantity field (shown when mapping is off) | The NetSuite quantity to send: Quantity Available, Quantity On Hand, Quantity Available(BaseUnit) or Quantity On Hand(BaseUnit). Available is what NetSuite can still sell (on hand minus stock already committed to NetSuite orders). On Hand is the physical stock. With Enable Units on, Quantity Available and Quantity On Hand are converted with the unit conversion rate, and the (BaseUnit) options send the quantity in the base unit without conversion. Without units, each pair gives the same number. You must pick a field to save with stock sync on. | None selected (Select Quantity Field) |
Mapping rows (when mapping is on)
Click (+)Add to add a row, and use the delete action to remove one. You must add at least one row to save.
| Setting | How it works | Default |
|---|---|---|
| Shop Location | The Shopify location this row updates. Each Shopify location can be used in one row only; a second row for the same location gives Duplicate Shop Location found. | Required, none selected |
| NetSuite Location | One or more NetSuite locations. Pick several to add their quantities together into the one Shopify location, for example two warehouses that ship online orders. Remove a location by clicking the x on its tag. | Required, none selected |
| NetSuite Quantity Field | The NetSuite quantity to read for this row, with the same options and meaning as the quantity field above. | Required, none selected |
| Shopify Quantity | Which Shopify quantity is set. Quantity Available sets the Shopify Available quantity, the number customers can buy. Quantity On Hand sets the Shopify On hand quantity, and Shopify then works out Available by subtracting its own unfulfilled orders. | Quantity On Hand when left empty |
With location mapping on, Shopify locations without a row are not updated. A product is updated at a mapped Shopify location only if it is already stocked there in Shopify, so add the product to that location in Shopify first. Check that each NetSuite location you map holds stock for the items you sell online.
Price Sync
The Price Sync card sets Shopify variant prices from a NetSuite price level. Click Save in the save bar labelled Price Sync to apply your changes. The market and company catalog mappings below appear inside this card once price sync is on.
| Setting | How it works | Default |
|---|---|---|
| Update Product Price from NetSuite to Shopify | On: every run sets each matched variant's Price to the NetSuite price for a quantity of 1 in the Price Level Name chosen in General Configuration, in your Shopify store's currency. Variants whose item has no price in that level and currency keep their current price. Set the price level first: saving with no price level shows Please Select Price Level Name First From Configurations Settings. To change which price level is used, change it in General Configuration; the next run uses the new level. Off: Shopify prices are not touched. | Off |
The variant price only comes from NetSuite prices in your store's currency. If your store sells in USD, the item needs a USD price in the chosen price level. Prices for other currencies and markets are set with Price Mapping for Markets.
Price Mapping for Markets Enterprise
Use this to give Shopify markets their own prices from NetSuite, for example a EUR price level for your Europe market. Market prices are written in the same run as the variant prices, right after them, into the price list of each market catalog you map. Your Shopify markets and their catalogs are loaded each time you open the page. This section appears when Update Product Price from NetSuite to Shopify is on.
| Setting | How it works | Default |
|---|---|---|
| Price Mapping for Markets | Turns market price mapping on. When on, add at least one row (Please Add Markets Mapping otherwise). When off, market prices are not written and the rows are not kept. | Off |
| Shop Market | The Shopify market the row is for. | Required, none selected |
| Market Catalogs | Shown when your store uses Shopify's market catalogs. The catalog of the selected market whose price list receives the prices. The list only shows catalogs of the market chosen in the row. Each market catalog can be used in one row only (Duplicate Market Catalog found). | Required when shown |
| NetSuite Currency | The NetSuite currency of the prices to read. Pick the currency the market's catalog sells in. | Required, none selected |
| NetSuite Price Level | The NetSuite price level to read for this market. It can differ from the store's main price level. | Required, none selected |
Price Mapping for Company Catalog Enterprise
For B2B stores using Shopify companies: map company catalogs to a NetSuite price level and currency, so each catalog's price list follows NetSuite. Company catalog prices are written in the same run, after the variant and market prices. The catalog list is refreshed from Shopify each time you open the page; a catalog you delete in Shopify is removed from the mapping. Give each catalog a price list in Shopify before you map it. This section appears when Update Product Price from NetSuite to Shopify is on.
| Setting | How it works | Default |
|---|---|---|
| Price Mapping for Company Catalog | Turns company catalog price mapping on. When off, the rows are cleared on save and catalog prices are not written. | Off |
| Company Catalogs | One or more Shopify company catalogs that get the same NetSuite prices. Each catalog can be used in one row only; catalogs already used in another row are not offered (All catalogs are selected in other rows). | Required, none selected |
| NetSuite Currency | The NetSuite currency of the prices to read. Pick the currency of the catalogs' price list. | Required, none selected |
| NetSuite Price Level | The NetSuite price level to read, for example a wholesale level. | Required, none selected |
All three fields are required in every row. If one is missing, saving shows Please complete all fields in Price Mapping for Company Catalog.
Purchase orders
Purchase Order Settings creates selected Shopify orders in NetSuite as Purchase Orders instead of Sales Orders or Cash Sales. It uses the same order sync, so it runs when an order is created or updated in Shopify. There is no separate sync button. The page has its own save bar for each card (PO General and PO Line Items); save one card before you change the next.
How purchase orders are created
- When a Shopify order reaches the order sync, the app checks the Condition you chose. If the order matches, it is created in NetSuite as a Purchase Order. If it does not match, it is synced as usual, using Sync order as from Order General Settings.
- A purchase order uses the same customer, items (matched by the SKU Mapping Field) and order settings as a normal order. The line options come from the Line Item Settings card on this page instead of Order Line Items.
General Settings
Choose whether purchase orders are created, and for which orders. Click Save in the PO General save bar; the change applies to the next order that syncs.
| Setting | How it works | Default |
|---|---|---|
| Sync order as purchase order | Turns purchase order creation on. When on, the Condition field appears. Order sync must also be on (see the note below). | Off |
| Condition | Which orders become purchase orders. All: every synced order. Customer has particular metafield: only orders whose Shopify customer has the metafield and value you enter. Orders without a customer then sync as normal orders. | All |
| Customer Metafield Key | Shown for Customer has particular metafield. The key of the customer metafield, without the namespace: for a metafield custom.account_type, enter account_type. | Empty |
| Metafield Value | Shown for Customer has particular metafield. The value the customer's metafield must have, for example wholesale. Upper and lower case are treated the same. | Empty |
Line Item Settings
These options work like Order Line Items but apply to purchase orders only. Click Save in the PO Line Items save bar.
| Setting | How it works | Default |
|---|---|---|
| Price level | Sends the Price Level Name from General Configuration with each line. Set the price level there first; otherwise saving shows Please select the price level name first from the configuration settings. | Off |
| Include rate | Sends the Shopify unit price as the line rate. When prices in Shopify include tax, the tax is taken out of the rate first. | Off |
| Include amount | On: the line amount is left for NetSuite to work out from the rate or price level. Off: the line amount is the Shopify line total after line discounts. | Off |
| Shopify item discount as line item Higher plans | Sends line discounts as a separate discount line, using the Discount Item you pick from your NetSuite discount items. A discount item is required to save. | Off |
| Shipping cost as line item | Sends shipping as a line, using the NetSuite item you enter in Shipping item internal ID (required to save). | Off |
| Sync duties as line item | Sends duties as a line, using the NetSuite item you enter in Duties item internal ID (required to save). | Off |
| Location | Not Required: no location is sent on the lines. Send Default Item Location with Order Items: each line uses the item's default location in NetSuite. Define Item Location to use with All Order Items: enter the internal ID of one NetSuite location to use on every line (required to save). | None selected (no location is sent) |
Fields that ask for an internal ID need the number NetSuite shows for that record. Turn on Show Internal IDs under Home > Set Preferences to see them in lists.
Purchase orders are created by the order sync, so also turn on Order sync under Orders Settings. Purchase orders in NetSuite usually need a vendor; ask support to confirm the setup for your account before going live. The page also has a Purchase Order Conditional Mapping section; ask support before you rely on it.
Import / export settings
You can save your app settings to a file and load them back later, into the same store or into another store. Use this as a backup before large changes, or to copy a tested setup from a development store to your live store.
The More Actions menu
More Actions is the button at the top right of the Dashboard, Orders, Customers, Products, Inventory, Purchase Orders and Logs pages. It is the same menu on every page. The Dashboard itself has no settings: it shows Total Orders Synchronized, Total Customers Synchronized, Inventory Last Synced and the sync history table (see Dashboard).
| Setting | How it works | Default |
|---|---|---|
| Import Settings | Opens a window where you upload a settings file exported from this app. See Import Settings. | — |
| Export Settings | Opens a window that downloads your current settings as a file. See Export Settings. | — |
| Help & Support | Shows the support email address and links to the setup documentation. See Support. | — |
Export Settings
Export downloads one file, netsuite_setting.json, with the settings you have saved in the app for customers, orders, inventory, prices and products, including your conditional mappings. Nothing in Shopify or NetSuite changes when you export.
| Setting | How it works | Default |
|---|---|---|
| Export Settings (button) | Downloads the file to your computer and closes the window. Settings you have never saved are not in the file; the store that imports it keeps its own value for those. Cancel closes the window without downloading. | — |
Import Settings
Import loads a file made with Export Settings and saves its values in this store, replacing the matching settings. Settings that are not in the file stay as they are.
| Setting | How it works | Default |
|---|---|---|
| File (drop zone) | Drop the exported .json file here or click to choose it. One file at a time. | No file |
| Import Settings (button) | Uploads the file and saves its settings straight away. On success the app shows Setting saved successfully. and takes you to the Dashboard. If no file was chosen you see File is not Uploaded.
| — |
If the file has order sync turned on, new and updated Shopify orders start syncing to NetSuite as soon as the import finishes. When copying a setup to your live store, turn order sync off in the source store before exporting, or turn it off in the target store right after importing, and switch it back on once you have reviewed the settings.
After importing, open each settings page (Orders, Customers, Products, Inventory, Purchase Orders), review it and click save before moving to another tab.
The export describes your store's NetSuite configuration. Store it securely and share it only with people you trust. After importing into another store, check the NetSuite API Connection step and any account-specific values (internal IDs, locations, price levels, tax codes, custom field IDs), because they differ between NetSuite accounts.
Logs & troubleshooting
Dashboard and resubmitting an order
The Dashboard shows Total Orders Synchronized, Total Customers Synchronized and Inventory Last Synced, then a table of orders with tabs All, Synced and Not Synced. Each row has the Order Number, Order Date, NetSuite Type and Order Status, with links to View on Shopify and View on NetSuite.
- Open the Not Synced tab and find the order.
- Read the error on the Logs page (below) and fix the cause, for example a missing item or a permission.
- Click Re-Submit on the order, then Refresh and check that it moved to Synced.
Logs page
| Tab | Shows |
|---|---|
| Customer & Order Sync | Each order and customer sync attempt: Log ID, Created Date, Operation, Status, Message and Object ID (the Shopify ID). |
| Product Sync | Each product import run, with its status and message. |
| Inventory Sync | Each inventory and price run, with its status and message. |
Filter by All, Success or Failed, and search by ID or text. The Message column carries NetSuite's own error text, which usually names the field or record at fault. Active Webhooks lists the Shopify events the app is listening to (for example order, customer and refund events once those syncs are on).
Use Clear Logs sparingly and not while a product or inventory sync is running. Keep recent logs available when you contact support.
Common setup mistakes
| Symptom | Likely cause | Fix |
|---|---|---|
| Connection error on Establish Connection | Account ID format, sandbox and production mixed, or a token for a different role or integration. | Copy the Account ID exactly (1234567_SB1 for a sandbox) and the SuiteTalk URL from the same account. Recreate the token for the right integration, user and role. |
| "Invalid login" or permission errors in Logs | The role lacks a permission, or TBA / web services are not enabled. | Re-check Enable features and the role. Add the permission for the record named in the message. |
| Order fails with item not found | The Shopify SKU does not match the NetSuite SKU Mapping Field, or the item is inactive or not available to the subsidiary. | Correct the SKU on one side, or choose a different SKU Mapping Field. Then resubmit the order. |
| Stock not updating for some products | SKU mismatch, the item type is not selected, or the Shopify location has no mapping row. | Check SKUs, Item Type and Inventory Location Mapping, then click Process Inventory Sync. |
| Prices not updating | No Price Level chosen, or the item has no price in that level for your store currency. | Set the Price Level Name in Configurations and add the price in NetSuite. |
| Products not imported | Checkbox field not checked on the item, no price in the selected level, or the SKU already exists in Shopify (and product update is off). | Check the item in NetSuite and run Test Sync. |
| Fulfillments not reaching Shopify | Fulfillment Flow not set to Netsuite to Shopify Fulfill, or the order was synced as a Cash Sale. | Set the flow, then click Netsuite To Shopify Update. |
| Order rejected for a required field | Your NetSuite form requires a field (subsidiary, department, custom field) the app does not set. | Add a rule in Order Conditional Mapping. |
Plans & billing
Plans are billed through Shopify, monthly or yearly (yearly saves up to 17%). Current prices are shown on the app's Plans page.
| Plan | Includes |
|---|---|
| Basic | Unlimited orders, automatic inventory pulls, two-way fulfillment flow, two-way refund flow, implementation support. |
| Enterprise | Everything in Basic, plus custom workflows, priority support, Product Sync, market price mapping and company catalog mapping. |
Downgrading from Enterprise to Basic disables Product Sync and stops market and company catalog price mappings from applying. Settings marked Higher plans in this guide are not shown on every plan. For plan questions, email support@techmarbles.com.
FAQ
Yes. Enter the sandbox Account ID (for example 1234567_SB1) and the sandbox SuiteTalk URL. When you move to production, update the connection and use Clear Temporary Cache in Configurations.
Orders sync when they are created or updated. To keep older orders out, set Sync orders from this date onwards in Order Additional Settings to your go-live date.
Yes, while the NetSuite order can still be changed. Turn on Disable Order Update Setting if you prefer NetSuite to keep the first version.
The app searches NetSuite before creating a customer: by email by default, or by company name, phone or email domain if you choose that search method. Choose the method that matches how your customers are stored.
Automatically every few hours. Click Process Inventory Sync any time to run it immediately.
Yes. Turn on Inventory Location Mapping and map each Shopify location to one or more NetSuite locations.
Product Sync is part of the Enterprise plan.
The Notification Email from the connection step. You can stop these emails with Disable Order Notifications.
Read the message on the Logs page, fix the cause in NetSuite or in the app's settings, then click Re-Submit on the Dashboard. If the message is unclear, send it to support with the order number.
Support
We help with setup and troubleshooting. When you write, include your store's myshopify domain, the order number or record, and the message from the Logs page. Never send your NetSuite secrets by email.
- Email: support@techmarbles.com
- Book a call: Schedule a meeting
- More documentation: techmarbles.com docs
- In the app: More Actions > Help & Support, and the Help Video button on each settings page.