November 3, 2026 · Muhammad Rehan · More by Muhammad Rehan
Shopify Replaces returnReason With ReturnReasonDefinition
Shopify's new ReturnReasonDefinition type replaces the returnReason enum — here's what ERPs and return-analytics tools need to change.

A stable handle instead of an enum
Shopify's GraphQL Admin API replaced the ReturnReason enum with a new ReturnReasonDefinition type in API version 2026-01, according to Shopify's changelog. The new type carries an id, a handle, a localized name, and a deleted flag. The handle — example values given include arrived-late, too-tight, and quality — is the stable, version-independent identifier meant for programmatic logic; the name field is explicitly the localized, user-facing string, which falls back to English when no translation exists.
The practical change for any integration creating returns: returnCreate, returnRequest, and orderRequestReturn now accept returnReasonDefinitionId on their line item inputs, and the old returnReason field is deprecated on both input types and return line item types. On the read side, ReturnLineItem and UnverifiedReturnLineItem expose returnReasonDefinition instead.
Picking reasons without hardcoding a list
Two query-side additions remove the need to maintain your own reason catalog. The returnReasonDefinitions query returns the full library of available reason definitions and supports filtering by ids or handles, so an app building a reason picker can populate it from the API rather than hardcoding values. Separately, a new suggestedReturnReasonDefinitions connection on LineItem returns reasons curated to that specific product's category — Shopify's documentation notes these suggestions aren't exclusive; any reason from the full library remains valid when creating a return via the API.
Deleted reasons don't disappear from history
The deleted field is the detail return-analytics pipelines need to handle carefully. A deleted reason definition keeps deleted: true and should no longer be offered to customers creating new returns, but it remains a valid value and may still appear on existing returns that were created before the reason was deleted, per the object's own field documentation. That means a reporting pipeline built only to query non-deleted reasons will silently drop or misjoin historical returns that reference a reason since removed from the active library — the fix is to treat deleted as a display-time filter, not a storage-time one, and keep deleted reasons queryable for historical joins.
For any ERP, 3PL sync, or return-analytics integration still sending the bare returnReason enum value, the migration is mechanical: switch write paths to returnReasonDefinitionId (sourced from returnReasonDefinitions or suggestedReturnReasonDefinitions), switch read paths to returnReasonDefinition, and make sure deleted-but-historical reasons aren't filtered out of past-return reporting.