Transfer was sent to us via inventory_transfers/complete webhook. We retrieved it via GQL and it has no destination. I think this is the first we’ve seen like this.
Shopify Assistant says the Transfer could complete and the destination then be deleted. Seems odd but plausible.
After some additional poking it said:
That usually points to one of:
Legacy/older transfers
Older inventory transfer records (from before the current data model) may not have a destination snapshot set. These can still emit webhooks and be visible over GraphQL.
Internal or edge-case operations
Certain internal operations (e.g., bulk inventory movements, historical imports, or admin-side migrations) may create InventoryTransfer records in a way that doesn’t attach a destination snapshot, even though the UI today always shows one.
Data anomaly / bug
It could also be a genuine data inconsistency: the transfer reached complete status but the destination snapshot write failed or wasn’t attempted. Because the field is nullable, the API doesn’t reject that record.
Could anyone elaborate on these cases and/or their experience with a nil destination?
We have no problem ignoring it but it does feel like we could be missing something in our process and that something should be add or removed somewhere as a result of this.
Snapshot of the destination location (name, address, when snapped) with an optional link to the live Location object. If the original location is deleted, the snapshot data will still be available but the location link will be nil.
When you query the transfer after receiving the webhook, do you see any additional details there to see if it does or doesn’t have a destination?
Hey @sshaw, this is expected behavior. As of the 2026-01 API version, inventory transfers can be created without specifying an origin or destination location. This supports workflows where inventory leaves a Shopify-tracked location for somewhere outside Shopify, like an untracked warehouse or a write-off.
One distinction helps when handling these:
If destination itself is nil, the transfer has no Shopify destination associated with it. This is a valid state.
If destination exists but destination.location is nil, Shopify has snapshot data for the destination but the live Location is deleted or inaccessible to your app.
Hey @sshaw, this is expected behavior. As of the 2026-01 API version, inventory transfers can be created without specifying an origin or destination location.
We are seeing this for inventory_transfers/complete webhooks with status of TRANSFERRED. Both origin and destinaiton must have been given to get to this state, right?
One distinction helps when handling these:
If destination itself is nil, the transfer has no Shopify destination associated with it. This is a valid state.
We are also seeing origin locations that are nil too. Given the frequency we see this I do not think users are deleting their destinations and origins this much
If destination exists but destination.location is nil, Shopify has snapshot data for the destination but the live Location is deleted or inaccessible to your app.
“inaccessible” sounds like the underlying issue. How would we make it accessible to our app? When an install occurs we fetch all locations. When location-related hooks are fired we do the right CRUD thing for the location but, I suppose that if we never had access, then they would not see the location is our app ever, and therefore we could ignore this case since it was not possible for them to do things with that location in the app. The concern would be if we had access then
we no longer did, would we recieve a webhook for this? I imagine delete hook is not appropriate for this case. Not sure if there is something for this case.
Thanks for sharing that @sshaw. In stores where you are seeing this, do you have access to the admin to see if what you are getting returned via API is different than what’s reflected there? That can help us see if this is specific to permissions with the app if the location is in the admin but returned empty to you.
Though I have seen in the past in users’ Admin fulfillers like Amazon configured so maybe these transfers are for things like this? I can message you InventoryTransfer IDs if it helps.
It could be possible. It’s hard to say forsure without a specific example to look in to. If you could request collaborator access on a store where you’re seeing this, it could help determine if what you are getting back is correct or not.
We would need permissions on the shop to be able to look in to that. Once you have collaborator access, reach out to our support team in the help center so we can dive in to that!
If destination exists but destination.location is nil, Shopify has snapshot data for the destination but the live Location is deleted or inaccessible to your app.
“inaccessible” sounds like the underlying issue. How would we make it accessible to our app?
How to do this?
We already have enough issues with what Shopify is doing with reviews (some —but not all— of this can be seen here) so, unfortunately, we cannot say to app users: we think Shopify is not working correct or, maybe it is working correctly but our app is not, so please give us access so we can investigate