Background
I use two mutations for creating returns:
Both on API version 2026-01.
Some of my merchant stores are on the legacy workflow, and some are on the new workflow, which affects how their returns interact with returnProcess mutation - introduced in 2025-07 (migration guide).
Business Requirement
When a return contains exchange items, I need the fulfillment order for those exchange items to be created immediately after the return is opened — before the refund is processed. The refund happens later in a separate step via an automated flow.
This means I cannot call returnProcess on exchange line items and return line items simultaneously. They must happen in separate calls.
Behavior per Workflow
Legacy Workflow 
After calling returnCreate, exchange items are already processed automatically. A fulfillment order is created on hold with:
"fulfillment_hold": {
"reason": "awaiting_return_items"
}
Later, when I call returnProcess for the return line items, the SuggestedReturnFinancialOutcome is correct and the refund amount is accurate.
New Workflow 
After returnCreate, exchange items are not automatically processed. To create the fulfillment order, I call returnProcess with only the exchange line items:
Step 1 — returnCreate:
{
"verb": "return_created",
"arguments": [{
"return_line_items": [
{ "id": 56359321864, "quantity": 1 },
{ "id": 56359354632, "quantity": 1 },
{ "id": 56359387400, "quantity": 1 }
],
"exchange_line_items": [
{ "id": 978714888, "quantity": 1 }
]
}]
}
Step 2 — returnProcess (exchange items only):
{
"verb": "return_processed",
"arguments": [{
"return_line_items": [],
"exchange_line_items": [
{ "id": 978714888, "quantity": 1 }
]
}]
}
This creates the fulfillment order, but with an unexpected hold reason:
"fulfillment_hold": {
"reason": "awaiting_payment",
"reason_notes": null
}
This also causes the order to become PARTIALLY_PAID, and as a result, the SuggestedReturnFinancialOutcome is always reduced by the total value of the exchange items.
Step 3 — returnProcess (return line items, called later):
{
"verb": "return_processed",
"arguments": [{
"return_line_items": [
{ "id": 56359321864, "quantity": 1 },
{ "id": 56359354632, "quantity": 1 },
{ "id": 56359387400, "quantity": 1 }
],
"exchange_line_items": []
}]
}
At this point the suggested refund is incorrect — it is short by the total value of the exchange items. Weirdly, this was not happening before and this three-step flow was working perfectly for my use case.
Questions
-
Why does calling
returnProcesson only exchange line items in the new workflow cause anawaiting_paymenthold and aPARTIALLY_PAIDorder status, while the legacy workflow handles the same scenario without these side effects? -
Is there a supported way to create the exchange fulfillment order immediately after
returnCreate— without processing the return line items at the same time — that does not result in anawaiting_paymenthold or affect theSuggestedReturnFinancialOutcome? -
Is this a known behavioral difference between the legacy and new workflows, and if so, what is the recommended pattern for handling deferred refunds with exchanges in the new workflow?