Skip to main content
Oct 25–28SuiteWorld 2026 — Meet our team
Category
Shopify
Published
Reading time
8 min read

Shopify Refunds in NetSuite: Stop Phantom Restocks

Why Shopify refunds put stock back in NetSuite that never came back, and how to map cancellations, returns and keep-it refunds to the right NetSuite records.

Contents7 sections ↓

A customer cancels before shipping, or gets a refund and keeps the item, and a week later the warehouse count is off. Inventory in NetSuite says you have units that are not on any shelf. A common cause: every Shopify refund is synced as one kind of NetSuite refund, and that refund puts the items back into stock.

Direct answer: A Shopify refund can mean three different things: an order cancelled before it shipped, a product that physically came back, or money returned while the customer keeps the item. Each needs a different record in NetSuite. Cancellations should close the order lines and refund the payment with no inventory movement. Physical returns should go Return Authorization, then Item Receipt, then the refund, so stock comes back only when it arrives. Keep-it refunds should credit the customer with no item quantity. When an integration syncs all three as a cash refund or credit memo with item lines, NetSuite restocks items that never came back. The fix is in the mapping: use Shopify's per-line restock information, a return location or zero quantity for refunds without a return, and RMAs for real returns.

Written on November 5, 2026, from Shopify's, Celigo's and Oracle's documentation, linked at the end.


What NetSuite creates for a Shopify refund

Both of the common connectors mirror NetSuite's own Refund button. The record depends on how the original order was billed:

Original order billed asCeligo Shopify integration app createsOracle NetSuite Connector creates
Cash SaleCash RefundCash Refund
InvoiceCredit Memo, then a Customer Refund applied to itCredit Memo
Customer Deposit (not yet billed)Customer Refund against the depositNot covered in Oracle's FAQ

A Cash Refund or Credit Memo with inventory item lines is a return of those items as far as NetSuite is concerned. Oracle's connector documentation says it directly: when syncing refunds, "you can have NetSuite automatically restock the refunded items shown in cash refund records." That is right for a return. It is wrong for the other two cases.

The three kinds of refund, and where each should land

CaseWhat happened physicallyRight result in NetSuiteWhat goes wrong if synced as a plain refund
Cancellation before shippingNothing left the warehouseClose or cancel the open sales order lines; refund the payment (customer refund against the deposit, or a refund with no restock)Stock goes up for units that were never picked
ReturnThe item comes back, maybe to a different location, maybe damagedReturn Authorization → Item Receipt at the location where it arrives → Credit Memo or Cash Refund → Customer RefundStock comes back on the refund date, at the wrong location, before anyone has checked the item
Refund without returnCustomer keeps the item (damaged, late, goodwill)Credit with no inventory quantity, coded to a returns or allowances accountStock goes up for units the customer still has

Shopify already tells you which case you are in. Each refunded line in Shopify carries a restock type: cancel (the line was not fulfilled), return (the item is coming back) or no_restock (money only). Integrations can read it, but a mapping has to be set up to use it.

The three-step return flow

For real returns, the pattern that keeps inventory and the GL right is the one NetSuite was built around:

  1. Return Authorization (RMA). Created when the return is approved, from Shopify, from a returns app (Loop, Happy Returns and similar) or by customer service. No inventory or GL impact yet.
  2. Item Receipt against the RMA. Created when the box arrives and someone checks it. This is where you decide the location and whether the item goes back to sellable stock, a returns location or write-off.
  3. Refund from the RMA. A Credit Memo (and Customer Refund) or Cash Refund, created from the received RMA, which then syncs to Shopify to release the money.

Oracle's own guidance for its connector matches this: if you do the RMA and receiving in NetSuite, issue the refund in NetSuite and let the connector sync it to the storefront. Celigo's integration app can also sync NetSuite refunds back to Shopify, classifying them as order refunds or RMA refunds.

The trade-off is speed: the customer gets the money after the item is received, not when the label is printed. Many brands accept that; others refund on the carrier scan. Either way, inventory should move on receipt.

Fixes inside the connector

If you can't redesign the flow now, both connectors give you ways to stop the worst of it.

Oracle NetSuite Connector (under Mappings > Other Transactions > Transaction Item, transaction type Cash Refund):

  • Map a return location. Create a location for returned goods and map it on cash refund lines. Refunded quantities land there, not in sellable stock. Needs Multi-Location Inventory, and inventory reports must exclude that location.
  • Set item quantity to 0. Simple, but you lose the record of what was returned, and it fails for items that need inventory detail (lots, serials, bins).

Celigo Shopify integration app (Settings > Refunds):

  • Item for custom refund adjustments. Refunds that are not tied to item lines (shipping, goodwill) post against a non-inventory item you choose.
  • Default refund location. Fixes the "MLI_LOCATION_REQUIRED" error on refunds of unfulfilled lines, which have no location yet; a Celigo answer on its community forum recommends this setting or a flow mapping for the location.
  • Flow mappings. Use the Shopify restock type to send no_restock and cancel lines to zero quantity or an adjustment item, and only return lines with item quantities.

Cancellations need their own path

Refunds before fulfillment are where most phantom stock comes from, because the connector sees a refund and the order has no fulfillment yet. Two setups avoid it:

  • Bill after fulfillment. Take payment as a Customer Deposit at order time and create the Cash Sale or Invoice when the order ships. A cancellation is then a closed sales order line plus a Customer Refund against the deposit. Nothing to restock.
  • Treat Shopify cancellations as order edits. When a line is cancelled in Shopify before it ships, close that line on the NetSuite sales order instead of creating a refund transaction with items.

If you bill at order time (a Cash Sale before shipping), NetSuite has already relieved inventory for goods still on the shelf, and every cancellation needs a correction. That is a design choice worth revisiting with your integration partner.

Inventory and Shopify never quite agree?

We audit your Shopify and NetSuite refund mappings, fix the restock logic and set up RMA-based returns in Celigo or the NetSuite Connector.

Get a refund flow audit

A quick check you can run this week

  1. Run a saved search of Cash Refunds and Credit Memos from the last 90 days with inventory item lines and no Return Authorization in Created From.
  2. Compare against Shopify refunds by restock type for the same period.
  3. Every cancel or no_restock line that shows up as a NetSuite refund with item quantity is a unit of phantom stock. Count them, and you have the size of the problem and the business case for fixing it.

For the wider integration design, see how to make a Shopify and NetSuite integration scale, Shopify order management with an ERP and Shopify inventory management with NetSuite.


Sources

What clients ask before signing

Gustavo · BrokenRubik

Replies by email within 24 hours

Gustavo

Connecting a store, a 3PL or another app to NetSuite? Name the two systems and we'll reply with the approach we'd take.

A person reads every message. No sales sequence.

Share
Gustavo Cañete

Gustavo Cañete

Co-Founder & Development Director

Co-founder and Development Director at BrokenRubik overseeing technical excellence and development operations. 12+ years of experience leading NetSuite development teams and delivering complex enterprise solutions.

12+ years experienceOracle NetSuite Certified +1
NetSuite DevelopmentSuiteCommerce AdvancedTeam ManagementTechnical Leadership+2 more

Related