Important
- If you have a Sandbox account, you must update your NetSuite Integration Bundle (Bundle ID: 81289, Version: 1.58.1.21) no later than February 23.
- The feature will be available in the Sandbox starting February 24 and scheduled for release to Production in the second week of March.
The Shopify - NetSuite integration app aligns with Shopify’s native exchanges and returns workflow via Shopify’s GraphQL Return APIs.
This support applies to both online and POS orders. For exchange scenarios:
- A Return Authorization (RA) is created in NetSuite for returned line items.
- A new NetSuite order (Sales Order or Cash Sale) is created for exchanged line items.
Previously, exchange order creation was supported only for POS. This enhancement extends support to online orders as well.
To understand how the integration app processes exchanges, it is important to understand Shopify’s native exchange workflow.
For a detailed video about the end-to-end return lifecycle, see:
Shopify’s native exchange workflow allows merchants to process returns and add exchange items directly within the original order in Shopify Admin.
Instead of creating a separate replacement order manually, merchants can:
- Open an existing order.
- Initiate a return.
- Select returned line items.
- Add exchange line items within the same return.
- Process any price difference (refund or additional charge).
When processed this way:
- Returned and exchanged items remain linked to the original Shopify order.
- Refunds and additional charges are handled within Shopify’s return workflow.
- Inventory restocking follows the restock settings selected during return processing.
- Return-level fees (if configured) are applied within the same process.
This model replaces Shopify’s legacy ExchangesV2.
To sync Shopify's native exchanges and returns with NetSuite, the integration app uses three coordinated flows. Each flow manages a specific stage of the return lifecycle between Shopify and NetSuite.
- Flow 1: Shopify returns to NetSuite return authorization (Scheduled)
- Flow 2: NetSuite return approval to Shopify return approval (update) (Real-time)
-
Flow 3: NetSuite received RA to Shopify return process (Scheduled)
Together, these flows ensure that:
- Returns created in Shopify are reflected in NetSuite
- Approvals done in NetSuite are synced back to Shopify
- Refunds are issued in Shopify only after items are received in NetSuite
This maintains operational and financial alignment between systems.
Key functionality
- Exchange and returns processing: Creates an RA record in NetSuite for each return, with the RA capturing the returned line items, while the replacement (exchanged) line items are created as a separate NetSuite order. The returns created in Shopify Admin or requested Online are processed via the newly introduced returns flow.
-
Features supported:
- Support for multiple exchange scenarios: Supports even, upsell, and downsell exchanges by creating exchange orders in NetSuite as sales orders or cash sales.
- Multi-location exchange support: Enables returns and exchanges across multiple locations.
- Restocking fee handling: Syncs restocking fees for returned items from Shopify.
- Return shipping fee handling: Syncs the return shipping fee from Shopify.
- Store credit: Supports issuing refunds as store credit based on your use case.
Legacy ExchangesV2 deprecation
The integration app currently supports Shopify’s legacy ExchangesV2, which will be deprecated by the end of May 2026. To continue processing exchanges after deprecation, you must enable:
Settings > General > Sync native exchanges as separate sales orders or cash sales
This setting migrates processing to Shopify’s native exchange model.
Impact and action required
- Review and test all downstream processes to ensure they support the native exchanges-and-returns model.
- If your Shopify store still uses the legacy ExchangesV2, plan to migrate to Shopify Exchanges before the deprecation deadline.
Re-authorise the connection
Before using any new settings or functionality, re-authorize the Shopify connection to make sure the required permissions are applied.
Enable Return Authorizations in NetSuite
- Navigate to Setup > Company > Enable Features.
- Click the Transactions subtab.
- Select the checkbox for Return Authorizations.
-
Click Save after checking the box.
Enable Shopify custom fields in NetSuite
Ensure that the following Shopify custom fields are enabled on the NetSuite forms (Item Receipts > eTail tab and Return Authorization > eTail tab) and populated for the orders being synced:
- Shopify Store
- eTail Order Id
- eTail Refund Id
- eTail Shopify Return Id
- eTail Shopify Return Processed
- eTail Order Line Id
If these custom fields are not enabled and populated, it can lead to inconsistencies in saved search results, internal lookups, and flow behavior during return processing.
Update NetSuite bundle
Ensure the NetSuite bundle is updated to the latest version, as shown below, and that NetSuite users have permission to create and approve return authorizations, create item receipts, and issue refunds.
Enable native exchanges (Required for Fulfillment and Refund sync)
To enable the setting, navigate to Settings > General > Sync native exchanges as separate sales orders or cash sales
- Existing installations: Disable the Sync POS exchanges as separate sales orders or cash sales setting and enable Sync native exchanges as separate sales orders or cash sales to sync Shopify native exchanges as separate sales orders or cash sales in NetSuite.
- New installations: Enable the Sync native exchanges as separate sales orders or cash sales setting.
- A separate order is created for each exchange.
-
This setting is required to:
- Sync fulfillment for exchanged items
- Sync refunds for orders created from exchanges
If this setting is not enabled, the fulfillment flow will fail to sync the fulfillment details.
Configure POS exchange adjustment tracking
Enable the following settings only after enabling the native exchange sync setting above.
Settings > Order > POS
- NetSuite item to track exchange credit as a line item: Select a NetSuite item to represent exchange credit as a line item. The item must be created in NetSuite as a non-inventory, payment, or other charge.
- NetSuite item to track exchange fees as a line item: Enable this setting to track exchange fees as a separate line item. The selected item must also be non-inventory, payment, or other charge.
Configure NetSuite item to track exchange adjustments
- Ensure the NetSuite item to track exchange adjustments setting is configured with a payment item for cart-level discount scenarios. The NetSuite payment item also tracks Shopify exchange adjustments, including exchange line credit, restocking fee, and return shipping fee. In NetSuite, make sure the item is set up as a Payment item.
Scheduled flow: This flow syncs Shopify returns to NetSuite as Return Authorizations (RAs). The flow processes returns based on their Shopify return status.
How the flow works
-
Get Shopify returns
The export retrieves returns from Shopify in the following states:
- Requested
- Open
- Closed
-
Lookup orders in NetSuite
The lookup uses the NetSuite saved search for returns order lookup to find the related sales order in NetSuite.
- If no matching order is found, the return is skipped.
-
If found, the flow proceeds with RA creation.
-
Create return authorization
- For Requested returns: RAs are created in Pending Approval status in NetSuite.
- For Open returns: RAs are created in Pending Receipt status because they are already approved in Shopify.
-
For Closed returns: RAs are created and processed immediately.
Important
-
The Create return authorization import uses the existing field mapping Items: Description :: returnLineItems[*].returnReason to sync the return reason from Shopify to NetSuite. For example, if an item is returned in Shopify with the reason “Received the wrong item”, the value from the returnReason field is synced to the Description field on NetSuite and appears as “Wrong Item”, as shown in the screenshot below.
- The returns flow works fully when the original transaction in NetSuite is a sales order. If the transaction is a cash sale (no sales order), the flow runs only a limited set of steps and does not create a return authorization. As a result, you may see only 2 steps in the flow. This is expected behavior.
-
Exchange line processing behavior
The Create return authorization import uses the Items : Replace All Lines mapping to determine how exchange line items are processed in NetSuite.
When a Shopify return includes multiple exchange items, the integration app does not support processing individual exchange items separately within the same return.
Depending on the configuration:
- If Replace All Lines = true, all exchange items associated with the return are processed together.
- If configured to false, the integration app processes only the return (Return Authorization) and does not process any exchange line items. The exchange items remain in Shopify, allowing the service representative to manually manage and complete the exchanges separately.
Partial exchange processing (for example, processing only one exchange item while leaving others unprocessed) is not supported.
-
Create item receipt from return authorization:
Partial processing when RA already exists in NetSuite
If a return authorization (RA) with Open status is already synced to NetSuite and some items are partially processed in Shopify:
- When the flow runs, it checks whether an RA exists in NetSuite for that return.
- If the RA exists, the flow creates an item receipt for only the items processed in Shopify.
- Partial processing is supported only if the RA already exists in NetSuite.
- If no RA exists, item receipt creation is skipped.
First-time sync of a partially processed return
If a return is being synced to NetSuite as an RA for the first time and is partially processed in Shopify:
- The flow does not create the RA.
- No item receipt is created.
The RA and corresponding item receipt are created only after the return is fully processed in Shopify
Important
- An item receipt is created for each processing event. For example, if a return is partially processed three times, three separate item receipts are created.
- If a line item is processed as No Restock, it is synced accordingly in the Item Receipt. If the item is later restocked and the flow runs again, the existing item receipt is updated with the new restock status.
- If multiple RAs exist in NetSuite for the same return, the flow splits the item receipts accordingly and associates them with their respective RAs.
- For returns in the Closed state, Flow 2 and Flow 3 do not run because the return has already been completed in Shopify.
- To successfully create item receipts, configure a static mapping for the Location field in the Create item receipt from return authorization import. This ensures that locations are properly synced from Shopify to NetSuite and that the restocking location is captured at the line level.
- If the location mapping is not configured, the flow will default to the location specified on the corresponding Return Authorization (RA) at the line level.
Real-time flow: This flow keeps the return approval status in sync between NetSuite and Shopify.
How the flow works
- The flow is triggered only when a Return Authorization in the Requested state is manually approved in NetSuite.
- The flow retrieves approved RAs from NetSuite.
- The corresponding Shopify returns are automatically approved in Shopify.
This ensures that approvals done in NetSuite are reflected in Shopify without manual intervention.
Scheduled flow: This flow processes refunds in Shopify after returned items are received in NetSuite.
How the flow works
-
Get received return authorizations:The export uses the NetSuite saved search to sync received return authorizations to retrieve RAs from NetSuite in the following states:
- PendingRefund
- PartiallyReceived
- Closed
-
Lookup item receipts linked to return authorizations: This is a one-time lookup that uses the NetSuite saved search to sync item receipts linked to return authorizations to identify item receipts associated with each RA.
- Lookup Shopify returns for RA:The lookup matches NetSuite RAs and item receipts with the corresponding Shopify returns.
- Remove line items from return:If an RA is closed without item receipts (for example, if the return was cancelled or declined), the flow removes those line items from the Shopify return.
-
Calculate final refund amount:The flow uses the Get suggested financial outcome lookup to calculate the final refund amount. This calculation applies Shopify exchange adjustments, such as exchange line credit, restocking fees, and return shipping fees, using the NetSuite item configured in the NetSuite item to track exchange adjustments setting. The selected item must be set up in NetSuite as a Payment item.
-
Process return and issue refund in Shopify: The flow processes the return, and when the Shopify refund to NetSuite refund (add) flow runs, it issues the refund based on the calculated financial outcome.
Note
- When an item receipt is created manually in NetSuite without restocking the item, and the return is later closed through the NetSuite received RA to Shopify return process flow, the integration app cannot update the Shopify restock status back to true.
-
The handlebar on the DispositionType field determines whether an item is restocked. This field is available in the NetSuite received RA to Shopify return process flow under the Process return and issue refund in Shopify import mappings (returnLineItem > dispositions). The handlebar syncs the restock status from NetSuite to Shopify based on the Restock checkbox selection on the NetSuite item receipt. The items are restocked in Shopify when the checkbox is selected and not restocked when it is not selected during item receipt creation.
Disable the deprecated REST flow Shopify refund to NetSuite refund (add) and enable the GraphQL version instead. Returns flows are supported only when the GraphQL flow is enabled.
For more information about refund flow, see Sync order refunds from Shopify to NetSuite.
When processing returns in Shopify, you can issue refunds to the original payment method, store credit, or split the refund between the original payment method and store credit, as shown in the screenshot below.
The integration app supports issuing refunds using the following methods, based on your configuration:
- Original payment
- Store credit
The integration app does not support splitting refunds between the original payment method and store credit.
Process refunds
To control when refunds are issued in Shopify, configure the issueRefund field in the flow:
- Open the NetSuite received RA to Shopify return process flow.
- Click the Mappings icon for the Process return and issue refund import.
-
Configure the issueRefund field under the financialTransfer object as needed:
-
Set issueRefund = true to process refunds automatically based on your configuration (original payment or store credit).
-
Set issueRefund = false to defer refund processing and issue refunds later.
-
- Click Save.
When issueRefund is set to True, the integration app processes refunds according to the configured refund method. When set to False, the integration app skips refund processing, allowing you to issue refunds manually at a later time.
Configure refunds to store credit by default
To issue refunds to store credit by default, configure the following mapping:
- Open the Shopify returns to NetSuite return authorization flow.
- Click the Mappings icon for the Create return authorization import.
- Map the Refund to Store Credit field and set its value to True.
- Click Save.
When the Refund to Store Credit field is set to True, the Refund to Store Credit checkbox is automatically selected on the NetSuite Return Authorization record (NetSuite > eTail tab > Shopify).
If the field mapping is set to False or not configured, refunds are issued to the original payment method by default.
- The integration app currently supports up to 250 return/refund records per order in Shopify.
- Shopify does not support unverified returns at this time.
- Do not manually close Shopify returns until the integration app has completed processing. If a return needs to be stopped, cancel it instead.
- The integration app supports up to 10 exchanges per single Shopify order.
- The integration app does not sync shipping refunds to the NetSuite Return Authorization (RA).
- The Shopify returns to NetSuite return authorization flow does not support mapping the StaffMember field.
If you see the following errors:
- While syncing orders: "Invalid response received from graphQl call. Please retry, if issue persists, kindly contact Celigo support."
- While syncing fulfillment: "Access denied for returns field."
Re-authorize your Shopify connection, then retry the flow. These errors typically indicate that the Shopify connection authorization has expired or lacks the required permissions for the relevant GraphQL scopes (orders or returns).