Item shows in returnable fulfillments despite final sale (copy)

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.

1 Like

Hey @joshua_extend,

Thanks for reaching out about this. For API access to the return rules, you’ll need to use the customer account API. order - Customer API

Guide here:

The functionality you are seeing in the admin API mirrors more the functionality of the stores admin, where any authorized staff can create returns, even for final sale products.

@KyleG-Shopify in our case we were hoping to do async processing ahead of time for our claim/adjudication system depending on the final sale status of the item.

From my understanding of the customer API we wouldn’t be able to do any processing if we used that until the customer who checked out via Shopify authenticated via the customer API and we made further requests on their behalf - is that correct?