Anomalous graphQL product. Visible to admin but not storefront. A COPY is visible to both

Topic summary

A user encountered a GraphQL query anomaly where an active product appeared in admin API searches but was invisible to storefront API queries. Notably, a duplicate copy of the same product was visible to both APIs.

Initial troubleshooting:

  • Support suggested verifying the product was published to the correct sales channel/app for storefront API access
  • User confirmed both products showed identical sales channel and market settings
  • Support recommended adding pageInfo object for pagination and using sortKey parameter to improve query results

Resolution:

  • The issue resolved spontaneously overnight—the original query began returning both products correctly from both admin and storefront APIs
  • User speculated a backend database cleanup process may have run automatically
  • Since the defect is no longer reproducible, no further investigation was possible

Discussion outcome:
The conversation concluded with the user seeking private communication channels for a separate question. Support clarified they only operate through public forums, directing sensitive matters to Shopify’s partner support team via their help center.

Summarized with AI on November 11. AI used: claude-sonnet-4-5-20250929.

Hello,

I seem to have created a product that is visible to searches from my admin but invisible to storefront. Same holds for using admin products view as well as direct graphQL from my javascript script and from the GraphiQL access tool.

Notable is that when I create a duplicate copy via the admin page, the copy is fully visible to both.

This is true for search by tag or productType. I am using graphQL version 2024-04 for both. The product is ACTIVE.

The deviant product is fully visible by direct product graphQL access using its id.

This is the code which shows the deviant product “defecto” and its copy “defecto2”. This is on the store “stranddesigner4”.

Please someone check this product out and let me know what monster I have created! Thanks and best regards. jb

query Fetch_New_Products (
			$q: String!
			) {
		designs: products(first: 5, query: $q) {
			edges {
				node {
          id
          title
          productType
          tags
          handle
				}
			}
		}
	}
	
Variables:
{
  "q": "product_type:'defecto'"
}

Storefront gives this result:

{
  "data": {
    "designs": {
      "edges": [
        {
          "node": {
            "id": "gid://shopify/Product/7948198150322",
            "title": "defecto2",
            "productType": "defecto",
            "tags": [
              "defecto"
            ],
            "handle": "copy-of-defecto"
          }
        }
      ]
    }
  }
}

Admin search gives this result:

{
  "data": {
    "designs": {
      "edges": [
        {
          "node": {
            "id": "gid://shopify/Product/7947215896754",
            "status": "ACTIVE",
            "title": "defecto",
            "productType": "defecto",
            "tags": [
              "defecto"
            ],
            "handle": "bare-strand-460mm-1"
          }
        },
        {
          "node": {
            "id": "gid://shopify/Product/7948198150322",
            "status": "ACTIVE",
            "title": "defecto2",
            "productType": "defecto",
            "tags": [
              "defecto"
            ],
            "handle": "copy-of-defecto"
          }
        }
      ]
    }
  },
  "extensions": {
    "cost": {
      "requestedQueryCost": 5,
      "actualQueryCost": 3,
      "throttleStatus": {
        "maximumAvailable": 2000,
        "currentlyAvailable": 1997,
        "restoreRate": 100
      }
    }
  }
}

This access by the deviant product id shows results in both storefront and admin:

{ 
  product (id:"gid://shopify/Product/7947215896754")
	{
    id
    title
    productType
    tags
    handle
  }
}

result via storefront:

{
  "data": {
    "product": {
      "id": "gid://shopify/Product/7947215896754",
      "title": "defecto",
      "productType": "defecto",
      "tags": [
        "defecto"
      ],
      "handle": "bare-strand-460mm-1"
    }
  }
}

result via admin:

{
  "data": {
    "product": {
      "id": "gid://shopify/Product/7947215896754",
      "status": "ACTIVE",
      "title": "defecto",
      "productType": "defecto",
      "tags": [
        "defecto"
      ],
      "handle": "bare-strand-460mm-1"
    }
  },
  "extensions": {
    "cost": {
      "requestedQueryCost": 1,
      "actualQueryCost": 1,
      "throttleStatus": {
        "maximumAvailable": 2000,
        "currentlyAvailable": 1999,
        "restoreRate": 100
      }
    }
  }
}

Hey @den232 ,

That’s an interesting one. The first thing I would check is to confirm if the product is published to the channel/app that you’re using to query through the storefront API.

That’s probably the most common reason. IF it’s still not returning after that, then we may want to take a closer look. This would be a good one to reach out to our support teams for so we can take a look at the actual settings and offer further guidance.

Kind Regards,

Kyle G.

Thanks for looking at this, Kyle. Both the defective product and its functional copy show the same sales channels and markets.

Note that the copy was produced by the “duplicate” command in product admin. Subsequent tag, title, description, status and product type changes have had no effect on the storefront visibility.

Pls let me know your recommendations.

Greetings jb

Hey jb!

Thanks for confirming that. Taking another look at your query, since you’re using a query variable, I would try adding in the pageInfo object. https://shopify.dev/docs/api/usage/pagination-graphql#the-pageinfo-object

Sometimes when you’re not getting full results back, you’ll find that they are there, but are being returned on a subsequent page. You can also use the sortkey to bring the results closer together when using a query. https://shopify.dev/docs/api/storefront/2024-01/queries/products#argument-sortkey

Once you’ve tried that, if it still seems strange, or not really working as you’d expect, reach out to our support team so we can look in to the specific store and products!

Hope that helps,

  • Kyle G.

Well Kyle,

It’s a new day here just outside Boston and it looks to be a new day in graphQL land as well. The original query now returns both products (as it should have) from both storefront and admin. My guess: some sort of database cleanup process has run behind my back. I guess since the defective result is no longer reproducible, that is the end of our discussion. If you’d like me to run any other tests, let me know, I’d be happy to. Anything in pursuit of a bug!

For the record, the query this morning:

query Fetch_New_Products (
			$q: String!
			) {
		designs: products(first: 5, query: $q) {
			edges {
				node {
          id
          title
          productType
          tags
          handle
				}
			}
		}
	}
	
variables:
{
  "q": "product_type:'defecto'"
}

The storefront response this morning:

{
  "data": {
    "designs": {
      "edges": [
        {
          "node": {
            "id": "gid://shopify/Product/7947215896754",
            "title": "defecto",
            "productType": "defecto",
            "tags": [
              "defecto"
            ],
            "handle": "bare-strand-460mm-1"
          }
        },
        {
          "node": {
            "id": "gid://shopify/Product/7948198150322",
            "title": "defecto2",
            "productType": "defecto",
            "tags": [
              "defecto"
            ],
            "handle": "copy-of-defecto"
          }
        }
      ]
    }
  }
}

and the admin response this morning:

{
  "data": {
    "designs": {
      "edges": [
        {
          "node": {
            "id": "gid://shopify/Product/7947215896754",
            "status": "ACTIVE",
            "title": "defecto",
            "productType": "defecto",
            "tags": [
              "defecto"
            ],
            "handle": "bare-strand-460mm-1"
          }
        },
        {
          "node": {
            "id": "gid://shopify/Product/7948198150322",
            "status": "ACTIVE",
            "title": "defecto2",
            "productType": "defecto",
            "tags": [
              "defecto"
            ],
            "handle": "copy-of-defecto"
          }
        }
      ]
    }
  },
  "extensions": {
    "cost": {
      "requestedQueryCost": 5,
      "actualQueryCost": 3,
      "throttleStatus": {
        "maximumAvailable": 2000,
        "currentlyAvailable": 1997,
        "restoreRate": 100
      }
    }
  }
}

Thanks for following this thru … and All the best, jb

Greetings Kyle,

I have a question I would like to ask you privately. May I? How do I reach you?

Thanks and best regards, jb

Hey @den232 ! That’s great to hear that you are now getting the expected results. Definitely let us know through our support teams if it pops up again.

I would love to chat, however I don’t currently have a way to discuss privately through the forums. For anything that’s sensitive to public viewing would be best through our Partner Support channels.

Have a great rest of your week,

Kyle G.

Thanks Kyle. I’m feeling at least frustrated, and more accurately inept here. Have searched for your name in slack , discord, the main partner contact page, but to no avail. Can you point me in detail to a partner support channel where I might find you? Cheers jb

Hey jb, sorry for that confusion!

Currently the only public facing channel our team works out of is here in the forums.

For anything sensitive though, our partner support team can be contacted here and they have the resources available to them to address most issues and loop in escalated teams when needed: https://help.shopify.com/en/support/partners/org-select

Cheers,

  • Kyle G.

mmm Kyle,

… just so I understand and quit pestering you, the answer you are giving me is one that would have made Dostoevsky proud. The only channel I can use is this one, and I cannot use this one. Do I get it, or am I missing a subtlety?

Thanks! jb

Sorry for any confusion, jb.

To clear it up, in my role here, I am not personally available for private conversations, however, our support teams are equipped and trained to handle any questions you may have outside of the forum.

  • Kyle