Skip to content

Can You See a Competitor's Shopify Inventory Levels?

Since December 2017, Shopify keeps unit counts out of a store's public product data. Here is what you can still see about a rival's stock, and how to check.

Thomas Pham · · 7 min read

An empty cardboard box with its flaps open, drawn in glowing dots: you can see sold out, not how many were left.

A rival's best seller shows "Sold out" and you want to know what that means. Did they move a lot of units, or did they only ever have a handful? Is it worth ordering more of your own version before the season turns? The tools in the search results promise to track restocks and sell-outs "down to the variant and SKU". Before you trust one, it helps to know what Shopify actually puts in public view.

Updated 16 October 2026. Facts checked against the linked sources on 8 October 2026 and re-checked on 16 October 2026.

Can you see a competitor's Shopify inventory levels?

Usually not the unit count. For stores created after December 5, 2017, Shopify leaves the quantity out of the product data a theme prints as JSON. What anyone can see, on any Shopify-hosted store, is whether each variant is available to buy right now: a yes or a no. The one exception is a store that chooses to print the number on its own page.

That one-line answer covers most stores. The rest of this post is what sits behind it, so you can tell a real signal from a guess.

What does Shopify make public about a product?

Every theme hosted by Shopify comes with an Ajax API that doesn't require an access token or a client ID. Add .js to the end of a product's address (for example /products/black-one-piece.js) and the store returns that product's data as JSON. For each variant you get its price, SKU, option values, whether Shopify tracks its inventory, and available: true or false.

There is no quantity in that response. Shopify's documented example for the endpoint (Ajax API, Product) lists the variant fields, and a stock count is not among them. You can see inventory_management, which tells you whether the store lets Shopify track that variant's stock, but not how much stock there is.

Two limits are worth knowing:

  • It only works on Shopify-hosted themes. Shopify says so in the Ajax API overview. A store running a fully custom front end may not answer at all.
  • The whole-catalogue dump is not documented. Many scrapers read a store-wide /products.json list. Shopify's Ajax reference documents the single-product endpoint, cart, recommendations and predictive search, and nothing else. Treat the catalogue list as something that often works, not something Shopify promises.

Why is the unit count hidden?

Because Shopify decided it should be, and wrote down why. Its documentation for the Liquid json filter, which "converts a string, or object, into JSON format", says that on any store created after December 5, 2017, it leaves out each variant's inventory_quantity and inventory_policy. The stated reason is to stop bots and crawlers reading stock levels for stores they have no access to.

The wording is in the json filter reference. It matters because it changes how you should read any tool that claims to know a rival's stock. This is not a gap a clever scraper has found a way around. The platform takes the number out before the data leaves the store, on purpose, and says so.

The merchant still has the number. Inside their own theme, Shopify's variant object still offers inventory_quantity, so the store's own templates can use it. That is usually the only way a real count reaches a stranger.

Where can a real number still show up?

On the product page itself, when the merchant chooses to show it. Dawn, a theme Shopify publishes, has an inventory block a merchant can add to the product page. It is not part of Dawn's default product template, so someone at the store has to switch it on. When they do, the count is plain text on the page.

How Dawn's block behaves, from its source code:

What the variant's stock isWhat the block prints, with the count option on
Above the merchant's threshold"N in stock"
At or below the threshold, above zero"Low stock: N left"
Zero or below, store stops selling"Out of stock"
Zero or below, store keeps selling"In stock"

The threshold is the merchant's choice, between 0 and 100, and starts at 10. Showing the count is a checkbox that starts ticked. With it unticked, the block says only "Low stock" or "In stock". It also only appears for variants whose stock Shopify tracks.

The table is Dawn's wording. The check is the same on any store:

  1. Open the product page.
  2. Look near the price and the buy button for a stock line: "N left", "Low stock", "In stock".
  3. If there is a number, that is the store's own count for the variant shown, at the moment the page loaded.
  4. If there is no line, or one without a number, the count is not public for that store. That is unknown, not zero.

Note the last row of that table. A store that keeps selling past zero can show "In stock" with nothing on the shelf. "In stock" on a page is a message the merchant configured, not proof of units.

Doesn't the Storefront API have a quantity field?

It does, and it does not help an outsider. Shopify's Storefront API has quantityAvailable on each product variant. Reading it needs a Storefront access token with the unauthenticated_read_product_inventory scope. The store grants that token to its own sales channels and apps. You cannot get one for someone else's shop.

The field anyone can read there is availableForSale, which "indicates if the product variant is available for sale". It is the same yes-or-no you already get from the product page. Both fields are in the ProductVariant reference.

So the API route ends where the public route does: you can see whether a variant is for sale, and the number belongs to the merchant.

What do the "track competitor stock" tools actually show?

Changes in that yes-or-no, over time. A tool that reads a store's public product data on a schedule can see a variant go from available to unavailable and back, and roughly when it happened. It usually cannot see units left, and it cannot see units sold or how fast something sells, because Shopify keeps those numbers out of the data it reads.

"Restocks and sell-outs down to the variant and SKU" is true as far as it goes. Each variant has its own flag, so a tool can tell you size M of a product sold out while size L did not. What the phrase leaves out is that the flag is all there is. A sell-out could be the end of a large run or the end of a tiny one, and the data cannot tell those apart.

That is still a useful signal if you read it for what it is. Say you sell swimwear and a rival's black one-piece goes to sold out in the middle sizes a week before a holiday weekend, while the outer sizes stay in stock. You do not know how many they sold. You do know they could not take orders in the sizes most people buy, at the moment people were buying. If your own version is in stock, that week is a reason to put it in front of shoppers, and when the rival's page flips back to available, you know the window has closed.

The mistake is turning that into a number. A tool or a spreadsheet that shows "units sold" for a rival's Shopify product, where the store does not print a count on its page, is usually estimating. An estimate can be useful, but it should be labelled as one.

Watching sell-outs without checking by hand

Checking one rival's product page by hand is easy. Watching several rivals' whole catalogues for what went out of stock and what came back is the part that does not get done.

That is the job ecvision does for availability, and it follows the same rule as this post. A tracked competitor's product gets a "Sold out" badge only where the storefront itself said the product was unavailable. The products view has a Stock filter (All, In stock, Sold out) across the stores you track. There is no unit count in it, because the stores do not publish one, and ecvision does not make one up on their behalf.

If that is the watchlist you have been keeping by hand, see pricing.

A quick checklist

  • Unit counts: usually not public. Shopify leaves them out for stores created after December 5, 2017, unless the store prints them on the page.
  • Available or not, per variant: public on any Shopify-hosted store, via the product's .js data or the page itself.
  • A count on the page: real, but only for the variant shown, at the moment the page loaded, and only if the merchant turned it on.
  • "In stock" on the page: a message, not proof of units. A store that keeps selling at zero can show it.
  • Storefront API quantity: needs a token only the store can issue.
  • "Units sold" for a rival: an estimate, unless it came from a number the store printed.

Sources

Read on 8 October 2026 and re-checked on 16 October 2026.

  • Shopify Developer docs, Liquid json filter: why inventory_quantity and inventory_policy are left out of product data for stores created after 5 December 2017.
  • Shopify Developer docs, Liquid variant object: inventory_quantity and available, as a store's own theme can use them.
  • Shopify Developer docs, Ajax API, its reference and Product endpoint: an unauthenticated API on Shopify-hosted themes, read one product at a time with .js, with an available flag per variant and no stock count.
  • Shopify Developer docs, Storefront API ProductVariant: availableForSale, and quantityAvailable, which needs the unauthenticated_read_product_inventory scope.
  • Shopify's Dawn theme on GitHub: the product section with its inventory block and settings, the English strings it prints, and the default product template, which leaves the block out.
  • ecvision, the Products page (the Sold out badge and the Stock filter), as it appears in the app today.

More from the blog