GraphQL. Product tag is cached.

Shopify Partner
5 0 7

Hello, everyone.
I'm having an issue with product tags.
After the update the product tags via API, the graphQL query still works with old product tags.
Only after ~10 seconds, it returns me correct response filtered by a newly added tag.
My query:

 query {
      products(query: "tag:*(my-added-tag)*", first: 10) {
        edges {
          node {
            images(first: 1) {
              edges {
                node {
            variants(first: 1) {
              edges {
                node {
                  presentmentPrices(first: 1) {
                    edges {
                      node {
                        price {

Any suggestions? 



Replies 9 (9)

Shopify Partner
2 0 4

Bumping this - hoping someone has been able to find a solution!

We have been running into the exact same problem. There is a 10-45s delay between when we write an update to one or more product's tags using the REST API and when that update is reflected in the results of a GraphQL query.

1 0 3

Same issue. When our client changes shopify tags and then uses our tool to query (by tag) & process orders, they get out of date information!

Shopify Expert
54 0 12

Hi all! Did anyone ever get this sorted out?

Recipe Kit - Easy, beautiful & SEO friendly recipe cards on your Shopify blog posts - - Product Waiting Lists -
Better Blog Comments -
Shopify Partner
2 0 4

For our needs, this is still an ongoing problem; we have had to put in wait timers and notices to the user that the data will be updated "soon".

It's a poor user experience, but it's all we have to go off of right now.

Shopify Partner
6 1 2

Our integration is running into this too when querying for orders from Shopify.  If a user adds a certain tag to an order we don't want to import the order into our system, but if the user adds the tag and runs our integration within a minute afterwards the order still imports.

Shopify Partner
1 0 1

This seems to be still a problem. It is in the Orders object as well. Wow, this can cause some serious issues with integrating with ERP system. Duplicate orders are a problem if you use the tag field to mark an order as processed. Hope there is a solution soon. 


Work around, check the tag fields of the returned object for the tag you are looking for or not looking for to be there.

Shopify Partner
6 0 1

Does this ever get resolved? I am facing the same problem.

Shopify Staff
1415 231 484

Hey @AminRafaey , thanks for following up on this here. I have tested on my end and I also see around 9-10 seconds before the tag is returned in a query filter. 
I'll be sure to let our product teams know that this has been an ongoing issue so they can look in to ways to improve the speed that this is available through the filter query. 

The data is being written immediately though, so a couple of options here in the meantime would be to use the Products Update webhook to get immediate updates when a tag is changed or added, or you can query the product by ID to return it's tags. 


Hope that helps, 


- Kyle G.

Developer Support @ Shopify
- Was this reply helpful? Click Like to let us know!
- Was your question answered? Mark it as an Accepted Solution
- To learn more visit or the Shopify Web Design and Development Blog

5 0 0

I am encountering a similar issue.

Here's my case:

  • Building: Shopify Embedded app
  • Using: Remix
  • Query: "query: (fulfillment_status:unshipped) AND (financial_status:paid)"


I'm listing unfulfilled order in loader



export const loader = async ({ request }: LoaderFunctionArgs) => {
const { admin } = await authenticate.admin(request);

// wait for 10 seconds to have updated data
await new Promise((resolve) => setTimeout(resolve, 10000));

const orderReq = await admin.graphql(`#graphql
query GetOrders) {
orders(first: 50, reverse: true, query: "(fulfillment_status:unshipped) AND (financial_status:paid)") {
  nodes {

const ordersJson = await orderReq.json();
// console.log(JSON.stringify(ordersJson, null, 2), "ordersJson");
const ordersData =;
const orders = ordersData?.orders.nodes;

return json({



After fulfilling orders using the fulfillmentCreateV2 API through useFetcher, the loader is triggered and calls the API with the query: (fulfillment_status:unshipped) AND (financial_status:paid). This query should not return the fulfilled orders, but the result remains the same as the first time. However, the displayFulfillmentStatus has been updated to FULFILLED.


After a day of debugging and research, I found this post and tried putting:

await new Promise((resolve) => setTimeout(resolve, 10000));

before the fetch inside the loader. Guess what? The query gets the expected result.

My guess is that the results of the orders query are cached by orderId for about 10 seconds