There has been a behavioral change in the data returned by the inventoryItems query in relation to inventoryLevels. In the past, if an adjustment was made to an inventory level in Admin (i.e. Safety Stock) the updatedAt date would be updated in inventoryLevels.
Now when an adjustment is made in Admin, the updatedAt is unchanged. This behavioral change happened some time between 2/25/25 and 4/2/25, as I can see an example adjustment that affected the updatedAt on Feb 28th - then a subsequent adjustment on 4/2 which did not change the updatedAt.
Any ideas on why this behavior was changed? This makes it impossible to track when anything changed on an inventoryLevel. See the sample query below of what we are doing to get the updatedAt for a specific inventory level.
This happens with all quantities other than available. If we update damaged, quality control, safety stock, other (reserved), or incoming then the quantity.updatedAt is updated but the inventoryLevel.updatedAt is not.
But if we update the available quantity then both the quantity.updatedAt and inventoryLevel.updatedAt are updated as expected.
This is a problem because we now can’t query to determine when any of these amounts have changed, since there is no way we’ve found to query on quantities.updatedAt. Also, the inventory_level webhook payload only includes Available, so this isn’t an option either.
If there is a way that we could get the behavior reverted that would be great.
Sorry for the delay here, Sam. I actually had a similar support question last fall (good thing I kept good notes) and the behavior you’re seeing now matches what I found then. The inventoryLevel.updatedAt timestamp is specifically tied to changes in the “available” inventory state only, while other states like safety stock will update their individual quantities.updatedAt values but not the parent inventoryLevel.updatedAt.
I’m curious about the specific example you mentioned where an adjustment on Feb 28th did update the updatedAt field, but a similar adjustment on April 2nd didn’t. Could you share more details about what type of adjustment was made in each case? This would help me understand if there’s something else at play.
In the meantime, here’s a query that shows how to access the individual updatedAt timestamps for each inventory state:
{
inventoryItem(id: "gid://shopify/InventoryItem/YOUR_INVENTORY_ITEM_ID") {
id
inventoryLevels(first: 10) {
edges {
node {
updatedAt
location { id }
availableQuantity: quantities(names: "available") {
name
quantity
updatedAt
}
safetyStockQuantity: quantities(names: "safety_stock") {
name
quantity
updatedAt
}
damagedQuantity: quantities(names: "damaged") {
name
quantity
updatedAt
}
onHandQuantity: quantities(names: "on_hand") {
name
quantity
updatedAt
}
}
}
}
}
}