Product search API silently fails

Extensions API version: 2026-01

Description

Both shopify.productSearch.searchProducts() and shopify.productSearch.fetchProductWithId() silently fail at the same time on certain devices, while the native Shopify POS search bar continues to work correctly for the same products.

What we observed

In a screen recording from one of our café locations:

  1. searchProducts({ queryString: "latte" }) returns 0 results, we have 20+ products containing “latte” in their title. The same query via the native POS search bar returns results immediately.

  2. fetchProductWithId(id) returns the product shell but with empty variants, the product’s title, id, minVariantPrice are populated correctly but variants are missing.

  3. Both failures happen simultaneously on the same device/session.

Hypothesis

The shopify.productSearch API appears to work against a local on-device product catalog cache, while the native search bar hits the live Shopify API directly. When the device cache becomes desynced or partially corrupted for a location, all productSearch calls fail, but since the native search bypasses this cache, it continues to work.

The partial data returned by fetchProductWithId (title/price present, variants missing) supports this: it looks like some fields are indexed separately and survive a partial cache corruption, while the full variant data does not.

Workaround

Baristas report that restarting the POS app resolves the issue.

Hi @Gunes, you’ve noted this happens on certain devices only. Can you share more information on that so we can investigate further?

hey @Paige-Shopify :slight_smile:

yes, it only happens in this one cafe and no other locations so far.

device details:

model: Air 13-inch (M2) (Wi-Fi)
os: iPadOS 26.3 (23D127)
shopify app: 11.0.0

connections tab

the connections tab during one of the incidents, photo taken by the barista

extension details

shopify api: 2026-01
shopify ui extensions: @shopify/ui-extensions: 2026.01

product + location settings

  • pos only products are not inventory tracked
  • all pos locations are pos pro + physical storefront active

let me know what else might help so i can gather that info also, thanks!

hey @Paige-Shopify,

I added a diagnostics screen yesterday, I have some more info.

As predicted product.variants.length is 1, but product.numVariants is 12.

Perfect, thanks for that extra context.
Just to make sure, is this happening consistently or sometimes?

It’s happening sometimes and not consistently.

I’ve also now deployed a workaround/test-fix to “refetch” the variants with fetchProductVariantsWithProductId, if the variants.length does not match numVariants but i dont know if this explicit call will work or not as fetchProductWithId already supposed to have the variants in there.

Another update:

After some investigation, we’ve discovered that it’s happening in multiple locations, but only some baristas were reporting it, so not tied to a certain location anymore.

Thanks for sharing!
We’ve investigated this on our end, and found that for your use case you would need to use fetchProductVariantsWithProductId(id) which returns all variants instead of fetchProductWithId(id) which will only return the first variant.

hey @Paige-Shopify, thanks for the info.

As I’ve written earlier I’m already using the fetchProductVariantsWithProductId(id) as a fallback if and when the fetchProductWithId(id) does not return full variants.

But the funny thing is, it does almost always. This expectation is also stated in the docs:

So, there’s some bug, somewhere, with the local caching strategy somewhere? Idk, I guess that is for you guys to figure out.

Also, the productSearch calls are also silently failing (not returning anything), when there’s an incident with the fetchProductWithId(id) only returning one variant, with products that are clearly searchable when the native search bar is used or the shopify pos app is restarted. And this productSearch API sadly does not have a fallback/alternative that I can use.

1 Like

Just to add some extra info, another report came in from a barista today.

In the component, I’m using the scanner to get the barcode, then I’m using

const results = await shopify.productSearch.searchProducts({ queryString: barcodeString })

You can see that the scan data is there and scanning worked fine, but the searchProducts API returns nothing. You can immediately scan the same product afterward through the native search or in our extensions again after closing down and restarting the Shopify POS app.

I assume everyone can imagine how annoying it would be to dismiss, relaunch, and log in every time this happens.

I hope this helps with the investigation.

Good point! Sorry, I forgot you said that.

Since that’s ruled out, we’ll keep investigating this issue. The detailed information you’re sharing here definitely helps with our investigation, thanks :slight_smile:

1 Like

@Paige-Shopify @Gunes

I believe this is the same issue that we reported last year and it’s begun to recur recently: Ongoing Data Synchronization issues affecting POS ProductSearch API

2 Likes

@Paige-Shopify just wanted to bump this, is there any update here?

We believe this Data Synchronization => Product Search API data corruption issue has recurred starting earlier this year since we last reported it in August 2025 (and were told it was fixed).

We don’t have the specific logs, but based on merchant feedback, we believe we have experienced instances of where the price is missing a decimal (e.g., 2.5 vs. 2.50) which has caused an issue with the Shopify formatMoney helper function we use.

And in addition, similar issues around products / variants objects that @Gunes described.

As mentioned in my original post, it only randomly affects a subset of merchants and it’s difficult to reproduce; only a Reset Account in iOS Settings seems to solve it.

Hi @derrick, thanks for sharing the post and that additional context. The missing decimals issue is interesting; I’ll look into whether it has the same root cause or needs separate investigation.

I’ll provide an update here once we have more information. This is in our backlog at the moment due to current priorities.