Shopify Native Exchanges (Exchanges Primitive)

Edited

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 items

    • This 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.

  • is an in-progress exchange with the new fulfillment in an on-hold state:

When the exchange has been processed, Loop will release the fulfillment, triggering existing fulfillment workflows within Shopify.

  • Here is a processed exchange with the released fulfillment:

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 reporting

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

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

returns/request

Occurs when a return is requested. This means that the return's status is REQUESTED.

Webhooks

returns/approve

Occurs when a return is approved. This means that the return's status is OPEN.

returns/decline

Occurs when a return is declined. This means that the return's status is DECLINED.

refunds/create

Occurs when a new refund is created without errors on an order, and includes returns data.

returns/cancel

Occurs when a return is canceled. This means that the return's status is CANCELED.

returns/update

Occurs when a return is updated without errors on an order, and includes data on changes made to the return.

returns/close

Occurs when a return is closed. This means that the return's status is CLOSED.

returns/reopen

Occurs when a return is reopened. This means that the return's status is OPEN.

reverse_fulfillment_orders/dispose

Occurs when a disposition has been made.

Reverse fulfillment orders webhook

reverse_deliveries/attach_deliverable

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.

Reverse deliveries webhook

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

  • Shopify does not have a native flow to handle returns for gift cards

    • Merchants will still need to leverage Loop’s adjustment reports to rectify Shopify reporting for gift card outcomes

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


Please reach out to support@loopreturns.com with any additional questions.