The orders connection’s search query does not reliably return orders when filtering by financial_status:expired. We observe two different broken behaviors across stores:
Store A: the filter returns zero orders, despite orders having displayFinancialStatus: EXPIRED.
Store B: the filter returns a partial list — some expired orders come back, but other orders that clearly have displayFinancialStatus: EXPIRED are missing from the results.
This query returned an empty array
{
orders(first: 10, query: "financial_status:expired", sortKey: CREATED_AT, reverse: true){
nodes{
id
name
displayFinancialStatus
createdAt
}
}
}
But we can see in the orders that there are some orders with expired payment status. Example:
After running the query on an order with id
"order": {
"id": "gid://shopify/Order/6659611492671",
"name": "7001808",
"displayFinancialStatus": "EXPIRED"
}
Environment:
API: Admin GraphQL API
API version: 2026-07
Docs link: orders - GraphQL Admin
Hey @Akash_Singh, can you run that again with a few additions to make sure the orders are truly being excluded when they shouldn’t?
Can you add PageInfo to make sure the next page is false.
Also add in the debugging headers, Shopify-Search-Query-Debug=1. That will give us more clarity in to how the filter is being parsed: Shopify API search syntax
Hi, thanks — I ran it exactly as you asked, with pageInfo and the Shopify-Search-Query-Debug: 1 header. Here’s what I got:
Query: { orders(first: 10, query: "financial_status:expired", sortKey: CREATED_AT, reverse: true) { nodes { id name displayFinancialStatus createdAt } pageInfo { hasNextPage endCursor hasPreviousPage } } }
Headers: Shopify-Search-Query-Debug: 1
Response: {
"data": {
"orders": {
"nodes": ,
"pageInfo": { "hasNextPage": false, "endCursor": null, "hasPreviousPage": false }
}
},
"extensions": {
"search": [
{
"path": ["orders"],
"query": "financial_status:expired",
"parsed": { "field": "financial_status", "match_all": "expired" }
}
]
}
}
Thanks for sharing that @Akash_Singh. I was able to replicate the same on my end. I’m looking in to this further and will let you know what I find.
Hey @Akash_Singh I dug in to this further and found that the financial_status:expired search filter matches against the stored financial_status field on the order, not the computed displayFinancialStatus value. Orders that display as EXPIRED actually have a stored financial_status of authorized so the expired state is derived at read time when the payment authorization has lapsed.
The reason you’re seeing inconsistent results across your stores is that the stored financial_status can sometimes get updated as a side-effect when other actions modify the order. So a few expired orders will show up under the filter if a coincidental update happened, but most won’t. We’re aware of this gap and we’re looking in to ways to make the filter reliably match what displayFinancialStatus shows.
In the meantime, you can query financial_status:authorized and filter the results on your end by checking displayFinancialStatus == EXPIRED. Not the cleanest workaround, but that will get you the full set until we get this sorted out. I don’t have a timeline at this point, but will update when anything changes.