Articles in this section

Shopify – NetSuite D2C implementation guide

A complete implementation guide for merchants and support teams deploying the Celigo Shopify – NetSuite Direct-to-Consumer integration template.

Just getting started? Start here

If you want basic order, customer, fulfillment, and inventory sync up and running, you only need a handful of flows. Follow sections in order: Prerequisites → Install → Initial Setup → Settings → enable the core flows. You can add payouts, returns, exchanges, and transfers later.

  1. Prerequisites
  2. Install
  3. Initial Setup
  4. Settings
  5. Core Flows
  6. Enable and Schedule

What this template does

The Shopify – NetSuite D2C template connects your Shopify storefront to NetSuite so that both systems share a single, accurate version of your business data. Orders placed on Shopify flow into NetSuite automatically. Inventory levels managed in NetSuite appear on your storefront in near real time. Fulfillments, refunds, returns, and cancellations update both systems without manual entry.

The template is built on Shopify's Admin GraphQL API and Celigo's native NetSuite adaptor. It ships as 32 pre-built flows that you install, configure, and enable — no custom development required for standard D2C operations.

What merchants gain

  • Operations teams stop keying orders by hand. Every Shopify order lands in NetSuite within minutes.
  • Customer service sees the same order data in both systems, with no reconciliation lag.
  • Finance teams get a clean bank reconciliation: every Shopify Payments payout maps to the right NetSuite GL transaction.
  • Merchandising manages the product catalog and pricing in NetSuite and publishes to Shopify automatically.
  • Warehouse teams close the fulfillment loop: item fulfillments posted in NetSuite mark Shopify orders as shipped and send tracking emails to customers.

Who this guide is for

This guide is written for:

  • Merchants and store owners who are setting up the integration themselves or overseeing an implementation.
  • Support teams who need to understand how each flow works in order to diagnose issues and answer merchant questions.
  • NetSuite administrators who are preparing NetSuite for the integration (bundle installation, roles, saved searches).
A note on NetSuite terminology

This guide assumes you are already working in NetSuite and know what records like Sales Orders, Item Fulfillments, and Saved Searches are. Where a concept needs clarification for integration purposes, it will be explained in context — but general NetSuite navigation is out of scope.

All 32 flows at a glance

The template ships with 32 flows grouped by function. All flows are disabled by default — you enable them in a specific order after completing setup. Section First-time enablement walks through the exact sequence.

# Flow name Direction Trigger
Setup (run once)
1 Shopify store to NetSuite custom record (add) SHP → NS On-demand
2 Shopify markets to NetSuite (add) SHP → NS On-demand
3 Shopify business entity to NetSuite (add) SHP → NS On-demand
Orders & Customers
4 Shopify order to NetSuite sales order or cash sale (add) SHP → NS Scheduled
5 NetSuite order to Shopify order (add) NS → SHP Scheduled
6 Shopify customer to NetSuite customer (add or update) SHP → NS Scheduled
7 NetSuite customer to Shopify customer (add or update) NS → SHP Scheduled
8 Shopify order transaction to NetSuite customer deposit (add) SHP → NS Scheduled
9 Shopify order transaction to NetSuite custom transaction record (add) SHP → NS Scheduled
Fulfillment
10 NetSuite fulfillment to Shopify fulfillment (add) NS → SHP Scheduled
11 Shopify fulfillment to NetSuite fulfillment (add) SHP → NS Scheduled
12 Shopify hold fulfillments on payment pending release SHP Scheduled
Products & Inventory
13 NetSuite matrix items to Shopify product (add or update) NS → SHP Scheduled
14 NetSuite items to Shopify product (add or update) NS → SHP Scheduled
15 NetSuite item metafields to Shopify product metafields (add or update) NS → SHP Scheduled
16 Shopify products to item ID map (add or update) SHP → NS Scheduled
17 NetSuite inventory to Shopify inventory (add or update) NS → SHP Scheduled
18 NetSuite Transfer Orders to Shopify Inventory Transfer (add or update) NS → SHP Scheduled
19 Shopify received Inventory Transfer to NetSuite Item Receipt for Transfer (add) SHP → NS Scheduled
Billing
20 NetSuite sales order to NetSuite invoice or cash sale (add) NS Internal Scheduled
21 NetSuite billing to Shopify billing (add) NS → SHP Scheduled
Refunds
22 Shopify refund to NetSuite refund (add) SHP → NS Scheduled
23 NetSuite refund to Shopify refund (add) NS → SHP Scheduled
Returns & Exchanges
24 Shopify requested returns to NetSuite return authorization (add) SHP → NS Scheduled
25 NetSuite pending receipt RMA to approved return in Shopify NS → SHP Scheduled
26 NetSuite received RMA to process return and exchange in Shopify NS → SHP Scheduled
27 Shopify order to NetSuite order (cash sale or sales order) – Exchanges SHP → NS Scheduled
Cancellations
28 Shopify order cancellation to NetSuite cancellation (add) SHP → NS Scheduled
29 NetSuite cancellation to Shopify cancellation (add) NS → SHP Scheduled
Payouts
30 Shopify payout to NetSuite custom records (add) SHP → NS Scheduled
31 Shopify payout transactions reconciliation SHP → NS Scheduled
32 Shopify payouts to NetSuite bank deposits SHP → NS Scheduled

Prerequisites

Complete every item in this section before installing the template. Skipping prerequisites is the single most common cause of errors on new installations.

Do not install first

Install the template after confirming all prerequisites are met. If you install and then discover a missing bundle or permission, you will need to reconfigure connections.

NetSuite requirements

1

Install the Celigo integrator.io bundle

In NetSuite, go to Customization > SuiteBundler > Search & Install Bundles. Search for Bundle ID 20038 and install it. This bundle installs the base Celigo restlets needed for all NetSuite communication.

2

Install the Celigo Shopify Connector bundle

In the same bundle installer, search for Bundle ID 81289 and install it. This bundle deploys all 30 NetSuite saved searches the template relies on, plus custom records for the item ID map and store configuration. Do not rename, modify, or delete any search installed by this bundle.

3

Enable Token-Based Authentication

Go to Setup > Company > Enable Features > SuiteCloud. Under the Authentication section, check Token-Based Authentication and save. This is required for Celigo to connect securely to NetSuite.

4

Create a dedicated integration role

Clone the Celigo eTail SmartConnectors role (installed by bundle 81289) and assign it to the NetSuite user account that will run the integration. The cloned role must retain all permissions from the original. Do not use an Administrator role for the integration user — it is a security risk and can cause unexpected behavior.

5

Create an Access Token

Go to Setup > Users/Roles > Access Tokens > New. Set Application to eTail Connectors, select the integration user and the role created in the previous step. Save and copy the Token ID and Token Secret — you will need these when configuring the NetSuite connection in Celigo.

Save your token credentials now

NetSuite shows the Token Secret only once. If you navigate away without copying it, you must create a new token.

Shopify requirements

  • A Shopify store with Admin API access. Basic Shopify plans include this; verify your plan supports API access if you are on a legacy plan.
  • The store owner's login credentials — the store owner account is required to authorize the Celigo Shopify app during connection setup. This cannot be done with a staff account.

The OAuth authorization will request the following API scopes. All are required:

Scope Used for
read_orders, write_orders Syncing orders in both directions
read_products, write_products Creating and updating products from NetSuite
read_inventory, write_inventory Syncing inventory levels and transfer orders
read_fulfillments, write_fulfillments Creating fulfillments in Shopify from NetSuite
read_customers, write_customers Syncing customers in both directions
read_returns, write_returns Processing returns and exchanges
read_markets, write_markets Syncing Shopify market definitions
read_shopify_payments_payouts Retrieving payout data for reconciliation

Celigo requirements

  • An active Celigo integrator.io account with the Shopify – NetSuite connector license. Contact your Celigo account manager if you are unsure whether your subscription includes this connector.
  • Only account owners in integrator.io can authorize the Shopify connection. Ensure the person performing setup has account owner permissions in Celigo.

Install the Template

Find the template in the Celigo marketplace

The template is available in two regional versions. Use the link that matches your Celigo account region:

Not sure which region?

Check the URL you use to log in to Celigo. If it starts with eu.integrator.io you are on the EU instance. If it starts with integrator.io, use the NA link.

1

Open the marketplace listing

Click your regional link above. You will see the template preview page showing the included flows and a description.

2

Click Install

Click the Install button. Celigo will begin the install wizard.

Configure connections

During installation, Celigo will prompt you to configure two connections. Both must be fully authorized before any flow can run.

Shopify Store connection (OAuth 2.0)

This is the single Shopify connection used by all 32 flows — orders, products, inventory, fulfillments, returns, and payouts all use the same connection. It authenticates to your Shopify store via OAuth 2.0 using the Shopify Admin GraphQL API.

1

Enter your store URL

In the connection form, enter your Shopify store URL in the format your-store.myshopify.com. Do not include https://.

2

Authorize via OAuth

Click Authorize. You will be redirected to Shopify to approve the connection. Log in with the store owner account — staff accounts cannot authorize this connection. Review the requested scopes and click Install app.

3

Confirm the connection is saved

After authorization, Celigo redirects you back and the connection status shows Authorized. The base URL is automatically set to https://your-store.myshopify.com/admin/api/2025-07/graphql.json.

NetSuite connection (Token-Based Authentication)

1

Select the NetSuite connection type

Celigo's native NetSuite adaptor handles this connection. Select NetSuite as the connection type (not HTTP).

2

Enter your NetSuite account ID

Your NetSuite account ID is visible in the URL when you are logged in to NetSuite: https://XXXXXX.app.netsuite.com — the number before .app is your account ID.

3

Enter Token-Based Authentication credentials

Enter the Consumer Key, Consumer Secret, Token ID, and Token Secret from the Access Token you created during prerequisites. Then click Save & authorize.

All flows share these two connections

Once authorized, both connections are shared across all 32 flows. If either connection expires or is re-authorized with different credentials, every flow that uses it will be affected. See OAuth expirations in Troubleshooting for recovery steps.

Initial Setup

Before you enable any transactional flow, you must run three one-time setup flows in a specific order and complete two additional configuration steps. This section is the most important part of a new installation — getting it right prevents a category of hard-to-diagnose errors later.

Follow this sequence exactly

The six steps below must happen in order. Enabling transactional flows (orders, fulfillment, inventory) before completing all six steps will produce reference errors because downstream flows look up records that do not yet exist.

Step Action Where
1 Run the Store Sync flow Celigo — flow dashboard
2 Select your Shopify store in Settings Celigo — integration Settings page
3 Run the Markets Sync flow Celigo — flow dashboard
4 Run the Business Entity Sync flow Celigo — flow dashboard
5 Run the Item ID Map flow Celigo — flow dashboard
6 Create discount items and their Item ID map records NetSuite + Celigo Settings

Step 1 · Sync your Shopify store

The very first action after installation is to run the Shopify store to NetSuite custom record (add) flow. This creates a custom record in NetSuite that represents your Shopify store. Every other flow in the template references this record at runtime — if it does not exist, they will all error.

1

Open your integration in Celigo

From the Celigo dashboard, open the Shopify – NetSuite integration tile you just installed.

2

Find the Store Sync flow

In the flow list, locate Shopify store to NetSuite custom record (add). It is in the Setup group. This flow is enabled by default (unlike the transactional flows) because it is designed to be run on-demand.

3

Run the flow

Click Run now. The flow will pull your Shopify store details and create a custom record in NetSuite. The run should complete within seconds and show 1 record processed with no errors.

Re-run after store changes

If you ever change your Shopify store name, add a new Shopify store to the integration, or reconfigure your Shopify Payments settings, re-run this flow on-demand to refresh the store record in NetSuite.

Step 2 · Select the store in Settings

After the store sync flow has created the NetSuite store record, you must return to the integration's Settings page and select that store from a dropdown. This selection tells the integration which store record to associate with all subsequent flows.

1

Open the integration Settings page

From the integration tile, click the Settings (gear) icon or navigate to the Settings tab.

2

Select your store

In the General section of the Settings page, find the Shopify Store dropdown. It should now list the store record just created by the sync flow. Select your store.

3

Save Settings

Click Save. Do not proceed to Step 3 without saving — the markets sync flow reads this setting at runtime.

The store dropdown will be empty if the store sync flow has not run

If you do not see your store in the dropdown, go back to Step 1 and confirm the flow ran successfully with no errors.

Step 3 · Sync markets

Run the Shopify markets to NetSuite (add) flow. This flow reads your Shopify Markets configuration (including currency and region settings) and creates corresponding records in NetSuite. These records are used by the order flow to assign the correct currency and tax treatment to each order.

1

Run the Markets flow

Find Shopify markets to NetSuite (add) in the flow list and click Run now. The flow will create one record per active Shopify Market.

2

Confirm the results

Check the flow run results. You should see one successful record per Shopify market (at minimum, your primary market). If you have international markets configured in Shopify, they will also appear here.

Adding new markets later

If you expand to a new Shopify Market after go-live, re-run this flow on-demand to add the new market record to NetSuite before orders from that market start arriving.

Step 4 · Sync business entity

Run the Shopify business entity to NetSuite (add) flow. This flow syncs your Shopify business entity information — relevant for Shopify Payments multi-entity setups and legal entity separation. The payout flows depend on this record to correctly attribute deposits.

1

Run the Business Entity flow

Find Shopify business entity to NetSuite (add) and click Run now.

2

Confirm the results

The flow should process 1 record with no errors. If your Shopify account has multiple business entities (rare for standard D2C), each will appear as a separate record.

Step 5 · Build the item ID map

Run the Shopify products to item ID map (add or update) flow. This flow reads your Shopify product catalog and creates cross-reference records in NetSuite that map each Shopify product variant (by SKU) to its corresponding NetSuite item internal ID.

This mapping is the structural backbone of the integration. Every order flow, fulfillment flow, and inventory flow depends on these records to resolve Shopify line items into NetSuite item records. Without them, order imports will fail because NetSuite cannot identify which item is on each order line.

1

Confirm items exist in both systems first

Before running this flow, make sure your product catalog is in reasonable sync. Items must exist in NetSuite (either manually entered or imported). The flow matches by SKU — if an item exists in Shopify but has no matching SKU in NetSuite, that item will not get a map record and orders containing it will error.

2

Run the Item ID Map flow

Find Shopify products to item ID map (add or update) and click Run now. For large catalogs this may take several minutes.

3

Review the results

Check how many records were created vs. how many errors occurred. An error typically means a Shopify SKU did not match any NetSuite item. Resolve SKU mismatches before going live with the order flow.

This flow only maps sellable items

The Item ID Map flow maps products that exist in Shopify. Non-sellable items used in transaction logic — such as discount items, shipping items, and refund adjustment items — are not created by this flow. Those must be mapped manually. See Step 6 below.

Step 6 · Set up discount items

If your store uses Shopify discounts (cart-level promotions, line-item markdowns, or both), you must complete this step before enabling the order flow. Skipping it means orders with discounts will error at import because NetSuite cannot resolve the discount item reference.

There are three actions to complete for each discount item you plan to use:

Three systems, three actions — all required

Each discount item requires work in NetSuite (create the item), Celigo Settings (select the item), and NetSuite again (create the Item ID map record). All three must be done, in that order, before the order flow will successfully process orders with discounts.

For cart-level discounts

1

Create a discount item in NetSuite

In NetSuite, create a new Discount item (or use an existing one designated for Shopify cart-level discounts). Note the exact item name — you will need it in Step 3.

2

Select the item in Celigo Settings

In the integration's Settings page, go to the Discounts section. Enable Sync Shopify cart-level discounts and select your NetSuite discount item from the NetSuite discount item dropdown.

3

Create the Item ID map record in NetSuite

In NetSuite, go to the Celigo Shopify Item ID Map custom record list and create a new record manually. Set the Name field to the exact same name as the NetSuite discount item you created in Step 1. This record must exist with a matching name so the order flow's lookup can resolve the discount item at runtime.

The name must match exactly

The lookup is case-sensitive and exact. If your NetSuite item is named Shopify Cart Discount, the Item ID map record name must be Shopify Cart Discount — not shopify cart discount, not Shopify Cart Discount (trailing space). A mismatch causes the order flow to fail silently on any order that contains a discount.

For line-item discounts

Repeat the same three steps for line-level discounts: create a separate NetSuite discount item for line-level discounts, select it under Sync Shopify line-level discounts in Settings, and create a matching Item ID map record in NetSuite with the exact same item name.

Best practice for go-live prep

Before going live, list every NetSuite item referenced anywhere in the Settings form (discount items, shipping items, refund adjustment items, etc.) and confirm each one has a manually-created Item ID map record in NetSuite with an exactly matching name. This five-minute check prevents the most common category of first-week production errors.

Configure Settings

The integration's Settings page controls how data moves between Shopify and NetSuite. Most settings are configured once at go-live and rarely changed. This section explains each setting group, what each field does, and what happens if you leave it at its default.

Settings are grouped on the page as follows:

Each field in the Settings form is tagged with one of three labels:

Label Meaning
Required Must be set before the related flow can be enabled. Celigo will block enablement until these are configured.
Optional Can be left at its default in most implementations.
Conditional Optional in the form but becomes effectively required when a specific scenario applies. The scenario is noted inline. Skipping a Conditional field when your scenario applies is one of the most common causes of silent data issues post go-live.

Order settings

These settings control how Shopify orders are picked up and how they land in NetSuite.

Setting Tag What it does
Sync web orders based on Shopify order status Optional Controls whether orders sync when their financial status is authorized, captured, or fulfilled. The default covers most D2C setups (paid orders sync immediately). Change only if your order-to-cash process captures payment at a different stage.
Sync POS orders as Sales Orders Conditional When enabled, Shopify POS orders create Sales Orders in NetSuite instead of Cash Sales. Required only when Shopify POS is in scope for your implementation.
Filter orders by Required Choose Last updated time or Creation time for delta filtering. This controls how the flow identifies new and changed orders on each run. Last updated time is the recommended choice for most stores as it also picks up order edits.
Lag for the next flow run Required Number of minutes to subtract from the previous run time. This buffer ensures orders have enough time to reach their final financial status before being picked up. A 10–15 minute lag is recommended for most stores. See Scheduling best practices sectionc for guidance.
Sync pending payment orders Conditional Enable to sync orders in pending financial status. Required when your store accepts B2B orders on invoice terms, cash-on-delivery, or any payment method where capture is deferred.
Assign NetSuite order status as Pending Approval Conditional Places high-risk Shopify orders into Pending Approval status in NetSuite rather than Pending Fulfillment. Required if your operations team runs a fraud review before releasing orders to the warehouse.
Sync sales channel orders Conditional Enable to include orders from additional Shopify sales channels (such as social commerce integrations). Required only if you sell through channels beyond your primary Shopify storefront.

Discount and tax settings

Tax settings have hard requirements because tax posting is critical to your GL. Discount settings are conditional — only relevant if you use discounts.

Complete Step 6 of Initial Setup before configuring discounts

If you enable the discount settings here without first creating the NetSuite discount items and their Item ID map records, every order with a discount will fail at import. See Set up discount items.

Setting Tag What it does
Sync sales tax to NetSuite as Required Choose the tax sync method. Overwrite NetSuite tax is strongly recommended — it ensures NetSuite reflects the exact tax amount charged in Shopify. Also sets the default tax code for US and Canadian orders (both sub-fields are also Required).
Sync Shopify cart-level discounts Conditional Controls how cart-level promotions (discount codes applied at checkout) are represented on the NetSuite transaction. Required when your store runs any cart-wide discount promotions. Must be paired with a discount item — see below.
Sync Shopify line-level discounts Conditional Controls how per-item markdowns are represented in NetSuite. Required when your store uses automatic discounts or scripts that apply discounts at the line level.
NetSuite discount item Conditional The NetSuite item record used to represent discount amounts on transactions. Required whenever either discount setting above is enabled. Must be created in NetSuite first and must have a matching Item ID map record. See Set up discount items section.
Per-line taxes on transaction enabled Conditional Check this if your NetSuite account is configured for line-level taxation rather than header-level tax. Required when NetSuite uses per-line tax codes (common in multi-jurisdiction or VAT configurations).
Sync GST/VAT for customer country Conditional Manages tax inclusion and exclusion per country. Required for any store selling to customers outside the US or Canada.

Shipping and payment mappings

Both mappings are conditional. They are only strictly necessary when you have more than one shipping method or payment gateway — but skipping them when multiple values exist means every order lands on the default and reports incorrectly downstream.

Setting Tag What it does
Map Ship Methods Conditional Maps each Shopify shipping method name to the corresponding NetSuite ship method. Includes a default fallback for methods not in the map. Required when Shopify offers more than one shipping option. Supports unlimited entries.
Map Payment Methods Conditional Maps each Shopify payment gateway (e.g., shopify_payments, paypal, gift_card) to the corresponding NetSuite payment method. Required when you accept more than one payment gateway. Without this mapping, all orders land on the configured default payment method in NetSuite regardless of how the customer actually paid.

Product and inventory settings

These settings control how NetSuite catalog data and inventory levels are published to Shopify.

Setting Tag What it does
NetSuite currency for product price sync Required The currency used when syncing prices from NetSuite to Shopify. Must match the currency on the NetSuite price level you select below.
NetSuite price level for product price sync Required The price level on the NetSuite item record that is used as the source of truth for the Shopify selling price.
NetSuite price level for compare-at price sync Required The price level used to populate Shopify's Compare-at price (also called MSRP or original price). Typically set to a higher price level to show a crossed-out price on the product page.
Parent item field for virtual variations Required The NetSuite item field that groups virtual variation children under a parent product. This field is always required — if you are not using virtual variations, leave it at its default value.
Each product in Shopify has a unique title Optional When enabled, the product sync checks for duplicate product titles before creating a new product. Recommended on for most catalogs to prevent accidental duplicate products in Shopify.
Enable virtual variations Conditional For stores where NetSuite holds items as individual SKUs but Shopify needs them grouped as product variants (without a NetSuite matrix structure). Required when this catalog pattern applies to your business.
NetSuite locations to pick inventory from Conditional Controls which NetSuite warehouse locations contribute to inventory synced to Shopify. Required when you run multi-location inventory in NetSuite and only a subset of locations should feed Shopify's available stock.
Location mapping Conditional Maps NetSuite warehouse locations to Shopify locations on a 1:1 or many-to-1 basis. Required when you have more than one Shopify fulfillment location, or when inventory from multiple NetSuite warehouses should aggregate into a single Shopify location.

Billing settings

Billing settings are only relevant if you are using the auto-billing flow (Flow 20: NetSuite sales order to NetSuite invoice or cash sale). If auto-billing is not in scope for your implementation, leave these at their defaults.

Setting Tag What it does
Auto-bill orders when status is Conditional Defines the NetSuite sales order status that triggers auto-billing: Pending Billing or Pending Fulfillment. Required when the auto-bill flow is enabled. Choose based on your order-to-cash policy — bill before or after shipping.
Payments captured in Conditional Specifies where payment capture happens: Shopify at sale, NetSuite after fulfillment, or Shopify after fulfillment. Required when your billing model differs from the default (Shopify captures payment at checkout). This setting affects how the billing and customer deposit flows interact.

Payout settings

These settings are required before enabling any of the three payout flows.

Setting Tag What it does
Bank account mapping Required Maps Shopify Payments payouts to the correct NetSuite bank account. Also sets the variance account — the GL account used when a payout total does not reconcile perfectly (fees, disputes, rounding). Payouts cannot post to NetSuite without this mapping.
Payout status to sync Required Controls which Shopify payout statuses trigger the reconciliation flow. Typically set to paid for most implementations. You can also include in_transit if you need to record payouts before they settle.
Payout lag setting Optional Delays payout reconciliation by a configured number of hours to allow all related transactions (orders, refunds, adjustments) time to reach NetSuite before reconciliation runs. Technically optional, but a 24-hour lag is strongly recommended in production. See Scheduling best practices.

NetSuite saved searches

The template relies on 30 saved searches in NetSuite, all installed by the Shopify Connector bundle (81289). They are prefixed customsearch_celigo_shopify_ and are referenced by the integration at runtime.

Do not rename or delete these saved searches

Flows reference saved searches by their internal ID. Renaming or deleting a search will break every flow that uses it. If a search needs to be modified (e.g., to add a filter), clone it first and work from the clone while keeping the original intact.

Saved Search ID Used by flow Purpose
customsearch_celigo_shopify_item_id_map Shopify products → item ID map Cross-reference lookup: Shopify variant → NetSuite item ID
customsearch_celigo_shopify_find_order Order transactions → custom record Resolves the NetSuite sales order for a given Shopify transaction
customsearch_celigo_shopify_fulfillments NS fulfillment → Shopify fulfillment Exports item fulfillments ready to sync to Shopify
customsearch_celigo_shopify_billing_expo NS billing → Shopify billing Exports invoices and cash sales tied to Shopify orders
customsearch_celigo_shopify_bll_tp_exp Shopify refund → NS refund Identifies the correct billing transaction type (invoice vs. cash sale) to refund against
customsearch_celigo_shopify_ns_cncld_rds NS cancellation → Shopify cancellation Exports orders cancelled in NetSuite
customsearch_celigo_shopify_inv_sync_exp NS inventory → Shopify inventory Exports current inventory quantities per item per location
customsearch_celigo_shopify_orders_billi SO → invoice or cash sale Pulls sales orders ready for auto-billing
customsearch_celigo_shopify_rfnd_cm_amt Shopify refund → NS refund Returns remaining refundable credit memo balance (prevents double-refunding)
customsearch_celigo_shopify_credit_statu Exchange orders Checks credit memo status before creating exchange order
customsearch_celigo_shopify_rfd_dp_exp Shopify refund → NS refund Finds the customer deposit for deposit-backed refunds
customsearch_celigo_shopify_exchange_lin Exchange orders Retrieves original NetSuite order lines for exchange linkage
customsearch_celigo_shopify_lines_return Requested returns → RMA Retrieves original order lines to correctly build the return authorization
customsearch_celigo_shopify_trans_to_ns Order transactions → customer deposit Pulls Shopify payment transactions tied to orders
customsearch_celigo_shopify_rma_pending Pending RMA → Shopify approval Exports RMAs approved in NetSuite but not yet received
customsearch_celigo_shopify_received_rma Received RMA → process return Exports RMAs with item receipts posted (warehouse received the goods)
customsearch_celigo_shopify_receipts_rma Received RMA → process return Pulls the specific item receipt tied to an RMA
customsearch_celigo_shopify_ctmr_crtn_pd NS customer → Shopify customer Exports customers created or updated in NetSuite
customsearch_celigo_shopify_m_item_exp NS matrix items → Shopify product Exports matrix parent items with their child variants
customsearch_celigo_shopify_sim_item_exp NS items → Shopify product Exports simple (non-matrix) items
customsearch_celigo_shopify_prod_met_exp NS item metafields → Shopify metafields Exports NetSuite item attributes to sync as Shopify metafields
customsearch_celigo_shopify_tro_to_expor NS transfer orders → Shopify inventory transfer Exports approved transfer orders
customsearch_celigo_shopify_orderexpor_2 NS order → Shopify order Exports NetSuite-originated sales orders to push to Shopify
customsearch_celigo_shopify_refundexpo NS refund → Shopify refund Exports NetSuite-originated credit memos and customer refunds
customsearch_celigo_shopify_invoice_stat Exchange orders Checks exchange invoice status to prevent double-billing
customsearch_celigo_shopify_pay_for_reco Payout reconciliation Exports payouts ready for reconciliation
customsearch_celigo_shopify_pay_to_depos Payouts → bank deposits Exports payouts ready to become bank deposit records
customsearch_celigo_shopify_pay_trans_re Payout reconciliation Returns payout transaction details for matching
customsearch_celigo_shopify_pay_tra_to_d Payouts → bank deposits Retrieves payout transaction lines for the deposit record
customsearch_celigo_shopify_pay_ns_trans Payout reconciliation Finds the NetSuite GL transactions that match each payout line

Flows: Orders and Customers

This group contains six flows covering the full bidirectional order and customer lifecycle. For most merchants, the Shopify → NetSuite order flow and the two customer sync flows are the most critical flows in the entire integration.

Shopify order to NetSuite sales order or cash sale (add)
SHP → NSScheduled

The primary order flow. Exports new orders from Shopify via GraphQL and imports them into NetSuite as either a Sales Order or a Cash Sale, depending on how the order was placed and whether the customer has payment terms.

Depends on: Item ID map (Step 5), Customer sync, Store sync (Step 1), Settings configured

What this flow does

On each scheduled run, the flow queries Shopify for orders that match your configured filter (new or updated since the last run). For each order, it:

  1. Retrieves the customer's address history from Shopify.
  2. Retrieves any order-level metafields.
  3. Retrieves fulfillment order details (assigned warehouse locations, delivery methods) for each line item.
  4. Creates or updates the customer record in NetSuite.
  5. Routes the order to either a Cash Sale or Sales Order branch (see routing logic below).

Routing logic: Cash Sale vs. Sales Order

The flow uses first-matching-branch logic to decide the NetSuite record type:

Branch Conditions
Cash Sale Shopify POS order with Fulfilled status and Sync POS as Sales Orders is off — or — order financial status is Paid or Partially Refunded
Sales Order Order status is Unfulfilled — or — POS order with Sync POS as Sales Orders enabled
Orders that match neither branch

If an order's status combination does not match either branch, the flow generates an error for that record. This typically means an order is in an edge-case status (e.g., authorized but not yet captured, with a fulfilled status). Review the order's Shopify financial status against your configured trigger setting.

What to configure

What to check if orders are not syncing

See Orders not syncing in Troubleshooting.


NetSuite order to Shopify order (add)
NS → SHPScheduled

Pushes NetSuite-originated sales orders to Shopify so the storefront shows an order record for sales written directly in the ERP — phone orders, B2B orders entered in NetSuite, or manual corrections.

Depends on: Items exist in both systems, Shopify store connected

What this flow does

Reads from the saved search customsearch_celigo_shopify_orderexpor_2, which filters for NetSuite sales orders that did not originate from Shopify (preventing echo loops). For each qualifying order, the flow creates an order record in Shopify with line items, pricing, customer reference, and transaction details.

When to enable this flow

Enable this flow only if your team enters sales orders directly in NetSuite that need to appear in Shopify. For stores where 100% of orders originate in Shopify, this flow can remain disabled.


Shopify customer to NetSuite customer (add or update)
SHP → NSScheduled

Exports customers from Shopify and creates or updates them in NetSuite. Uses email address as the matching key — if a NetSuite customer with the same email already exists, the record is updated rather than duplicated.

What this flow does

Queries Shopify for customers created or updated since the last run. For each customer, looks up an existing NetSuite customer by email. If a match is found, the record is updated. If no match is found, a new customer is created. Address information, phone, and company details are included.

Also runs inline during order sync

The primary order flow (Shopify → NetSuite) also creates or updates the customer record as part of each order import. You do not strictly need to run this customer flow before the order flow — but running it independently ensures your customer database stays in sync between orders.

What to check if customers are not syncing

See Customer duplicates in Troubleshooting.


NetSuite customer to Shopify customer (add or update)
NS → SHPScheduled

Exports customers from NetSuite and creates or updates them in Shopify. Covers customers created directly in NetSuite — by customer service reps, during wholesale onboarding, or via manual data entry — who may not yet have a Shopify account.

Depends on: Saved search customsearch_celigo_shopify_ctmr_crtn_pd

What this flow does

Reads the saved search customsearch_celigo_shopify_ctmr_crtn_pd for customers created or updated in NetSuite. For each customer, looks up whether a matching Shopify customer exists (by email). Routes to a Create branch or Update branch accordingly. After creation or update, also syncs customer metafield definitions and values from NetSuite attributes.


Shopify order transaction to NetSuite customer deposit (add)
SHP → NSScheduled

When a Shopify order transaction represents a payment against a sales order (for example, an authorization against an order on net payment terms), this flow creates a Customer Deposit record in NetSuite linked to that sales order.

Depends on: Order flow has already created the NetSuite Sales Order

When to enable this flow

Enable this flow if your store uses a billing model where payment is authorized or captured at checkout but the NetSuite record is a Sales Order (not a Cash Sale) — for example, B2B customers on net terms, or stores where billing happens after fulfillment. The deposit record bridges the gap between Shopify's payment capture and NetSuite's invoice-based billing flow.

How it works

Reads the saved search customsearch_celigo_shopify_trans_to_ns for Shopify payment transactions tied to orders. Creates a Customer Deposit in NetSuite against the corresponding Sales Order. When the billing flow later creates an Invoice, it can apply this deposit to close the balance.


Shopify order transaction to NetSuite custom transaction record (add)
SHP → NSScheduled

Captures order transactions that do not map cleanly to a native NetSuite transaction — such as gift card top-ups or alternative payment methods. Creates a custom transaction record tied to the Shopify order for reporting and reconciliation.

Depends on: Order flow has already created the NetSuite Sales Order; saved search customsearch_celigo_shopify_find_order

When to enable this flow

Enable this flow if your store accepts payment methods beyond standard credit cards and Shopify Payments — for example, gift cards, store credit, layaway payments, or custom integrations. If all your orders use a single standard payment method that maps cleanly to a NetSuite payment method, this flow can remain disabled.

Flows: Fulfillment

Fulfillment flows close the loop between your warehouse operations and your Shopify storefront. The NetSuite → Shopify direction is the most visible to customers: it triggers the "your order has shipped" email with tracking information. The Shopify → NetSuite direction is relevant when fulfillment is initiated in Shopify (for example, by a 3PL that uses Shopify as its order management interface).

NetSuite fulfillment to Shopify fulfillment (add)
NS → SHPScheduled

Exports item fulfillment records from NetSuite and creates fulfillments in Shopify, triggering shipment notifications with tracking numbers to customers. This is the flow that marks Shopify orders as fulfilled.

Depends on: Order flow, saved search customsearch_celigo_shopify_fulfillments

What this flow does

Reads customsearch_celigo_shopify_fulfillments for new item fulfillments in NetSuite. For each fulfillment, checks the current Shopify order fulfillment status to prevent duplicates, retrieves the assigned fulfillment order IDs and locations from Shopify, then creates the fulfillment using the Shopify fulfillmentCreate GraphQL mutation. Tracking numbers, carrier names, and tracking URLs are included when available.

This flow supports:

  • Multiple tracking numbers per shipment
  • Split shipments (partial fulfillments on a single order)
  • Carriers not natively recognized by Shopify (via tracking URL)

What to configure


Shopify fulfillment to NetSuite fulfillment (add)
SHP → NSScheduled

Imports Shopify fulfillments into NetSuite as Item Fulfillment records. Used when fulfillment is initiated in Shopify rather than in NetSuite — for example, when a 3PL fulfills through a Shopify app.

Depends on: Order flow has created the NetSuite Sales Order

When to enable this flow

Enable this flow if your fulfillment workflow starts in Shopify. If NetSuite is your warehouse management system and item fulfillments always originate in NetSuite, this flow can remain disabled — use the NS → Shopify direction only.


Shopify hold fulfillments on payment pending release
SHPScheduled

Monitors Shopify fulfillment orders that are on hold pending payment capture — a state that occurs in exchange upsell scenarios. When NetSuite captures the additional payment and releases the hold, this flow releases the fulfillment hold in Shopify so the order can ship.

Depends on: Order flow, Exchange flow

When to enable this flow

Enable this flow only if you process exchanges where the replacement item costs more than the returned item (upsell exchanges). The additional charge creates a fulfillment hold in Shopify until payment is captured. If you do not process exchanges, or your exchange flows never require additional payment, this flow can remain disabled.

Flows: Products and Inventory

This group manages your product catalog and inventory levels. NetSuite is the system of record for catalog data — prices, descriptions, images, and item attributes originate in NetSuite and sync to Shopify. For most merchants, these flows run on a longer interval (hourly or every few hours) since catalog changes are less time-sensitive than orders.

NetSuite matrix items to Shopify product (add or update)
NS → SHPScheduled

Exports matrix items (parent + variants) from NetSuite and creates or updates them as Shopify products with variants, using the Shopify GraphQL ProductSet mutation. Supports up to 2,048 variants per product.

Depends on: Saved search customsearch_celigo_shopify_m_item_exp

What syncs

  • Product title and description
  • Selling price and compare-at (MSRP) price from the configured NetSuite price levels
  • Product images
  • Metafields (if the metafields flow is also enabled)
  • HS codes and country of origin
  • Inventory tracking status (controlled by the Shopify Do Not Track Inventory field on the NetSuite variant)

After creating or updating the Shopify product, the flow writes the Shopify product and variant IDs back to the NetSuite Item ID map record.

Matrix items vs. simple items

Use this flow for items that have a parent-child matrix structure in NetSuite (for example, a T-shirt with size and color variants). For standalone items with no variants, use the simple items flow. Both flows can run simultaneously.


NetSuite items to Shopify product (add or update)
NS → SHPScheduled

Catalog companion to the matrix items flow. Exports simple (non-matrix) NetSuite items and creates or updates them as flat Shopify products.

Depends on: Saved search customsearch_celigo_shopify_sim_item_exp

What syncs

Same fields as the matrix items flow (title, description, price, compare-at, images, HS codes, country of origin, inventory tracking status). After creating the Shopify product, the Shopify product ID is written back to the NetSuite Item ID map.


NetSuite item metafields to Shopify product metafields (add or update)
NS → SHPScheduled

Pushes custom NetSuite item attributes into Shopify metafields. Enables your storefront to display ERP-managed data — material, fit details, care instructions, country of origin, custom attributes — without a separate PIM system.

Depends on: Products must exist in Shopify first (run item sync flows before this flow); saved search customsearch_celigo_shopify_prod_met_exp

When to enable this flow

Enable this flow if you have product attributes stored in NetSuite that your Shopify theme displays using metafields. Common examples: fabric content, sizing guides, warranty information, regulatory certifications. If your product data only needs title, description, and price from NetSuite, this flow can remain disabled.


Shopify products to item ID map (add or update)
SHP → NSScheduled

Utility flow. Reads your Shopify product catalog and creates or updates Item ID map records in NetSuite by matching Shopify variant SKUs to NetSuite internal item IDs. This is the cross-reference lookup that every order, fulfillment, and inventory flow depends on.

Depends on: Items must exist in NetSuite with matching SKUs; saved search customsearch_celigo_shopify_item_id_map
This is a required flow — not optional

Even if NetSuite is your catalog source of record, this flow must run to populate the Item ID map. The NS → Shopify product flows write the Shopify product ID back to NetSuite after creating products, but this Shopify → NS flow is what keeps the map current when products are added or modified in Shopify directly. Run this flow at least once before enabling the order flow.


NetSuite inventory to Shopify inventory (add or update)
NS → SHPScheduled

Syncs available inventory quantities from NetSuite to Shopify. Prevents overselling when stock changes in NetSuite for reasons beyond Shopify sales — warehouse receipts, transfers, manual adjustments, marketplace fulfillment.

Depends on: Item ID map populated, location mapping configured; saved search customsearch_celigo_shopify_inv_sync_exp

What this flow does

Reads per-item, per-location inventory quantities from NetSuite using the saved search. Updates Shopify inventory levels using the inventorySetQuantities GraphQL mutation. Supports:

  • Simple items, matrix items, kit/assembly items, and item groups
  • Multi-location inventory with 1:1 or many-to-1 location mapping
  • Inventory aggregation across multiple NetSuite locations into a single Shopify location

What to configure

Set NetSuite locations to pick inventory from and Location mapping in Product and inventory settings if you have multiple warehouses or Shopify locations.


NetSuite Transfer Orders to Shopify Inventory Transfer (add or update)
NS → SHPScheduled

Mirrors approved NetSuite Transfer Orders into Shopify's Inventory Transfers feature, so the storefront reflects in-transit stock before it physically arrives at the destination. Keeps available-for-sale quantities aligned with NetSuite as stock moves between locations.

Depends on: Item ID map, location mapping configured; saved search customsearch_celigo_shopify_tro_to_expor

When to enable this flow

Enable this flow if you manage inventory across multiple warehouse or retail locations and use NetSuite Transfer Orders to move stock between them. Not relevant for single-location operations.


Shopify received Inventory Transfer to NetSuite Item Receipt for Transfer (add)
SHP → NSScheduled

The reverse of the transfer order flow. When a Shopify Inventory Transfer is marked as received, this flow creates the corresponding Item Receipt for Transfer in NetSuite, confirming the stock has physically arrived.

Depends on: Transfer Order flow (NS → Shopify) has run first

Flows: Billing

The billing flows handle the conversion of NetSuite Sales Orders into billed transactions and the corresponding update of Shopify order status. These flows are only relevant if your billing model creates invoices or cash sales in NetSuite after order entry — they are not needed if you always create Cash Sales directly from Shopify orders.

NetSuite sales order to NetSuite invoice or cash sale (add)
NS InternalScheduled

An internal NetSuite flow that auto-bills Sales Orders by creating either an Invoice (for customers with payment terms) or a Cash Sale (for immediate payment). This is the auto-billing trigger — it converts an approved SO into a billed transaction.

Depends on: Sales Orders exist in NetSuite; auto-bill settings configured; saved search customsearch_celigo_shopify_orders_billi

Routing logic

Branch Condition
Invoice The NetSuite customer record has a Terms field populated (customer has payment terms)
Cash Sale The Terms field is empty (immediate payment)
Billing model determines which branch applies

Configure the Auto-bill orders when status is setting in Billing settings to match your order-to-cash policy. If you bill before shipping, use Pending Fulfillment. If you bill after shipping, use Pending Billing.


NetSuite billing to Shopify billing (add)
NS → SHPScheduled

Exports billing transactions (invoices and cash sales) from NetSuite and marks the corresponding Shopify orders as paid. Keeps Shopify's financial status in sync with NetSuite as the system of record for billing.

Depends on: Billing flow (SO → invoice/cash sale) has run; saved search customsearch_celigo_shopify_billing_expo

What this flow does

Reads invoices and cash sales from NetSuite that are linked to Shopify orders. For each billing record, retrieves the Shopify order total for validation, then marks the Shopify order as paid using the orderMarkAsPaid GraphQL mutation. Routes to an Invoice or Cash Sale branch based on the NetSuite record type.

Flows: Refunds

Refund flows handle money moving back to customers. Both directions exist: Shopify-initiated refunds (customer service refunds through Shopify admin) sync to NetSuite, and NetSuite-initiated refunds (credit memos created in the ERP) sync back to Shopify.

Shopify refund to NetSuite refund (add)
SHP → NSScheduled

Imports Shopify refunds into NetSuite, creating the correct refund transaction based on how the original order was billed. Three billing scenarios are handled: cash sale, invoice, or customer deposit.

Depends on: Original billing transaction exists in NetSuite; saved searches for billing type lookup and deposit lookup

Routing logic

Branch Condition NetSuite record created
Cash Sale Original billing was a Cash Sale Customer Refund against the Cash Sale
Invoice Original billing was an Invoice Credit Memo → Customer Refund (if applicable)
Deposit No billing transaction, but a Customer Deposit exists Customer Refund against the Customer Deposit

Saved searches used

  • customsearch_celigo_shopify_bll_tp_exp — Identifies whether the original NetSuite transaction was an invoice or cash sale, determining which branch the router takes.
  • customsearch_celigo_shopify_rfd_dp_exp — Finds the Customer Deposit for orders that were never billed (cancelled after payment, partially fulfilled).
  • customsearch_celigo_shopify_rfnd_cm_amt — Returns the already-applied Credit Memo balance to prevent double-refunding on partial refunds.

NetSuite refund to Shopify refund (add)
NS → SHPScheduled

Exports Credit Memos and Customer Refunds created in NetSuite and creates the corresponding refund in Shopify. Keeps Shopify financials in sync when refunds are issued from the ERP rather than through the Shopify admin.

Depends on: Original Shopify order exists; saved search customsearch_celigo_shopify_refundexpo

Flows: Returns and Exchanges

This is the most complex flow group in the template, involving four interconnected flows that manage the full return and exchange lifecycle between Shopify's Returns API and NetSuite Return Authorizations (RMAs). These flows must be enabled together and in the correct order.

Shopify requested returns to NetSuite return authorization (add)
SHP → NSScheduled

Creates Return Material Authorizations (RMAs) in NetSuite when customers initiate returns through Shopify. This is the first step in the return lifecycle — it captures the customer's return request and opens a formal RMA in the ERP.

Depends on: Original Sales Order in NetSuite; saved search customsearch_celigo_shopify_lines_return

What this flow does

Finds orders with return requests in Shopify. For each return, retrieves: return line details (items, quantities, restocking fees, return shipping fees), any linked exchange order, the original NetSuite order lines for linkage, and returnable fulfillment records.

Creates an RMA in NetSuite linked to the original sales order. Also creates item receipt records and updates the cross-reference with the Shopify return ID. Separate RMAs are created for original orders and exchange orders. If no matching sales order is found in NetSuite, a standalone unverified RMA is created.


NetSuite pending receipt RMA to approved return in Shopify
NS → SHPScheduled

When a return authorization in NetSuite moves to Pending Receipt status (the RMA has been approved but goods not yet received), this flow automatically approves the corresponding return in Shopify. Gates the customer-facing return status on the ERP's approval workflow.

Depends on: Return Authorization exists in NetSuite (created by the previous flow); saved search customsearch_celigo_shopify_rma_pending

Routing logic

Branch Condition Action in Shopify
Approve RMA status = Pending Receipt AND Shopify return status = REQUESTED Approves the return in Shopify
Cancel RMA status = Closed AND Shopify return status = REQUESTED Cancels the return in Shopify

NetSuite received RMA to process return and exchange in Shopify
NS → SHPScheduled

When items are physically received against an RMA in NetSuite (an Item Receipt is posted), this flow processes the return in Shopify: restocking items, mapping dispositions, and triggering refunds or exchange fulfillments as appropriate.

Depends on: Item Receipt posted against RMA in NetSuite; saved searches customsearch_celigo_shopify_received_rma and customsearch_celigo_shopify_receipts_rma

Routing logic

Uses all-matching-branches routing — both branches can execute on the same record:

Branch Condition What happens
Receive There are line items to receive (linesToReceive.length > 0) Processes the return in Shopify, restocks items, maps return dispositions
Remove There are line items to remove (linesToRemove.length > 0) Removes line items from the Shopify return that were not physically received

Shopify order to NetSuite order (cash sale or sales order) – Exchanges
SHP → NSScheduled

Handles exchange orders created through Shopify's Returns API. When a return with an exchange is processed, Shopify creates a new linked exchange order — this flow imports that exchange order into NetSuite, linked to both the original order and the return authorization.

Depends on: Original order in NetSuite, Return Authorization exists; saved searches for exchange line lookup, credit memo status, and invoice status

Routing logic

Branch Condition
Sales Order Original NetSuite order was a Sales Order AND exchange order has a legacy ID
Cash Sale Original NetSuite order was a Cash Sale AND exchange order has a legacy ID

Each branch creates the exchange order and updates related records: RMA links, credit memo status, and invoice status. The saved searches act as guard rails to ensure the exchange order is only created once and that the offsetting credit exists before proceeding.

Flows: Cancellations

Cancellation flows handle orders that are cancelled in either system, ensuring both Shopify and NetSuite reflect the cancelled state.

Shopify order cancellation to NetSuite cancellation (add)
SHP → NSScheduled

Imports Shopify order cancellations into NetSuite by closing the corresponding Sales Order. When a customer cancels through Shopify or a staff member cancels from the Shopify admin, this flow updates the NetSuite record.

Depends on: Original Sales Order in NetSuite

NetSuite cancellation to Shopify cancellation (add)
NS → SHPScheduled

Exports fully cancelled orders from NetSuite and cancels them in Shopify. Also retrieves the cancellation timestamp from Shopify and writes it back to the NetSuite record to maintain the audit trail.

Depends on: Order in both systems; saved search customsearch_celigo_shopify_ns_cncld_rds

Flows: Payouts

The three payout flows together form a pipeline that reconciles Shopify Payments settlements against NetSuite GL transactions and creates bank deposit records. They must run in sequence and only after all transactional flows (orders, refunds, billing) have completed for a given period.

Payout flows must run in order

Run order: 1. Payout to custom records → 2. Payout reconciliation → 3. Bank deposits. The reconciliation flow depends on records created by the first flow, and the bank deposit flow depends on reconciliation completing. Use lag settings to enforce this sequence. See Scheduling best practices.

Shopify payout to NetSuite custom records (add)
SHP → NSScheduled

Step 1 of the payout pipeline. Imports Shopify payout summaries into a NetSuite custom record, capturing net sales, fees, and deposit amounts for each payout period.

What this flow does

Queries the Shopify Payments API (through the same Shopify Store connection — no separate Payments connection is needed) for payouts matching the configured status filter. For each payout, retrieves individual payout transactions and associated fees, then creates a custom record in NetSuite capturing the payout summary.


Shopify payout transactions reconciliation
SHP → NSScheduled

Step 2 of the payout pipeline. Matches individual payout transaction lines against existing NetSuite records (cash sales, invoices, refunds). Identifies variances, fees, and disputes for GL tracking.

Depends on: Payout custom record exists (Flow 30 ran first); all related orders and refunds have synced to NetSuite; saved searches customsearch_celigo_shopify_pay_for_reco, _pay_trans_re, _pay_ns_trans

Saved searches used

  • customsearch_celigo_shopify_pay_for_reco — Exports payouts that need reconciliation.
  • customsearch_celigo_shopify_pay_trans_re — Returns payout transaction detail for matching.
  • customsearch_celigo_shopify_pay_ns_trans — Finds the matching NetSuite GL transactions (invoices, cash sales, credit memos, refunds) for each payout line. This is the search that closes the loop between Shopify Payments settlements and your NetSuite general ledger.

Shopify payouts to NetSuite bank deposits
SHP → NSScheduled

Step 3 of the payout pipeline. Creates Make Deposit records in NetSuite, moving funds from undeposited funds into the configured bank account GL. Links each deposit to the payout custom record for traceability.

Depends on: Payout reconciliation completed; saved searches customsearch_celigo_shopify_pay_to_depos and customsearch_celigo_shopify_pay_tra_to_d

Enable Flows and Schedule

Enabling flows in the wrong order is the most common cause of errors on new installations. This section covers which flows depend on which, the recommended first-time enablement sequence, and how to set schedules and lag times for production operation.

Do not mass-enable all flows at once

All 32 flows ship disabled. Enable them one group at a time in the order shown below. Enabling a flow before its dependencies are met will generate reference errors that are difficult to diagnose after the fact.

Dependency order

Each flow depends on records created by earlier flows. This table shows what each flow requires before it can run successfully.

Flow Depends on Notes
Store sync Nothing Run first. Creates the NetSuite store record everything else references.
Markets sync Store sync + Store selected in Settings Run after store sync and after selecting the store in Settings.
Business entity sync Store sync Run after store sync.
Shopify products to item ID map Items in NetSuite with matching SKUs Must run before the order flow.
NS matrix items → Shopify product Nothing (NS as source) Run before item ID map if catalog is managed in NetSuite.
NS simple items → Shopify product Nothing (NS as source) Pairs with matrix items flow; safe to run simultaneously.
NS item metafields → Shopify Products must exist in Shopify Run after item sync flows.
Shopify customer → NS customer Nothing Can run independently; also runs inline during order sync.
NS customer → Shopify customer Nothing Independent direction; can run alongside Shopify → NS.
Shopify order → NS sales order or cash sale Item ID map, customer records, store sync The most dependent flow — all initial setup must be complete.
NS order → Shopify order Items in NetSuite, Shopify store connected Enable only if back-office orders are in scope.
Order transaction → customer deposit Order flow has created the NS Sales Order Run after the order flow.
Order transaction → custom record Order flow has created the NS Sales Order Run after the order flow.
NS fulfillment → Shopify fulfillment Order flow Reads NetSuite Item Fulfillment records.
Shopify fulfillment → NS fulfillment Order flow Requires the NS Sales Order to exist.
Hold fulfillments on payment pending Order flow, exchange flow Enable only for exchange upsell scenarios.
NS inventory → Shopify inventory Item ID map, location mapping Enable after item ID map is populated.
NS transfer orders → Shopify Item ID map, location mapping Enable only for multi-location operations.
Shopify received transfers → NS Transfer order flow Runs after the NS → Shopify transfer flow.
SO → invoice or cash sale (billing) Sales Orders in NetSuite, billing settings configured Enable only if using auto-billing.
NS billing → Shopify billing Billing flow (SO → invoice/cash sale) Requires NS invoice or cash sale to exist.
Shopify refund → NS refund Order flow + original billing transaction in NS Requires original billing transaction.
NS refund → Shopify refund Order flow Requires credit memo or customer refund in NS.
Requested returns → NS RMA Original Sales Order in NS Requires original order to exist.
Pending RMA → Shopify approval RMA created by returns flow Second step in the return lifecycle.
Received RMA → process return Item receipt posted in NS Third step in the return lifecycle.
Exchange orders Order flow, return authorization exists Enable with the other returns flows.
Shopify cancellation → NS Order flow (order must exist in NS) Enable after the order flow.
NS cancellation → Shopify Order flow (order must exist in both) Enable with the Shopify → NS direction.
Payout to custom records Payout settings configured First of the three payout flows.
Payout reconciliation Payout flow ran; all transactions in NS Second payout flow; needs 24h lag.
Payouts → bank deposits Payout reconciliation completed Third and final payout flow.

First-time enablement sequence

Follow this sequence when enabling flows for the first time on a new installation. Complete each group before moving to the next.

1

Setup flows (run once, on-demand)

Run the three setup flows manually in this order: Store sync → (select store in Settings) → Markets sync → Business entity sync. These are not scheduled — run them now and again whenever your store configuration changes.

2

Item catalog flows

Enable and run: NS matrix items → Shopify product and NS simple items → Shopify product (run both, they are independent). Then run NS item metafields → Shopify after products exist in Shopify. Then run Shopify products to item ID map.

3

Customer flows

Enable both customer sync flows: Shopify customer → NS and NS customer → Shopify. Let them run at least once before enabling the order flow to pre-populate customer records.

4

Primary order flow

Enable Shopify order → NS sales order or cash sale. This is the highest-value flow in the integration. Monitor the first few runs closely — check for errors on individual records and resolve any item ID map gaps or setting misconfigurations before processing large volumes.

5

Fulfillment flows

Enable both fulfillment flows: NS fulfillment → Shopify and Shopify fulfillment → NS. Enable Hold fulfillments on payment pending only if exchange upsells are in scope.

6

Inventory sync

Enable NS inventory → Shopify inventory. Configure location mapping in Settings first if you have multiple locations.

7

Billing flows

If auto-billing is in scope, enable SO → invoice or cash sale first, then NS billing → Shopify billing.

8

Refund flows

Enable both refund flows: Shopify refund → NS and NS refund → Shopify.

9

Returns and exchange flows

Enable all four together: Requested returns → NS RMA, Pending RMA → Shopify approval, Received RMA → process return, and Exchange orders. These must all be active for the complete return lifecycle to work.

10

Cancellation flows

Enable both cancellation flows: Shopify cancellation → NS and NS cancellation → Shopify.

11

Transfer order flows (if applicable)

Enable only if multi-location inventory transfers are in scope: NS transfer orders → Shopify, then Shopify received transfers → NS.

12

Payout flows

Enable last, in sequence: Payout to custom records → Payout reconciliation → Payouts to bank deposits. Configure all payout settings and bank account mapping before enabling.

Scheduling best practices

Most flows filter source records by modification or creation timestamp. Each run, the flow asks: "What changed since the last time I ran?" A lag setting subtracts a small buffer from that timestamp so records have time to reach their final state before being picked up.

Flow group Recommended lag Reason
Primary order flow 10–15 minutes Orders need time to reach their final financial status (authorized, captured, or paid) after placement
Fulfillment flows 5 minutes Allows tracking numbers and carrier updates to land on the fulfillment record before export
Payout flows 24 hours Ensures all orders, refunds, and adjustments making up a payout have reached NetSuite before reconciliation runs
Inventory sync None required Inventory quantities are point-in-time — run as frequently as needed (every 15–30 minutes for active stores)
Catalog flows (items, metafields) None required Catalog changes are typically planned — hourly or every few hours is sufficient
Avoid stacking long lags in series

If the order flow has a 15-minute lag and the billing flow has a 60-minute lag, an order may take over an hour to appear as a billed transaction. Size lags individually and avoid compounding them unnecessarily.

After pausing a flow for maintenance

When you pause a flow (for a fix, a data correction, or a maintenance window) and then re-enable it, verify that the delta timestamp advanced correctly. A stuck delta — where the flow still thinks it last ran before the pause — is the most common cause of "missing" records after a maintenance window. You can reset the delta in the flow's Settings if needed.

Troubleshooting

This section covers the most common issues across all flow groups. For each issue, the fastest path to diagnosis is to open the failing record in the Celigo flow dashboard, examine both the source payload and the error response, and identify which step failed (export, lookup, transformation, or import). Each stage has different root causes.

Orders not syncing

  • Check the order's financial status. The order must match the status configured in Order settings (authorized, captured, or paid). An order in pending status will not sync unless Sync pending payment orders is enabled.
  • Check the lag setting. If the lag is set to 15 minutes, an order placed 5 minutes ago will not be picked up on the current run — it will appear on the next run after the lag window clears.
  • Check the delta timestamp. If the order was placed before the flow's current delta timestamp, it will not be picked up. This can happen after a flow is re-enabled following a pause. Reset the delta or adjust it to cover the missing window.
  • Check for POS orders. If the order is a Shopify POS order and Sync POS orders as Sales Orders does not match the order's fulfillment status, the router may generate an error. Verify your POS setting matches your fulfillment workflow.
  • Check for Item ID map gaps. If the order contains a line item with no matching NetSuite item (no Item ID map record), the import step will fail. Locate the failing SKU in the error log and create a map record for it.

Customer duplicate errors

  • The customer import uses email as the matching key. If multiple NetSuite customer records share the same email address, the lookup returns ambiguous results and the import errors. Deduplicate customers in NetSuite before going live.
  • Check subsidiary assignment. If your NetSuite account uses subsidiaries and the customer's subsidiary does not match the expected value, the import may fail or create a duplicate. Verify the subsidiary mapping in the customer import step.

Inventory not updating in Shopify

  • Check that the item exists in the Item ID map. If a NetSuite item has no map record, the inventory sync cannot resolve it to a Shopify product and will skip it silently.
  • Check location mapping. If the NetSuite location that holds the inventory is not included in the NetSuite locations to pick inventory from setting, its quantities will not be exported. Verify the location is included and that the location mapping in Settings correctly maps it to a Shopify location.
  • Check inventory tracking status. If the Shopify product variant has tracked set to false (controlled by the Shopify Do Not Track Inventory field on the NetSuite variant), Shopify will not show or enforce inventory quantities. Verify the tracking flag on the NetSuite item.

Fulfillment errors

  • Check that the Shopify order has open fulfillment orders. If the order is already fully fulfilled in Shopify, the fulfillmentCreate mutation will fail because there are no open fulfillment lines to fulfill.
  • Check fulfillment order ID matching. The flow retrieves assigned fulfillment order IDs from Shopify to match against NetSuite line items. If a line item's location in NetSuite does not correspond to an assigned Shopify fulfillment location, the match fails. Verify location mapping between systems.
  • Check carrier name format. Shopify recognizes a specific set of carrier names for tracking URL generation. If the NetSuite carrier name does not match a recognized Shopify carrier, ensure a tracking URL is provided directly — Shopify will display the URL even without a recognized carrier name.

Refund routing to wrong branch

  • Verify the billing transaction type in NetSuite. The refund router reads the saved search customsearch_celigo_shopify_bll_tp_exp to determine whether to route to the Cash Sale or Invoice branch. Preview this saved search in NetSuite for the affected order and confirm it returns the expected record type.
  • For deposit-based refunds: Confirm the Customer Deposit record exists in NetSuite and is linked to the order. If the deposit was created manually (not by the customer deposit flow), verify the cross-reference fields are correctly populated.
  • For partial refunds: The flow checks the saved search customsearch_celigo_shopify_rfnd_cm_amt to find the already-applied Credit Memo amount. If a previous partial refund was processed outside the integration, the remaining balance calculation may be off. Verify Credit Memo application amounts in NetSuite match what the flow expects.

RMA not syncing

  • Verify the original Sales Order exists in NetSuite with the Shopify order ID in the cross-reference field. The RMA creation flow looks up the original order by this ID. If the order sync flow failed or was disabled when the original order came through, the lookup will fail and an unverified standalone RMA will be created instead.
  • Check Shopify return status. The pending RMA approval flow only fires when the Shopify return status is REQUESTED. If the return has already been moved to a different status in Shopify (manually by a staff member, for example), this flow will not pick it up.
  • Check for item receipt. The received RMA processing flow depends on an Item Receipt being posted against the RMA in NetSuite. If no receipt exists, the flow will not trigger for that RMA.

Exchange order not creating

  • Verify the Shopify return is marked as an exchange and that a linked exchange order exists with a legacy order ID. The exchange flow filters specifically for orders tagged as exchanges — returns without linked exchange orders are not processed by this flow.
  • Verify the original order's NetSuite record type matches a router branch. The router checks whether the original order was a salesorder or cashsale. If the NetSuite record type field is not populated correctly on the original order, neither branch will match and the flow will error.
  • Check the transformation hook. The exchange flow uses a postResponseMap hook on the "Get returns from Shopify" lookup step to map exchange line items. Open the failing record in the flow dashboard and examine the hook output for transformation errors.
  • Check credit memo status. The saved search customsearch_celigo_shopify_credit_statu acts as a guard — if the Credit Memo for the return has not yet been created or applied, the exchange order creation will be blocked. Verify the credit memo exists and its status matches what the search returns.

Billing flow not triggering

  • Check the auto-bill status setting. The saved search customsearch_celigo_shopify_orders_billi filters for Sales Orders in a specific status. Confirm the setting (Pending Billing vs. Pending Fulfillment) matches the actual status the Sales Order is in after the order flow creates it. Preview the saved search in NetSuite to confirm it returns the expected orders.
  • Check payment terms on the customer record. The billing router uses the presence of a Terms field to decide Invoice vs. Cash Sale. A customer with no terms set will always route to the Cash Sale branch. If you expect an invoice, verify the NetSuite customer record has payment terms populated.

Payout reconciliation variances

  • A small number of variances is expected and normal. Shopify Payments fees, dispute fees, and minor rounding differences will always produce some variance. Investigate when the variance per payout exceeds a threshold you define for your business (for example, $50).
  • Check the payout lag setting. If the lag is too short, the reconciliation flow may run before some transactions (especially refunds processed close to payout close) have reached NetSuite. A 24-hour lag is a safe starting point for most stores.
  • Check for unsynced fees and disputes. Shopify Payments fees and dispute adjustments that posted to the payout but are not yet mapped to NetSuite GL transactions will appear as variances. Verify that the GL account mappings in payout settings cover all fee types you receive.
  • Verify refund mapping. Refunds posting to the payout period must be matched to the correct Customer Refund or Credit Memo in NetSuite. If the refund flow has not run or created the correct record type, the payout reconciliation will show a variance for that line.

OAuth token expirations

  • Shopify OAuth tokens can expire or become invalidated after a store-owner password change, an app uninstall/reinstall, or a change to the app's API scopes. When this happens, every flow using the Shopify connection will fail with an authentication error.
  • Only the account owner in Celigo can reauthorize the Shopify connection. Ensure the person who has store owner access to both Shopify and the Celigo account owner role is available to reauthorize quickly if this occurs. Include this in your operations runbook.
  • NetSuite TBA tokens do not expire automatically but should be rotated on a regular cadence (every 90–180 days is standard for security compliance). Schedule token rotation as a recurring maintenance task.
  • Set connection failure alerts in Celigo. A connection outage cascades into errors across most flows simultaneously — it is distinctive and easy to diagnose if you have alerting in place, but disruptive if discovered manually hours later.

GraphQL rate limits and throttling

  • Shopify's GraphQL API uses a leaky-bucket rate limit. Flows that process large batches of records with expensive queries will consume the bucket faster and trigger throttling before the batch completes.
  • If flows report THROTTLED errors: Reduce the page size on the export step (fetch fewer records per API call) and spread the workload by setting a longer schedule interval. This is a trade-off between throughput and reliability — during peak periods you may need to accept longer sync delays.
  • For inventory sync at scale: Use the inventorySetQuantities mutation with batches of 100–250 items per call rather than one item per call. Large catalogs syncing one SKU at a time will consistently throttle.
  • Monitor query cost in logs. If your Celigo plan exposes the full GraphQL response, watch the extensions.cost.requestedQueryCost field. High values indicate queries that can be pruned by removing unnecessary fields from the selection set.

General debugging approach

When a flow is producing errors and the cause is not immediately obvious:

  1. Find the failing record. In the Celigo flow dashboard, open the flow run that contains the error and locate the specific record(s) that failed. Each failed record has a detailed error log.
  2. Identify the failing step. Errors at export, lookup, transformation, and import have different signatures. Export failures usually indicate a connection or query issue. Lookup failures indicate a missing or non-matching record in the target system. Transformation failures indicate a mapping or scripting error. Import failures indicate a payload or permissions issue.
  3. For lookup failures: Find the saved search referenced by the failing lookup step (see NetSuite saved searches). Preview that search in NetSuite with the same filter values the flow used. If the search returns no results, the problem is the underlying data — the record does not exist or does not match the expected criteria.
  4. For transformation failures: Check any handlebars expressions in the mapping for typos, missing field references, or fields that are null in the source payload. The flow dashboard shows the source payload for each failing record — use it to verify which fields are actually populated.
  5. For import failures: Copy the generated payload from the flow error log and test it directly — against the NetSuite REST interface or the Shopify GraphiQL Explorer. This isolates whether the issue is the payload content, an API permission, or something in the integration platform itself.
  6. Fix before retrying in bulk. Retrying records against an unresolved root cause generates noise in your error logs and can create partial records. Resolve the underlying issue first (fix the mapping, fill the missing data, correct the setting), then retry.