Shopify does not offer a dedicated webhook specifically for exchange events. Developers seeking to track exchanges must work around this limitation.
Current workaround:
Use the RETURNS_CLOSE webhook, which now integrates exchanges with returns
Detect exchanges by checking for exchangeLineItems within the return object
Challenges identified:
Exchanges trigger existing webhooks (orders/updated, refunds/create) but lack clear identification
This creates complications for external systems, particularly for invoicing and inventory management
When exchanges occur, refunds generate invoices, but newly exchanged items aren’t automatically captured
Status:
While the returns integration provides a functional workaround, developers note it’s “not as simple as it could be.” The discussion remains open regarding whether Shopify will introduce a dedicated exchange webhook in the future.
Summarized with AI on October 29.
AI used: claude-sonnet-4-5-20250929.
I’m currently working on integrating our Shopify store with an external system, and I need to monitor exchange events specifically. While I see that there are webhooks for orders/updated, refunds/create, and fulfillment events, I haven’t found a webhook dedicated solely to exchanges.
Does Shopify provide a webhook that triggers specifically when an exchange occurs? If not, what would be the recommended approach to detect and handle exchanges via webhooks or the API?
Any guidance or suggestions would be greatly appreciated!
+1 for this. I have an app that receives webhooks for paid, fulfilled, and refunded orders, but when there’s an exchange it messes everything up. A fulfilled order generates an invoice in my app. When an exchange happens, the refund generates an invoice, but there’s currently no way to detect an item that has been added to the order via an exchange and add that to the invoice as well. Would be amazing if there could just be a separate “exchanges” webhook!
Sort of! There is still no exchange webhook, but it’s been tightly integrated with returns, so now you can catch it on a “RETURNS_CLOSE” webhook. You can tell if it’s an exchange by checking for “exchangeLineItems” in the return. At least, that’s how I’m doing it!
It’s still not as simple as it could be, but I’ve been working on adding support for returns/exchanges in my app and it’s coming together.