Summary of the issue
We’re building a returns app that uses returnCreate to process returns with exchanges. The mutation works fine for domestic orders, but fails for orders placed through Shopify Managed Markets (where Global-e / Shopify Payments is the merchant of record). We’re getting the following error:
json
{
"data": {
"returnCreate": {
"return": null,
"userErrors": [
{
"field": ["returnInput", "orderId"],
"message": "Exchange items cannot be added to an order placed through a blocked channel."
}
]
}
}
}
The order in question is in a Market configured with Merchant of record: Managed Markets (i.e., Global-e/Shopify Payments is acting as MoR, not the merchant themselves).
A plain return without exchange items succeeds on the same order. The failure is specific to the exchangeLineItems portion of the input.
Environment
-
API version:
2025-07 -
Mutation:
returnCreate -
Scope of issue: all orders where MoR = Managed Markets
Questions
-
Is this a known limitation? The Shopify docs note that a product exchange is considered a new Managed Markets order that needs to go through customs, and the customer may need to pay duties and taxes a second time. Shopify Help Center Is the blocked channel error a direct consequence of this — i.e., Shopify explicitly prevents exchange line items on Managed Markets orders via the API because it can’t properly create a new MoR-compliant order for the exchange?
-
Is there a workaround? For example:
-
Can we create a draft order for the exchange item separately, then link it back to the return?
-
Is there a different mutation or flow that supports exchanges on Managed Markets orders?
-
Should we fall back to a refund-only return and instruct the merchant to manually create a new order?
-
-
What additional info would help Shopify support diagnose this? We can provide:
-
The order GID
-
The store’s Managed Markets configuration
-
The exact
returnCreatemutation payload
-
Any guidance on the intended path for exchange handling on Managed Markets orders, or confirmation that this is an unsupported combination today, would be very helpful. We want to handle this gracefully in our app rather than silently failing.