Articles in this section

Sync order refunds between Shopify and NetSuite

As a Shopify merchant, if your Customer Service Representatives (CSRs) work in Shopify or NetSuite, your CSRs can sync refund orders between Shopify and NetSuite using the refund flows available in the Shopify-NetSuite integration app. This will help your finance team stay aware of refund orders and keep the accounts in balance.

Under the Refund section of the Shopify-NetSuite Integration App, you have the following flows:

  • NetSuite Refund to Shopify Refund (add) : This flow syncs refund order data from NetSuite to Shopify. In general, you will be using this flow if your CSR team works out of NetSuite for creating refund orders. This flow is discussed in detail in the section below.

  • Shopify Refund to NetSuite Refund (add) : This flow syncs refund order data from Shopify to NetSuite. In general, you will be using this flow if your CSR team works out of Shopify for creating refund orders. 

See Also : To associate a refund with a location where inventory should be added back, and to know more about the multi-location feature, see Support for Shopify’s Multi-location inventory.

Sync Refund Orders | NetSuite to Shopify | NetSuite Refund to Shopify Refund (add)

To sync refund orders from NetSuite to Shopify:

  1. Navigate to the Sales Order in NetSuite that is already imported from Shopify. Then ensure it has a Cash Sale/Invoice that you will refund against.

  2. Create a Cash Refund ( Transactions > Sales > Enter Cash Sales > List ) for Cash Sale or Credit Memo ( Transactions > Customers > Issue Credit Memos ) for Invoice.

  3. In the Shopify-NetSuite Integration App, go to Flows > Refund and run the NetSuite Refund to Shopify Refund (add) flow.

  4. The flow runs successfully if there are no errors during data processing. The order status in Shopify is reflected as “Refunded” and the appropriate refund amount is sent to Shopify to be credited to the buyer.

Note

  • By default, the Integration App does not check for the credit memo status. The NetSuite Refund to Shopify Refund (add) flow picks up the Credit memo regardless of it being applied. However, you can customize the Celigo Shopify Refund Export Saved Search to fit your requirements.

  • This flow can be used to sync credit memos and cash refunds.

  • Once the refund record is synced to Shopify, in NetSuite, under Cash Refund > eTail and Credit Memo > etail the Etail Refund Exported checkbox gets selected. This prevents the syncing of the same refund record. Note that if the flow errors out, you must resolve all the errors to get the data synced.

Settings | Customize NetSuite Refund to Shopify Refund (add)

  • NetSuite Saved Search for syncing order refunds : This drop-down list box enables you to customize the NetSuite Refund to Shopify Refund (add) flow. You can use your own saved search for fetching refund orders from NetSuite or edit the Celigo Shopify Refund Export Saved Search and save it with a different name.

  • Add GST/VAT to refund total : If you are transacting in a country that has GST/VAT tax rules, it’s recommended that you enable this checkbox to add GST/VAT to the refund total before it is added to Shopify.

  • NetSuite item to track custom refund adjustments: Shopify allows the seller to refund an order fully; partially; as a part of the shipping amount, as a custom amount without refunding any items; or as a manually adjusted amount. This setting NetSuite item to track custom refund adjustments allows you to perform custom refunds without returning the items. In NetSuite, be sure to create the item type as a non-inventory, payment or other change.

    This setting supports the following refund scenarios:

    • Refund custom amount with or without refunding one or more item(s).

    • Refund shipping and gift card amount.

    • GST/VAT handling scenarios.

Sync customer refund created against the customer deposit to Shopify

When you sync a paid order as a sales order with a customer deposit, and if there is a refund request even before the order is fulfilled, a refund adjustment is required instead of item restock. In this scenario, the fulfillment and invoice records are not created in NetSuite and a customer refund is created against the open customer deposit. The NetSuite Refund to Shopify Refund (add) flow syncs the customer refunds created against the open customer deposit to Shopify along with the cash refund and credit memo.

The flow:

  • Supports syncing both partial and full customer refunds.

  • Creates a refund with information such as amount, transaction type, and transaction currency.

  • It does not refund any line item. It creates a refund adjustment with the amount mentioned in the customer refund record.

Important

If you are using the NetSuite item to track custom refund adjustments setting, the customer refunds (i.e for refunds without a credit memo or cash refund ) created against the open customer deposit don’t get synced to Shopify. In this scenario, the application displays an error message “Unable to export refund order id# xxxxxxxx due to the invalid item selection. Choose a valid item from the NetSuite item to track custom refund adjustments setting, to refund any extra adjustments.” To process the refund, remove the setting, save, and re-run the NetSuite Refund to Shopify Refund (add) flow.

To sync customer refund created against the customer deposit to Shopify, it is recommended to update the "Celigo Shopify Refund Export" saved search in NetSuite.

  1. Log in to your NetSuite account.

  2. In the global search, enter Celigo Shopify Refund Export.

  3. Select the appropriate saved search from the results.

  4. On the "Celigo Shopify Refund Export" page, click Edit this Search.

  5. In the Results tab, add/update the following filters:

    Filter 

    Description 

    Type

    is any of Customer Refund, Cash Refund, Credit Memo

    Applying Transaction : Record Type

    is not creditmemo

  6. Click Save.

Note

Be sure to populate the values in the eTail Order ID, eTail Channel, and Shopify store fields in the Order > eTail tab, for the customer refund to get picked by the respective saved search during refund sync to Shopify.

Sync Refund Orders | Shopify to NetSuite | Shopify Refund to NetSuite Refund (add)

The Shopify Refund to NetSuite Refund (add) flow syncs refund transactions from Shopify to NetSuite using a GraphQL-based refund import process. The flow supports Shopify native returns and exchanges and creates the appropriate refund records in NetSuite based on the related transaction type.

To sync refund orders from Shopify to NetSuite:

  1. In the Shopify-NetSuite integration app, go to Flows > Refund and run the Shopify Refund to NetSuite Refund (add) flow.

  2. 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.

    GraphQL_Refund_flow_.png

The flow first fetches all the refund orders from Shopify and syncs them to NetSuite using NetSuite Refund Order Import Adaptor based on the configured mappings. 

How refund records are created in NetSuite

When the flow runs:

  • The integration app creates a Credit Memo in NetSuite for all exchange scenarios, including even-value, upsell, and downsell exchanges.

  • If the refund is eligible, the flow then creates a refund transaction using the associated Credit Memo.

  • Refund transactions are created only when the exchange results in a refundable balance (for example, in downsell scenarios).

For Cash Sales, the flow creates a Cash Refund.

This ensures that refunds are issued against the correct financial transaction and that NetSuite remains the financial system of record.

When using the Returns flow 

A Return Authorization (RA) will exist in NetSuite for the sales order.

  • If the corresponding Shopify status is Pending Refund, the refund flow processes the RA and creates a Credit Memo against it to issue the refund.

  • If the Shopify status is not Pending Refund, the refund flow does not process the RA and waits until the status changes to Pending Refund.

When not using the Returns flow 

  • No RA exists in NetSuite; the refund flow identifies the existing Invoice and creates a Credit Memo against it.

For more information about Native exchanges and returns, see Support for Shopify Native Exchanges and Returns.

Refund processing behavior
  • Refunds created from Shopify native exchanges and returns are supported.

  • Refund transactions are mapped to the corresponding NetSuite Credit Memo or Cash Refund.

  • Restocking fees and return shipping fees are calculated using Shopify’s suggested financial outcome and applied accordingly.

  • Refunds for returned items with a Return Authorization (RA) are linked to Shopify return IDs to prevent duplicate or incorrect refund creation.

Note

  • This flow is only available to merchants that have a subscription to the premium (previously "enterprise") edition of the Shopify Integration App.

  • Shopify POS refunds are also supported.

  • For refunds using a Credit Memo, you need to have a Paid Invoice in NetSuite. Therefore, a credit memo will not be created until you create a paid Invoice.

  • You can perform partial or full refunds for an order.

  • You cannot refund more than the available refund.

  • Once the refund record is synced to NetSuite, in NetSuite, under Cash Refund > eTail > Shopify and Credit Memo > eTail > Shopify the Etail Refund ID gets populated with the refund ID, and the Etail Refund Exported checkbox gets selected. This prevents the syncing of the same refund record.

Important

Known limitation: Refund flow when RA is not created by the Returns flow 

If the Return Authorization (RA) record in NetSuite is not created by the Returns flow, refunds may fail and display the following error in both the [Deprecated] Shopify refund to NetSuite refund (add) REST flow and the Shopify Refund to NetSuite Refund (add) GraphQL flow.

Error message: Failed to create, update/transform record because You can not initialize cashrefund: invalid reference <value>. Export Id: /admin/api/2025-07/orders/<value>

Reason: The refund flow expects the RA to be created by the Returns flow. If the RA is created outside this flow and contains an eTail Order ID, the refund creation fails.

To resolve this issue: 

  •  Remove the eTail Order ID field from the Return Authorization form, or 

  •  Perform a mass update in NetSuite to remove the eTail Order ID from existing RA records 

Steps to perform a mass update in NetSuite 
  1.  Go to Lists > Mass Update > Mass Updates in NetSuite

  2.  Select General Updates > Transactions > Return Authorization

  3.  Add a filter: eTail Order ID is not empty. This will target only the affected RAs. 

  4.  In the Mass Update fields, set eTail Order ID = (blank/empty)

  5.  Preview the records, and then run the update. 

Best practice: To avoid this issue, ensure that RAs are created using the Returns flow, rather than being created directly in NetSuite.

Settings | Shopify Refund to NetSuite Refund (add)

When handling a Customer Refund, the Shopify Refund to NetSuite Refund (add) flow also requires the following values:

  • NetSuite Refund Account - Select the account configured in NetSuite to refund the payment. For example, if you have configured a bank account to refund the payment, select that bank account.

  • NetSuite Refund Method- Select the default refund method to be used. If you do not select any value, the payment method used while placing the order is used automatically for processing refunds. For example, if you have received the order payment using Master Card, when processing refunds, Master Card will get selected automatically.

  • NetSuite Refund Location- Select the warehouse location that you want to associate with the refund transaction.

  • NetSuite item to track order refund adjustments as a line item- Choose a NetSuite item from the drop-down list to track your Shopify order refund adjustments. The selected item is added as a line item on the NetSuite sales order. In NetSuite, ensure to create the item either as a non-inventory, payment, or another charge.

  • Ignore refunds generated using -Enter the comma-separated values for refund source names or their IDs that the integration app should ignore. For more information, refer to how to retrieve refund source names and IDs.

  • Substitute item for Bin/Lot numbered/Serialized item -Choose a non-inventory item that will be a substitute item for the bin, lot numbered, serialized, and kit inventory items (that have at least one lot numbered/serial item) during refund. When you refund items without any restock, this selected item is added as a line item with quantity zero on the NetSuite cash refund. In NetSuite, if you enable inventory status, the regular line items are replaced with the selected substitute item. For more information, see here.

For example, if you may want to refund $5 more than the item value, you can use the item available in NetSuite Item to track Refund Adjustments as a line item to track the discrepancy.

All these values are populated in the drop-down box based on whatever is present in NetSuite.

Use the Order's payment method for the refund

  1. Under Settings > Refund > Shopify to NetSuite tab , ensure that you have not selected anything in NetSuite Refund Method .

    NetSuite_refund_method.png
  2. Go to Settings > Order > Payment tab > Map Payment Methods. Map the Order payment method. For example, map cash to cash.

    Important

    Starting March 1, 2024, Shopify will deprecate the “ processing_method ” field from the Orders API. To overcome this business problem, a checkbox Map Shopify payment gateway to NetSuite payment method is introduced to leverage the “ gateway ” field in the Transactions API. So, all merchants using the “ processing_method ” field for payments must now move the payment method mapping from the processing method to the payment gateway.

    Before you enable this checkbox, make sure that you follow the instructions in Update payment method mapping .

    The feature release will be available by January 24, 2024. Make sure to update the mapping from the processing method to the payment gateway by Feb 15, 2024.

    21919805493403-1da64038-0e34-439e-94bd-4af5793dd519
  3. On the same page, in the Default Lookup Value drop-down box, select the default lookup value. For example, VISA.

  4. Click Save .

  5. Go back to Flows > Refund > click the Field Mappings icon of Shopify Refund to NetSuite Refund (add) .

  6. Click the Import Mapping of NetSuite Customer Refund Import Adaptor .

  7. In the Mappings window , you can see that the "order.processing.method" is already mapped to "Refund Method (InternalId)".

    order.processing.method.png

This configuration lets you use the Order's payment method automatically when processing a refund. If you do not want to use the Order's payment method for a refund, you can go to Settings > Refund > Shopify to NetSuite tab > NetSuite Refund Method to select your desired refund method. If the drop-down does not provide any options just hit the refresh option on the side of the field.

Note

If you want the refund flow to sync the order number records from Shopify to NetSuite, make sure that the source field is visible on refunds.json. You need to work with Shopify or your developer team to enable this, and then map to the required field on NetSuite. Once this is done, the refund flow syncs the values to NetSuite.

Important

  • The Shopify refund to NetSuite refund (add) flow does not support multiple invoices. The flow will only process the first invoice it finds.

  • Does not support transaction information.

  • Reporting variance is not supported.

  • Partial refunds from Shopify are supported, provided there is a single Invoice/Cash Sale associated with the order.

  • Currently, the app doesn't support refunds for orders that have Item Group type items. Therefore, even if the refund is a cash refund or cart-level refund, as long as there's an item group on it, the refund will not push through since it is not yet supported.

  • Issuing partial refunds from both NetSuite and Shopify for the same order after synchronization is an uncommon scenario and is not supported by the integration app. You must choose a single system, either NetSuite or Shopify, to process refunds for that order.

  • The Return Authorization (RA) must be in Pending Refund status in NetSuite for the integration app to create refunds against the RA.

  • Partial refunds are supported only when the Shopify return is in a Closed state.

  • Refunds can be issued to either the original payment method or store credit; splitting refunds across methods is not supported.

  • Multi-currency support is under evaluation for certain advanced exchange scenarios.

Optimize performance by configuring refund mappings

The recommended mappings unlock Celigo’s optimized import process for refunds, allowing the integration app to process high volumes more efficiently during peak.

In the Shopify refund to NetSuite refund (add) flow > Post order refunds (invoice or cash sale) to NetSuite import:

  1. In the Destination record field (NetSuite), paste celigo_nlobjTransformId_invoice, for invoice. 

    Important

    For cash sale, paste celigo_nlobjTransformId_cashSale.

    Refund_1.png
  2. Click Settings

  3.  In the Field mapping type setting, select Lookup.

  4. In the Options field, select Dynamic: NetSuite search.

  5. In the Search record type field, select Invoice. For a cash sale, select Cash Sale.

  6. Click Add filter to create a lookup filter expression: ["custbody_celigo_etail_order_id","is","{{{order_id}}}"]

    1. From the fields dropdown, select etail_order_id.

    2. Set the operator as is.

    3. From the value field dropdown, select internal id

  7. In the Name field, provide a lookup name as required.

  8. In the Action to take if unique match not found field, select Use null as default value.

  9. Click Save & close.

    Refund2.png

Stripe card payments in the refund flow

Shopify has updated its payments platform, migrating from the legacy Stripe payment provider to the new Stripe card payments provider. Following this change, Shopify transactions now use receipt.payment_id instead of the legacy ch_ (Charge) ID, which may impact reconciliation with Stripe payouts. To ensure accurate transaction tracking and smooth reconciliation in the Shopify – NetSuite integration app, integrated with the Stripe payment gateway, you must update the handlebar expressions in the order flow.

Import: Post orders to NetSuite

Destination field: eTail Transaction Id(s)

Configure mapping for eTail Transaction Id(s):

  1. Click Edit mapping across the Shopify refund to NetSuite refund (add) flow name. You can see the imports: Post order refunds (invoice or cash sale) to NetSuite and Post customer refunds to NetSuite.

  2. Click Post order refunds (invoice or cash sale) to NetSuite.

  3. Locate the eTail Transaction Id(s) field under the Destination record field (NetSuite). You will see that this field is mapped to the “sourceTransactionIds” field.

  4. In the Source record field (Shopify), replace the existing value with the following handlebar expression.

    {{~#each transactions~}} {{~#compare gateway "==" "Stripe Card Payments"~}} {{~#if receipt.payment_id~}} {{receipt.payment_id}}{{#unless @last}},{{/unless}} {{~else~}} {{#if authorization}}{{authorization}}{{#unless @last}},{{/unless}}{{/if}} {{~/if~}} {{~else~}} {{~#if authorization~}} {{authorization}}{{#unless @last}},{{/unless}} {{~/if~}} {{~/compare~}} {{~/each~}} 

  5. Click Save & close.

    Orde_refundsr_.png

Apply the same steps for the Post customer refunds to NetSuite import.

Import: Post customer refunds to NetSuite

Destination field: eTail Transaction Id(s)

Handlebar expression:

{{~#each transactions~}} {{~#compare gateway "==" "Stripe Card Payments"~}} {{~#if receipt.payment_id~}} {{receipt.payment_id}}{{#unless @last}},{{/unless}} {{~else~}} {{#if authorization}}{{authorization}}{{#unless @last}},{{/unless}}{{/if}} {{~/if~}} {{~else~}} {{~#if authorization~}} {{authorization}}{{#unless @last}},{{/unless}} {{~/if~}} {{~/compare~}} {{~/each~}} 

customer_refunds.png

Note

This update applies only to real-time and scheduled flows where Shopify transaction data is automatically retrieved and synced to NetSuite, and does not apply to On-Demand flows.