We want to know through the Admin GraphQL API whether or not an item was final sale once an order has been created. I tested this flow by adding a new Return Rule and adding some items to the final sale section:
I was then able to see via the customer self-service returns UI that the item on the order was indeed final sale:
My expectation was that if I queried returnableFulfillments
that I would only get one item - the one that wasn’t final sale.
I ran the following query:
curl -i -X POST \
https://joshua-draft-fixed.myshopify.com/admin/api/2025-07/graphql.json \
-H "Content-Type: application/json" \
-H "X-Shopify-Access-Token: my_token" \
-d '{
"query": "query($orderId: ID!) { returnableFulfillments(orderId: $orderId, first: 100) { pageInfo { endCursor hasNextPage hasPreviousPage startCursor } edges { cursor node { id returnableFulfillmentLineItems(first: 100) { pageInfo { endCursor hasNextPage hasPreviousPage startCursor } edges { cursor node { fulfillmentLineItem { id lineItem { id quantity refundableQuantity } } quantity } } } } } } }",
"variables": {
"orderId": "gid://shopify/Order/5553817288837"
}
}'
in the response to that query I get two fulfillment line items:
HTTP/2 200
date: Mon, 28 Jul 2025 15:37:49 GMT
content-type: application/json; charset=utf-8
x-sorting-hat-podid: 132
x-sorting-hat-shopid: 56313086085
vary: Accept-Encoding
referrer-policy: origin-when-cross-origin
x-frame-options: DENY
x-shopid: 56313086085
x-shardid: 132
x-stats-userid:
x-stats-apiclientid: 267195023361
x-stats-apipermissionid: 414998823045
x-shopify-api-version: 2025-07
content-language: en
strict-transport-security: max-age=7889238
x-request-id: 46d07b24-0bf1-4984-8aa7-eba48b8a77f2-1753717069
server-timing: processing;dur=94, graphql;desc="admin/query/other"
content-security-policy: default-src 'self' data: blob: 'unsafe-inline' 'unsafe-eval' https://* shopify-pos://*; block-all-mixed-content; child-src 'self' https://* shopify-pos://*; connect-src 'self' wss://* https://*; frame-ancestors 'none'; img-src 'self' data: blob: https:; script-src https://cdn.shopify.com https://cdn.shopifycdn.net https://checkout.pci.shopifyinc.com https://checkout.pci.shopifyinc.com/build/75a428d/card_fields.js https://api.stripe.com https://mpsnare.iesnare.com https://appcenter.intuit.com https://www.paypal.com https://js.braintreegateway.com https://c.paypal.com https://maps.googleapis.com https://www.google-analytics.com https://v.shopify.com 'self' 'unsafe-inline' 'unsafe-eval'; upgrade-insecure-requests; report-uri /csp-report?source%5Baction%5D=query&source%5Bapp%5D=Shopify&source%5Bcontroller%5D=admin%2Fgraphql&source%5Bsection%5D=admin_api&source%5Buuid%5D=46d07b24-0bf1-4984-8aa7-eba48b8a77f2-1753717069; report-to shopify-csp
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
x-xss-protection: 1; mode=block
reporting-endpoints: shopify-csp="/csp-report?source%5Baction%5D=query&source%5Bapp%5D=Shopify&source%5Bcontroller%5D=admin%2Fgraphql&source%5Bsection%5D=admin_api&source%5Buuid%5D=46d07b24-0bf1-4984-8aa7-eba48b8a77f2-1753717069"
x-dc: gcp-us-central1,gcp-us-central1,gcp-us-central1
alt-svc: h3=":443"; ma=86400
cf-cache-status: DYNAMIC
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=qCVRA1uKWpxXVYG1hl0dJsJlMVtDug4HF%2BHa4f4TvfIt2KN8qw1U%2FNVhiDMna4bIX8C1hsEpDk1v7%2BkC3ZFcfIsnnzpahP1XJ1jtBrJQLNr9xLej5OT0TaF%2FdEIEQkv3QTnNarzSmv%2FCzfuzGEKA5khUteHPCMW%2FKR3e%2BRjS"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
shopify-edge-ip: 2620:127:f00f:e::
server-timing: cfRequestDuration;dur=180.999756
server-timing: ipv6
server: cloudflare
cf-ray: 966575c3fe29ad58-ATL
{"data":{"returnableFulfillments":{"pageInfo":{"endCursor":"eyJsYXN0X2lkIjo1MTA4OTUzNTQ2ODg1LCJsYXN0X3ZhbHVlIjo1MTA4OTUzNTQ2ODg1fQ==","hasNextPage":false,"hasPreviousPage":false,"startCursor":"eyJsYXN0X2lkIjo1MTA4OTUzNTQ2ODg1LCJsYXN0X3ZhbHVlIjo1MTA4OTUzNTQ2ODg1fQ=="},"edges":[{"cursor":"eyJsYXN0X2lkIjo1MTA4OTUzNTQ2ODg1LCJsYXN0X3ZhbHVlIjo1MTA4OTUzNTQ2ODg1fQ==","node":{"id":"gid://shopify/ReturnableFulfillment/5108953546885","returnableFulfillmentLineItems":{"pageInfo":{"endCursor":"eyJsYXN0X2lkIjoxMTU2MzE0MTgyNDY0NSwibGFzdF92YWx1ZSI6MTE1NjMxNDE4MjQ2NDV9","hasNextPage":false,"hasPreviousPage":false,"startCursor":"eyJsYXN0X2lkIjoxMTU2MzE0MTc5MTg3NywibGFzdF92YWx1ZSI6MTE1NjMxNDE3OTE4Nzd9"},"edges":[{"cursor":"eyJsYXN0X2lkIjoxMTU2MzE0MTc5MTg3NywibGFzdF92YWx1ZSI6MTE1NjMxNDE3OTE4Nzd9","node":{"fulfillmentLineItem":{"id":"gid://shopify/FulfillmentLineItem/11563141791877","lineItem":{"id":"gid://shopify/LineItem/13432780324997","name":"The Multi-location Snowboard","quantity":1,"refundableQuantity":1}},"quantity":1}},{"cursor":"eyJsYXN0X2lkIjoxMTU2MzE0MTgyNDY0NSwibGFzdF92YWx1ZSI6MTE1NjMxNDE4MjQ2NDV9","node":{"fulfillmentLineItem":{"id":"gid://shopify/FulfillmentLineItem/11563141824645","lineItem":{"id":"gid://shopify/LineItem/13432780357765","name":"The Multi-managed Snowboard","quantity":1,"refundableQuantity":1}},"quantity":1}}]}}}]}},"extensions":{"cost":{"requestedQueryCost":272,"actualQueryCost":8,"throttleStatus":{"maximumAvailable":2000.0,"currentlyAvailable":1992,"restoreRate":100.0}}}}
Why do I get a returnableFulfillment for the ‘multi-location snowboard’ item that is final sale? Is that intentional? Is there any way for us to know what items were final sale from a customers perspective?
I have tried with a few different settings (collection vs individual final sale options), api versions, etc.