# Do return/RMA records and their approval history migrate cleanly to Shopify's returns model or a returns app like Loop/AfterShip?

Reviewed by Martin Dejnicki, Director of SEO & AI Search · facts verified October 11, 2026 · canonical: https://deploi.ca/shopify/faq/returns-rma-records-migration-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](https://shopify.dev/docs/api/admin-graphql/latest/mutations/returnCreate), 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](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/ReturnInput), October 2026). Loop and AfterShip document no history import ([Loop Help Center](https://help.loopreturns.com/en/articles/1909441), [AfterShip's Returnly page](https://www.aftership.com/returns/switching-from-returnly), October 2026).

- **Shopify's condition for a return:** A fulfilled line item not yet refunded. Shopify 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) ([Shopify developer docs, returnCreate](https://shopify.dev/docs/api/admin-graphql/latest/mutations/returnCreate))
- **Dates a recreated return accepts:** Only the customer's request date. The 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) ([Shopify developer docs, ReturnInput](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/ReturnInput); [Shopify developer docs, ReturnApproveRequestInput](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/ReturnApproveRequestInput); [Shopify developer docs, returnClose](https://shopify.dev/docs/api/admin-graphql/latest/mutations/returnClose))
- **Loop Returns & Exchanges:** Free Checkout+ plan, paid plans from $155 a month. Essential $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) ([Loop, Loop Returns & Exchanges on the Shopify App Store](https://apps.shopify.com/loop-returns); [Loop, Pricing](https://www.loopreturns.com/pricing/))
- **AfterShip Returns & Exchanges:** Free plan, paid plans at $19 and $119 a month. Essentials includes 20 returns a month and Premium 100, with per-return charges beyond; rated 4.7 from about 1,540 reviews (October 2026) ([AfterShip, AfterShip Returns & Exchanges on the Shopify App Store](https://apps.shopify.com/returns-center-by-aftership))

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

**WAIT: Keep 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](https://help.loopreturns.com/en/articles/1909441), 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](https://help.loopreturns.com/en/articles/1909441), 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](https://help.loopreturns.com/en/articles/1909441), October 2026).

**DEPENDS: Choose 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](https://deploi.ca/shopify/build-vs-buy/loop-returns-vs-native-returns) 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](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/ReturnInput), October 2026).

## 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](https://shopify.dev/docs/api/admin-graphql/latest/mutations/returnCreate), October 2026). Each return line also has to point at a fulfillment line item ([shopify.dev](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/ReturnLineItemInput), 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](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/ReturnInput), October 2026). The approve call takes no date ([shopify.dev](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/ReturnApproveRequestInput), October 2026), and neither does the close call ([shopify.dev](https://shopify.dev/docs/api/admin-graphql/latest/mutations/returnClose), October 2026). A created return already "assumes that the return request from the customer has already been approved" ([shopify.dev](https://shopify.dev/docs/api/admin-graphql/latest/mutations/returnCreate), October 2026).
- **Archived orders reopen.** "If you create a return on an archived order, then the order is automatically unarchived" ([shopify.dev](https://shopify.dev/docs/api/admin-graphql/latest/mutations/returnCreate), 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.

**Where each kind of historical RMA goes in a Shopify migration**

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

Sources: [Shopify developer docs, returnCreate](https://shopify.dev/docs/api/admin-graphql/latest/mutations/returnCreate); [Shopify developer docs, ReturnInput](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/ReturnInput); [Loop Help Center, Launching Loop & Migrating from Your Previous Returns Process](https://help.loopreturns.com/en/articles/1909441). Verified October 10, 2026.

A recreated return needs fulfilled line items on the migrated order, which is [how split shipments and partial fulfillments come across](https://deploi.ca/shopify/faq/split-shipments-partial-fulfillments-migration).

## 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](https://help.loopreturns.com/en/articles/1909441), October 2026). AfterShip's page for merchants leaving Returnly, another returns app, says initiated returns there "cannot be transferred" to other returns software ([AfterShip](https://www.aftership.com/returns/switching-from-returnly), 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](https://help.loopreturns.com/en/articles/1909441), October 2026). Loop's listing shows a free Checkout+ plan, then Essential at $155 and Advanced at $340 a month ([Shopify App Store](https://apps.shopify.com/loop-returns), October 2026). AfterShip's shows a free Return Care plan, then Essentials at $19 and Premium at $119 a month ([Shopify App Store](https://apps.shopify.com/returns-center-by-aftership), October 2026). Loop Returns is also [a different company from Loop Subscriptions](https://deploi.ca/shopify/faq/loop-subscriptions-vs-loop-returns).

## 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](https://deploi.ca/shopify/faq/support-ticket-history-migration-gorgias-zendesk) 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.

> **When not to do this**
> - **When an integrator promises to import returns.** Shopify's own migration guide names no returns among the data to move ([Shopify Help Center](https://help.shopify.com/en/manual/migrating-to-shopify), October 2026). So ask which Shopify call creates them. If the answer isn't Shopify's own return creation, you're paying for an archive inside Shopify, not for returns.
> - **When your return rate is high and the history is large.** The archive gets better as the volume grows, not worse.
> - **When open return merchandise authorizations (RMAs) number in the hundreds at cutover.** Freeze new return requests for a short window instead, clear the backlog on the old platform, and migrate with an empty queue.

## Deploi's point of view

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

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

## Sources

1. [Shopify developer docs, returnCreate](https://shopify.dev/docs/api/admin-graphql/latest/mutations/returnCreate), checked October 11, 2026
2. [Shopify developer docs, ReturnInput](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/ReturnInput), checked October 11, 2026
3. [Shopify developer docs, ReturnApproveRequestInput](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/ReturnApproveRequestInput), checked October 11, 2026
4. [Shopify developer docs, returnClose](https://shopify.dev/docs/api/admin-graphql/latest/mutations/returnClose), checked October 11, 2026
5. [Shopify developer docs, ReturnLineItemInput](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/ReturnLineItemInput), checked October 10, 2026
6. [Loop, Loop Returns & Exchanges on the Shopify App Store](https://apps.shopify.com/loop-returns), checked October 10, 2026
7. [Loop, Pricing](https://www.loopreturns.com/pricing/), checked October 10, 2026
8. [Loop Help Center, Launching Loop & Migrating from Your Previous Returns Process](https://help.loopreturns.com/en/articles/1909441), checked October 11, 2026
9. [AfterShip, AfterShip Returns & Exchanges on the Shopify App Store](https://apps.shopify.com/returns-center-by-aftership), checked October 10, 2026
10. [AfterShip, Migrate from Returnly to AfterShip Returns with 3-month free](https://www.aftership.com/returns/switching-from-returnly), checked October 11, 2026
11. [Shopify Help Center, Migrate to Shopify](https://help.shopify.com/en/manual/migrating-to-shopify), checked October 10, 2026
12. [Deploi Build vs. Buy, Loop Returns vs. Native Shopify Returns: Which Do You Need?](https://deploi.ca/shopify/build-vs-buy/loop-returns-vs-native-returns), checked October 10, 2026, Deploi research
