Do return/RMA records and their approval history migrate cleanly to Shopify's returns model or a returns app like Loop/AfterShip?
Short answer
Return merchandise authorization (RMA) records migrate only partly. A Shopify return needs a fulfilled line item "that hasn't yet been refunded" (shopify.dev, October 2026), so a refunded RMA can't become one. An open RMA can be recreated with its request date but no approval history (shopify.dev, October 2026). Loop and AfterShip document no history import (Loop Help Center, AfterShip's Returnly page, October 2026).
- Shopify's condition for a return
- A fulfilled line item not yet refundedShopify creates a return only from an order "that has at least one fulfilled line item that hasn't yet been refunded", and the new return counts as already approved (October 2026).Source: Shopify developer docs (returnCreate)
- Dates a recreated return accepts
- Only the customer's request dateThe return input takes the date the return "was first solicited by the customer"; Shopify's approve and close calls take no date at all (October 2026).Sources: Shopify developer docs (ReturnInput, ReturnApproveRequestInput, returnClose)
- Loop Returns & Exchanges
- Free Checkout+ plan, paid plans from $155 a monthEssential $155 and Advanced $340 a month on the App Store, rated 4.6 from about 450 reviews; Loop's own pricing page says "Starting at" for both (October 2026).Sources: Loop (Loop Returns & Exchanges on the Shopify App Store, Pricing)
- AfterShip Returns & Exchanges
- Free plan, paid plans at $19 and $119 a monthEssentials includes 20 returns a month and Premium 100, with per-return charges beyond; rated 4.7 from about 1,540 reviews (October 2026).Source: AfterShip (AfterShip Returns & Exchanges on the Shopify App Store)
Deploi’s call
Plan the returns cutover as a queue-drain, not a data migration. We scope it as three dates: the last request day on the old platform, the last receiving day there, and the new returns app's launch day. Anything still open on the third date is recreated and counted, because the count is small. Shopify's return creation takes each customer's original request date, but no approval history.
WaitKeep the old returns system running while
- A return merchandise authorization (RMA) opened before cutover is still open. Loop's launch guide says to complete those returns in the prior system (Loop Help Center, October 2026).
- Customers still return pre-cutover orders. Loop suggests keeping the prior system active 30 to 60 days after launch, where possible (Loop Help Center, October 2026).
- Refunds on imported orders may need the original processor. Loop warns they "may need to be processed manually due to the lack of payment information in Shopify" (Loop Help Center, October 2026).
DependsChoose the new returns lane on its own merits when
- Return history is archived and referenced on each migrated order, so no returns app has to hold it.
- Exchanges would earn their keep. Deploi's Loop versus native returns record scores Loop BUY for exchange revenue and native returns WAIT for the basic RMA loop (October 2026).
- Open RMAs are few enough to recreate after cutover, each with its customer's original request date (shopify.dev, October 2026).
Basis: Loop Returns vs. Native Shopify Returns: Which Do You Need?, our Build vs. Buy decision record, scored DEPENDS.
Why can't a refunded RMA become a Shopify return?
A refunded return merchandise authorization (RMA) can't become a Shopify return because Shopify needs a fulfilled line item that hasn't been refunded. Shopify creates a return only "from an existing order that has at least one fulfilled line item that hasn't yet been refunded" (shopify.dev, October 2026). Each return line also has to point at a fulfillment line item (shopify.dev, October 2026). So Shopify's returns model is built for returns you're about to process, not returns you already processed.
Two more rules shape a migration:
- Only the request date can be supplied. Shopify's return input takes the date the return "was first solicited by the customer" (shopify.dev, October 2026). The approve call takes no date (shopify.dev, October 2026), and neither does the close call (shopify.dev, October 2026). A created return already "assumes that the return request from the customer has already been approved" (shopify.dev, October 2026).
- Archived orders reopen. "If you create a return on an archived order, then the order is automatically unarchived" (shopify.dev, October 2026). That matters for open RMAs on imported orders, not closed ones.
What happens to each kind of historical RMA?
Each kind of historical return merchandise authorization (RMA) goes somewhere different, because only the open ones can still become Shopify returns.
| Kind of RMA | Where it goes | Why |
|---|---|---|
| Closed and refunded | An archive outside Shopify, plus a tag or note on the migrated order | A refunded line item can't take a Shopify return |
| Open, item not yet received | Recreated after cutover as a new return, with the original request date | Shopify's return input takes the customer's request date |
| Open, item received but not refunded | Refunded through the old processor if its window allows, then recorded on the migrated order | Loop warns refunds on imported orders may need manual processing |
| Warranty claims with a long tail | The archive, plus a customer metafield flagging the entitlement | Warranty periods outlive the migration |
A recreated return needs fulfilled line items on the migrated order, which is how split shipments and partial fulfillments come across.
Do Loop or AfterShip import return history?
No. Neither Loop nor AfterShip documents an import of return history, so plan that history as an archive. Loop's launch guide says to "Complete the returns in prior system before fully cancelling service", keeping that system active 30 to 60 days after launch where possible. It also says to ask the previous provider for "any important reports, analytics, historical data" (Loop Help Center, October 2026). AfterShip's page for merchants leaving Returnly, another returns app, says initiated returns there "cannot be transferred" to other returns software (AfterShip, October 2026).
Both apps still work for returns after cutover. Loop says customers "would technically be able to return items through Loop" on orders migrated from another platform. But refunds for old orders "may need to be processed manually due to the lack of payment information in Shopify" (Loop Help Center, October 2026). Loop's listing shows a free Checkout+ plan, then Essential at $155 and Advanced at $340 a month (Shopify App Store, October 2026). AfterShip's shows a free Return Care plan, then Essentials at $19 and Premium at $119 a month (Shopify App Store, October 2026). Loop Returns is also a different company from Loop Subscriptions.
Does approval history need to live inside Shopify?
Approval history rarely needs to live inside Shopify, because it's a compliance record, not a working data model. It matters for one of three reasons, and only one needs anything inside Shopify:
- Customer service context. An order note or tag solves it. An agent needs to know a return happened and why, not to replay the approval workflow. Old case notes follow the customer through the helpdesk, which linking support ticket history to migrated customers covers.
- Vendor chargeback and supplier recovery. The archive solves it, because the counterparty is the supplier, not Shopify.
- Regulatory or contractual retention. Keep the old records, in the old format, for the required period. Re-expressing them inside a new system is the version that fails an audit, because the re-expression is not the original record.
When should you not try to migrate returns?
You shouldn't try to migrate returns when the promise rests on an unnamed import path, the history is large, or the open queue is long.
Deploi’s point of view
Our own position, from building on Shopify. Kept apart from the sourced facts above.
- Where we disagree
- Migration plans often list returns beside orders and customers as a migratable object class. It is not one. Shopify's own migration guide lists products, customers, historical orders, gift cards, blogs and pages, and no returns, and a Shopify return can only be created on an item that hasn't been refunded. Quoting returns in the same breath as orders is how a fixed-price migration acquires an unpriced surprise in week six.
- What this page adds
- that the blocker is a documented precondition on Shopify's return creation (a fulfilled line item not yet refunded), that only the customer's request date can be supplied, and that Loop's and AfterShip's own migration pages send old returns back to the previous system.
Decision records behind this answer
When this answer changes
- Shopify lets a return be created on a refunded line item, or adds dates to its approve and close calls.
- Loop or AfterShip publishes an import for return history from another platform.
- Loop or AfterShip changes its plans or prices.
- Shopify adds returns to the data its migration guide says to move.
Related questions
- How do split shipments and partial fulfillments in historical order data migrate to Shopify's fulfillment-order model without breaking the audit trail?
Split shipments migrate as one fulfillment per shipment, not as the original fulfillment orders.
- What is Loop Subscriptions, and how is it different from Loop Returns (they are NOT the same company)?
Loop Subscriptions is Loop Solutions Inc's Shopify subscription app, free to 50 active subscriptions, then $99 a month plus 1.0% or $399 plus 0.75% per transaction (Shopify App Store, October 2026).
- How do customer support ticket history and case notes (from the old helpdesk) get linked to migrated customer records in the new Gorgias/Zendesk-Shopify setup?
Helpdesk history links to migrated Shopify customers by email address, not customer ID, so an email changed in migration orphans tickets.
Sources
Every figure on this page traces to one of these. Official and vendor pages are checked on the date shown; Deploi records are our own published decisions.
- Shopify developer docs, returnCreate
- Shopify developer docs, ReturnInput
- Shopify developer docs, ReturnApproveRequestInput
- Shopify developer docs, returnClose
- Shopify developer docs, ReturnLineItemInput
- Loop, Loop Returns & Exchanges on the Shopify App Store
- Loop, Pricing
- Loop Help Center, Launching Loop & Migrating from Your Previous Returns Process
- AfterShip, AfterShip Returns & Exchanges on the Shopify App Store
- AfterShip, Migrate from Returnly to AfterShip Returns with 3-month free
- Shopify Help Center, Migrate to Shopify
- Deploi Build vs. Buy, Loop Returns vs. Native Shopify Returns: Which Do You Need?