Migrating to returns processing - interim solution
Shopify is changing how return sales are recorded in our system. Currently, return sales (including exchange items and return fees) are recorded at the time of return creation. With our upcoming improvements, return sales will be recorded at the time of return processing instead.
This change affects Partners who manage the following processes:
- Create exchanges using Shopify's exchange types.
- Create returns with fees without calling the
returnRefundmutation.
Anchor to ImpactImpact
If you don't migrate your app, merchants might be impacted in the following ways:
- Exchange items on the return won't be converted into line items on the order.
- Fulfillment orders might be missing for the exchange items.
- Incorrect financial reporting for return items, fees, and exchange items might result.
Anchor to Interim solutionInterim solution
To ensure a smooth transition, Shopify is implementing a temporary solution for affected merchants.
Anchor to How it worksHow it works
The interim solution preserves the current behavior of recording return sales at return creation for all returns created via API until July 1. This is the default, but partners can opt into the new behavior early.
The default changes to the new behavior on July 1 for all API versions. From July 1 until March 1, 2026, the interim solution remains available, but only for shops that created exchanges or returns with return fees prior to July 1. These shops are added to an allowlist that triggers legacy behavior.
The interim solution uses an undocumented API parameter, unprocessed, on the returnCreate and returnApproveRequest mutations that controls when return sales are recorded.
Anchor to How the ,[object Object], parameter worksHow the unprocessed parameter works
unprocessed parameter works-
Before July 1, 2025: By default, the
unprocessedparameter is set tofalse, meaning returns are processed immediately and sales are recorded at the time of return creation (current behavior). Partners can setunprocessed: trueto opt into the new behavior early. -
After July 1, 2025: By default, the
unprocessedparameter is set totruefor all merchants except those on the allowlist. For merchants on the allowlist (those who created exchanges or returns with fees before July 1), the default remainsfalse(legacy behavior), but partners can override this by settingunprocessed: true. For non-allowlisted merchants, the parameter always behaves as if it weretrue. -
After March 1, 2026: The
unprocessedparameter is set totruefor all merchants and can't be overridden.Example: Creating a Return
POST https://{shop}.myshopify.com/api/{api_version}/graphql.json
returnCreate GraphQL mutation
Example: Approving a Requested Return
POST https://{shop}.myshopify.com/api/{api_version}/graphql.json
returnApproveRequest GraphQL mutation
When the interim solution is enabled for a shop it applies to all returns created using the API (not just returns with return fees or exchanges), but not for returns created through the Shopify admin interface.
When the interim solution is enabled for a shop it applies to all returns created using the API (not just returns with return fees or exchanges), but not for returns created through the Shopify admin interface.
The following diagram shows the lifecycle of the interim solution:

Anchor to EligibilityEligibility
-
May 5, 2025 to July 1, 2025: The interim solution is available for all shops creating returns via API
-
July 1, 2025 to March 1, 2026: The interim solution only functions for merchants who have created exchanges or returns with fees using API prior to July 1, 2025. For all other merchants, the parameter has no effect, and they automatically use the new behavior.
As of July 1, 2025, Partners should use the new
returnProcessmutation to handle returns with fees or exchanges for merchants wanting these options.
Anchor to ExampleExample
-
Merchant A uses your app to create returns with exchange items.
-
Merchant B starts using your app on July 2 and wants to create returns with exchange items or return fees.
-
Merchant C uses your app to create returns without exchange items or return fees.
Only merchant A is eligible for the interim solution after July 1. Your app needs to migrate to the new mutation to support merchant B.
For Merchant C, we recommend issuing refunds using the dedicated return refund mutations, such as
returnProcess(previouslyreturnRefund), to ensure that the correct item is refunded. However, other refund mutations, likerefundCreate, still work for this simple use case.
Anchor to Migration timelineMigration timeline
| Date | Milestone | Details |
|---|---|---|
| May 5, 2025 | Rollout starts | Interim solution is activated for all shops creating returns via public Admin APIs. By default, returns are processed immediately and sales recorded at creation time (unprocessed: false). Partners can set unprocessed: true to opt into the new behavior early. |
| July 1, 2025 | returnProcess mutation on stable | Default behavior changes to creating unprocessed returns (unprocessed: true) for all merchants except those on the allowlist. For allowlisted merchants (those who created exchanges or returns with fees before July 1), the default remains false, but partners can set unprocessed: true to opt into the new behavior. For non-allowlisted merchants, the parameter always behaves as if it were true. Partners can integrate with the new returnProcess mutation on a stable API version. |
| March 1, 2026 | Interim solution deprecated | The interim solution is fully deprecated. The unprocessed parameter is set to true for all merchants and can't be overridden. All returns use the new behavior of recording sales at processing time. Partners must use the returnProcess mutation for all merchants requiring exchanges or return fees. |
Anchor to Important considerationsImportant considerations
- Shopify admin versus API inconsistency: The interim solution applies only to returns created using the GraphQL Admin API, not through the Shopify admin interface which always uses the new solution. This might cause inconsistencies in reporting that merchants might notice.
- Default behavior changes: Be aware of how the
unprocessedparameter default changes over time:- Before July 1, 2025: Default is
falsefor all merchants (legacy behavior) - After July 1, 2025: Default is
truefor non-allowlisted merchants, remainsfalsefor allowlisted merchants - After March 1, 2026: Permanently set to
truefor all merchants
- Before July 1, 2025: Default is
- Integrating with Exchanges: After July 1, 2025, exchanges created with existing mutations only operate by default for merchants on the allowlist. For these merchants, partners can opt into the new behavior by setting
unprocessed: true. All other merchants require the use of thereturnProcessmutation to successfully create and process exchanges. - Return fees: Partners creating returns with fees must adapt based on the merchant and time period:
- Before July 1, 2025: All merchants can use existing mutations (with default
unprocessed: false) or opt intounprocessed: trueearly - After July 1, 2025: Allowlisted merchants can continue using existing mutations (default behavior), while non-allowlisted merchants must use the
returnProcessmutation - After March 1, 2026: All merchants must use the
returnProcessmutation
- Before July 1, 2025: All merchants can use existing mutations (with default