Shopify Native Exchanges (Exchanges Primitive)
OVERVIEW
Loop now supports exchanges via Shopify’s native exchange infrastructure. Moving to native exchanges within Shopify means creating exchanges in an improved way that connects exchanges to the original order, ultimately eliminating many of the accounting reconciliation challenges and data discrepancies that our current flow delivers.
Additionally, Shopify’s Return APIs now have native support for fees and enhanced refunding and restocking capabilities, both of which are now supported.
This document outlines the new behaviors and interactions that occur as a result of these enhancements.
Note: While we encourage merchants to migrate to native exchanges and simplify their Loop <> Shopify interactions and associated integrations, this move is optional for current merchants. We do not have a deprecation timeline for the current exchange flow.
Creating an exchange
Shopify now supports exchange outcomes natively within their returns infrastructure, facilitated through the Return APIs.
Exchanges are now contained within the original order and no longer require the creation of a new order within Shopify
Loop will no longer create new orders (EXC orders) containing exchange items, rather new items will be added to the original order created by the customer
Shopify’s exchange engine will handle all financial calculations and apply return credit (credit from returning items) to any new items on the order
Loop will no longer leverage the
loop discount
to apply return credit against new exchange itemsThis includes support for exchanges for less (balance owed to customer) and upsell exchanges (balance owed to merchant)
Shopify’s ledger/reporting has been modified to handle exchange outcomes, meaning merchants can now rely on Shopify reporting for accurate exchange financials
In most cases, this will eliminate the need for Loop’s
adjustment reports
to rectify Shopify reporting as a result of exchanges
Exchange items will be placed on hold while a return is in progress and will be marked for fulfillment when the exchange processing event has been reached
On hold state reflects a
committed
state in Shopify
Even Exchanges
Even exchanges will result in a zero balance owed by the buyer, as the returning item credit will be offset by the new products added to the order.
Here is a completed 1:1 exchange:
The timeline view within Shopify:
Here is the impact of the above 1:1 exchange in Shopify’s reporting. Note that new exchange items are represented as new sales on an order and contribute to gross sales numbers:
Exchange + Refund (Exchange for less)
Exchanges for less will result in an amount to be refunded to the customer. The refund amount will be automatically calculated by Shopify and issued when the return is processed within Loop (when the refund event is reached)
Here is an in-progress exchange + refund. Note the outstanding refund balance represented on the order:
Here is a processed exchange + refund:
Here is the impact of the above exchange + refund to Shopify reporting:
Upsell Exchange (Exchange for more)
Exchanges resulting in an owed balance (upsell) will reflect an amount owed on the new exchange order.
Loop will continue to capture upsell dollars via Stripe. Once collected, the owed balance on the order will be marked as paid
Loop does not support Shopify’s native invoicing flow to collect upsell dollars from buyers and route these transactions through Shopify, however, this is on our roadmap.
Loop will mark the balance as paid upon successfully transacting the owed balance through Stripe. This will not trigger exchange item fulfillment, rather will keep the return in progress until the exchange is processed
Bonus credit for upsell transactions (if applicable) will exist on the order in the form of a discount
Fulfilling an exchange item
When an exchange is created in Shopify (customer submits a return in Loop) a fulfillment is created for the new items. These items are placed in an On hold
state within Shopify until the return is processed.
The on hold state moves the inventory into a committed status on Shopify and will prevent the products from being sold elsewhere. This is not the case if Shopify settings are configured to continue selling through out of stock.
When the exchange has been processed, Loop will release the fulfillment, triggering existing fulfillment workflows within Shopify.
Refunding & Restocking
Refunding and restocking will move from the Refund APIs (current) to the Return APIs (new) in an effort to utilize endpoints specific to returns that ultimately give Loop more control of these actions.
Refunding and Restocking have historically been coupled, meaning that products must be restocked at the time of refund. This is no longer a limitation, as these actions have been decoupled and now allow for refunding and restocking to occur exclusively of one another.
This unlocks the ability to process refunds based on an automated event (label status) and restock manually after the item has been received.
Fees
The addition of fee support within Shopify allows Loop to add fees as a structured component on a return.
Fees will be incorporated into Shopify’s financial calculations for a return and will automatically reduce the refund issued to the customer.
Fees are reflected under the
Return Fees
column in Shopify reportingCurrent limitations:
Shopify has support for two fee types: shipping fees (added at the return level) and restocking fees (added at the line item level)
Loop is currently leveraging the shipping fee field only. Support for restocking fees (line item fees) will come as a future iteration to our fee structure
Fees will not have titles or descriptors - this is not supported by Shopify
Fees will be added as a single lump sum regardless of stacked fees in Loop - multiple fees of a single type are not supported by Shopify
Return with fees
Shopify Returns report is a good place to see fee amounts. This is reflected in Shopify under
Return Fees
Fees show up in the Shopify ledger as a new sale on the order level
Reporting
Enabling the new exchange flow requires enabling exchanges within Shopify. The activation of exchanges in Shopify results in a change in reporting behavior, which is outlined below:
When a return is created in Shopify, the corresponding return event is recorded in Shopify reporting. This means that when an exchange is submitted within Loop, Shopify reporting reflects the exchange in financial reporting
This is a deviation from the current behavior in which return events are reflected in Shopify when a return processes
Loop offers an alternative to this behavior via a setting that delays the creation of returns in Shopify until the return processes.
This will eliminate
in-progress
returns from being created in Shopify, but will remedy the new behavior mentioned above and ensure that returns are not reflected in Shopify reporting until they are completed
Please reach out to support@loopreturns.com to enable this configuration and delay return creation until the return reaches a processed state.
Webhooks
Shopify has an assortment of return specific webhooks that can be leveraged to receive return events: https://shopify.dev/docs/apps/build/orders-fulfillment/returns-apps#webhooks
Webhook topic | Description | Payload information |
---|---|---|
| Occurs when a return is requested. This means that the return's status is | |
| Occurs when a return is approved. This means that the return's status is | |
| Occurs when a return is declined. This means that the return's status is | |
| Occurs when a new refund is created without errors on an order, and includes returns data. | |
| Occurs when a return is canceled. This means that the return's status is | |
| Occurs when a return is updated without errors on an order, and includes data on changes made to the return. | |
| Occurs when a return is closed. This means that the return's status is | |
| Occurs when a return is reopened. This means that the return's status is | |
| Occurs when a disposition has been made. | |
| Occurs when a reverse delivery is created or updated with delivery metadata, such as the delivery method, label, and tracking information that's associated with a reverse delivery. |
Limitations
Shopify does not allow exchanges to be created against a subset of orders.
This includes orders that are:
Older than 2019
Created by an app that is not Shopify or Loop Returns
With an invalid billing or shipping address
With a prepaid subscription
With duties
For orders in which an exchange is not possible due to the above limitations, Loop will only offer refund and store credit outcomes to the buyer
Restocking through the Return APIs means means moving away from restocking though the Refund API and will result in static restock values within the refund object of an order:
"restock": false
"restock_type": "no_restock”
Testing & Enablement
The native exchange flow is available to all merchants upon request. Reach out to support@loopreturns.com to have the admin setting made accessible.
From there, Native exchanges can be toggled on/off within the general settings of the Loop admin. Exchanges submitted after this setting is enabled will adhere to the new flow. This setting can be toggled on and off for testing purposes.
Shopify Plus merchants must also enable exchanges in Shopify via feature test drives. To access feature test drives in your Shopify Admin, click Settings, and then in the Organization section, click Feature test drives. Here you can enable exchanges for the Shopify instance(s) of your choice.
FAQ
To view frequently asked questions, visit Native Exchanges FAQ.
Please reach out to support@loopreturns.com with any additional questions.