Free reference · no signup · vendor-neutral
Why your inventory app thinks everything is dead stock
You install a replacement for Stocky. It scans. It reports that most of your catalogue has not sold in months. You know that is wrong, because you shipped several of those products last week.
The app is not lying to you and it is probably not broken. It is reporting honestly on data it was never given. Shopify's standard order permission covers orders created in the last 60 days and nothing before that — and an app that reads "no orders found" as "never sold" will produce exactly the report you are looking at.
This page describes us too. Inventory Surplus requests read_orders, not read_all_orders, so it has the same 60-day ceiling as everyone else without the grant. The full disclosure is further down, before the part where we ask you to install anything.
Five limits every Shopify inventory app inherits
None of these are things a vendor chooses. They come from the platform, or from arithmetic. What a vendor does choose is whether to tell you about them.
- 1
Your new app cannot see last year's sales — or even last quarter's
Shopify's `read_orders` permission, which is what an inventory app gets when you install it, covers "orders created within the last 60 days." That is not a rate limit or a sync delay that resolves overnight. Orders older than the window are simply not returned, and the app has no way to tell the difference between "this SKU has not sold in a year" and "this SKU last sold 61 days ago, which I am not allowed to see."
How to checkAsk the vendor one question: "do you hold the read_all_orders scope?" It is a separate permission that Shopify grants case by case, and it is the only thing that lifts the window. If the answer is no, then any "days since last sale" number the app shows you is capped at 60 — treat anything at or above that as "unknown", not as "dead".
Source: Shopify documentation — shopify.dev/docs/api/usage/access-scopes
- 2
The permission that lifts it is not one you can grant
`read_all_orders` returns "all relevant orders rather than the default window of orders created within the last 60 days." You cannot approve it at install time even if you want to. The developer has to request it from Shopify in the Partner Dashboard under API access, explain the use case, and wait for review. That is why so many inventory apps quietly have the same blind spot: it is gated on Shopify, not on effort.
How to checkDo not take a screenshot of a long sales chart as proof. An app can show you a two-year chart built from data it started collecting the day you installed it. Ask when the data series starts, not how long it looks.
Source: Shopify documentation — shopify.dev/docs/api/usage/access-scopes
- 3
An app without the scope can still build history — but only forwards
An app that archives what it sees on a schedule accumulates its own record from install date onwards. After six months you have six months of history. What no app can do is reach backwards past the window on the day you install it, so the first weeks after switching are precisely when every tool is at its least reliable — which is also when people make their migration decisions.
How to checkGive any new inventory tool a grace period before you act on its dead-stock list. The list gets more trustworthy every week it runs, and its worst day is day one.
Source: Arithmetic
- 4
Out-of-stock days make healthy products look slow
Sell-through and daily-velocity figures are a division: units sold ÷ days. If the denominator is days elapsed rather than days the product was actually in stock and purchasable, then every stockout drags the number down. A SKU that sold out in a week and spent three weeks at zero reads as a quarter as fast as it really is — and lands on a reorder-later or clearance list it does not belong on.
How to checkTake the three products you know sold out recently and look them up in the tool. If they appear slow, the denominator is wrong, and every ranking in the app is affected — not just those three.
Source: Arithmetic
- 5
Purchase-order history has no import path at all
Shopify states that historical purchase orders from Stocky cannot be imported. There is no write API for purchase orders, so no replacement app can bring them in, however much it would like to. The CSV you exported is the only copy, and it is a file, not a feature.
How to checkKeep the export somewhere you will still find it in two years, and stop evaluating apps on whether they can import it. None of them can.
Source: Shopify documentation — help.shopify.com/en/manual/products/inventory/transitioning-from-stocky
Five questions to put to any inventory app
Copy these into a support chat before you commit to a tool. The answers take a vendor thirty seconds and tell you more than a feature grid does.
- Do you hold the read_all_orders scope, or are you limited to the default 60-day window?
- If not, do you archive order data from install date so history accumulates going forward?
- When computing sell-through, do you divide by days elapsed or by days the product was in stock?
- What does your app show for a SKU it has no order data for — dead, or unknown?
- How long should I let it run before I trust its dead-stock list?
Our own answers to those questions
A page about a limitation that does not say whether the author has it is an advertisement. So, plainly:
- Does Inventory Surplus hold the read_all_orders scope?
- No. It requests read_orders, so it is subject to the same 60-day window as every other app without the extra grant. The request is open with Shopify; until it is granted this page describes us too.
- Checkable in
shopify.app.toml - So what does that mean for the numbers it shows me?
- The scanner asks Shopify for 90 days of paid orders and receives at most 60. A SKU whose last sale falls in the gap between those two numbers looks to the app exactly like a SKU that has never sold. On a store with real seasonality that is not a rounding error — it is the difference between a clearance list and a restock list.
- Checkable in
app/services/shopify/queries.ts, app/services/scanner/shopify-fetcher.ts - Why publish this rather than fix it quietly?
- Because the fix is a permission Shopify grants on its own timetable, and merchants are making migration decisions now. Someone comparing apps this week is better served by knowing the question to ask than by a launch post that waits until the answer is flattering.
The gap is specific and worth stating in numbers: the scanner asks Shopify for 90 days of paid orders and is permitted at most 60. Everything that last sold inside that 30-day band is invisible to it, and looks identical to a product that has never sold at all.
If you still want the tool
Inventory Surplus finds the SKUs that have stopped selling, totals the cash they are holding, and prices each one to clear. With the window above in force, the sensible way to use it is as a shortlist to check rather than a verdict to act on — and to let it run a few weeks before trusting the long tail. Free for up to 100 SKUs. If you would rather do the arithmetic yourself first, the calculator needs no install and no account.
Questions
- Why does my new inventory app say products are dead when I know they sold?
- Most likely because it cannot see the sale. Shopify's standard read_orders permission covers only orders created in the last 60 days. A SKU that last sold 90 days ago returns no orders at all, and an app that treats "no orders found" as "never sold" will file it under dead stock. The data is not missing from your store — it is outside what the app was handed.
- Is this a bug in the app?
- Usually not, and that is the frustrating part. The window is a platform permission boundary, not an implementation mistake. What is a genuine defect is an app that presents the resulting gap as a confident conclusion instead of as missing data — there is a real difference between "has not sold in 90 days" and "I can see 60 days and found nothing."
- How do I check whether my app is affected?
- Pick a product you know sold roughly three months ago and look up its last-sale date in the app. If it reads as never sold, or as exactly 60 days, the window is in play. Do the same for a product that recently sold out: if it looks slow, the app is dividing by days elapsed rather than days in stock, which is a separate trap on this page.
- Does read_all_orders cost anything?
- No, but it is not something you can switch on. Shopify grants it to the app developer after a review of their use case, so it is requested in the Partner Dashboard rather than approved by you at install. That is why the honest question to a vendor is whether they already hold it, not whether they will ask.
- Is Inventory Surplus subject to this?
- Yes, today. It requests read_orders and not read_all_orders, so it sees at most 60 days like everyone else in that position. The request is with Shopify. We would rather you read that here than discover it from a scan result.
Sources
- Shopify — API access scopes, for the 60-day window and the
read_all_ordersrequest process. - Shopify — Transitioning from Stocky, for purchase orders having no import path.
- The velocity and grace-period points are our own reasoning, not a Shopify statement, and are labelled as such above.