Feeding The Ad Platform
A Shopping campaign bids the same on a product with three days of stock as on one with three months. Stockmind now publishes what it knows, for a feed tool to merge into a product feed by SKU.
Three columns: SKU, velocity per day, trend. Nothing else. Days of cover is stock divided by velocity — and the shop has a live stock figure where this system has one from the last calculation, so the feed sends the rate and the consumer supplies the level. The label is then right the moment stock moves rather than right once a night.
Band thresholds travel in the document header, so both sides draw the same lines without the data being sent twice.
- Its own credential — not the admin token. It cannot trigger calculations, read settings or list users.
- Sent as a header, because a URL carrying a password ends up in server logs, proxy logs and browser history.
- Two tokens valid at once, so rotating one causes no outage — rotation that causes an outage is rotation that never happens.
- Optional address restriction, which turns a leaked token into a useless one.
- Every fetch recorded, so an unexpected one is visible.
Streamed row by row: 226,000 products is about 13 MB, and building that in memory would take hundreds. Measured at 4 MB.
Which Ranges Carry The Business
Every device view normalised — per SKU, against the catalogue median, or as a score. Useful for deciding where to add products, but none of them answered the plainer question.
- Best selling — device ranges by units sold, with each range's share and a running total, because third of forty means less than knowing the top ten carry 40%
- By margin — the same ordering weighted by units × (price − cost). An ordering, not an accounting figure: the price is a list price and the cost an average valuation, and the report says so
- In the progress report — the top devices with their position at the start of the period, so a range climbing or slipping is visible over weeks
A product fitting several devices is split between them, so the shares still sum to the catalogue. The setting that controls this — split evenly, count in full, or first device only — had been silently doing nothing on the dead stock report, in two separate places. Both fixed.
Thirteen Minutes To Five
A calculation over 226,000 products took about thirteen minutes, and almost all of it was waiting on the warehouse API. The arithmetic itself takes two seconds.
Stockmind now records the page boundaries of one run and uses them to fetch the next across four workers at once — both the product catalogue and ninety days of orders. 810 seconds became 314 — and the order fetch, added after this was first written, took it the rest of the way.
- Catalogue — 486s to 173s, in 58 rounds instead of 226 sequential pages
- Orders — 415s to 136s, with every order checked against a seen list so none is counted twice
- Larger order pages — measured at 4.89 ms per order against 6.20, before any parallelism
Every figure the parallel run produced is identical to the sequential one: the same 51,740 products with sales, the same distribution across sales bands, the same returns, the same suggestions. A fetch that dropped anything would have moved at least one of them.
Two earlier attempts were built and discarded first. One made 2,004 requests where sequential paging makes 226; another ran out of memory holding four decoded order pages at once. Both were found by simulation and measurement rather than in production — and the completeness of each fetch is now reported in the log whether it passes or not, because "no error" and "checked and correct" should not look the same.
Why Did That Number Change?
Two calculations minutes apart can suggest different quantities. That is usually correct — but a report that cannot say why is indistinguishable from one that is wrong.
- Each run records which availability measurement it used, shown beside it in the history. A fresh measurement moves days-in-stock per product, so two runs can legitimately differ; now the reason sits next to the difference.
- Progress charts place points by date, not one per run. Nine calculations in an afternoon and one a week earlier are no longer drawn evenly spaced across nine days.
- Trends are fitted against elapsed time, so a busy afternoon does not outweigh a quiet week.
- Axis labels carry enough precision to differ — a chart reading 23%, 23%, 23%, 23% up the side told you nothing.
The window also moves: a calculation run today looks back ninety days from today. A product that sold once on the day that just dropped out now reads as zero. Expected, and now visible.
Is The Range Working?
The progress report tracked availability and stock health, but nothing about how sales are spread across the catalogue — which is the measure that answers whether holding a long tail is paying off.
Five measures added. Share of catalogue selling and products selling (90d) show breadth: if keeping the tail available is working, more of it should transact. Units from the top 10% of sellers shows concentration — falling means volume is spreading across more products rather than collecting on a few.
Each measure now carries a sentence saying how to read a movement in it, in the report and on the slides. A label can say what is counted; it cannot say what a change means.
Two of the measures back-fill across your existing history. The rest begin recording from the next calculation.
Returns, Deducted
A product with a high return rate looked like it sold better than it did. Velocity was measured on units shipped, so everything that came back still counted as demand.
Demand is now measured net of returns. A returned unit goes back on the shelf, so counting it as a sale did two things wrong at once — overstated how fast the product moves, and double-counted a unit already in the stock figure. Both errors pushed the same way: toward ordering more of something that was coming back.
- Return rate per product, alongside every reorder suggestion
- Named in the weekly briefing, so a fixable cause gets found rather than absorbed
- No extra integration — returns are recorded against the order the unit left on
This closes the last limitation the methodology page listed as unmeasured. Deducting returns is a setting rather than a silent change, because it moves every velocity in the system.
The System Checks Itself
Stockmind can now verify its own arithmetic. A self-test page runs 109 checks against a known catalogue: every figure the interface reads is confirmed present and of the right kind, and a set of results are compared against values worked out by hand.
Velocity is units divided by days in stock; a reorder point is demand multiplied by the time it takes to resupply. If either stops being true, the page says which one and what it found instead. It takes a few seconds and touches nothing.
Two Windows, One Answer
A device could be reported as a finished generation while a product on it had sold four months earlier. The cause was two different windows: "dead" was judged over a year, but "nothing sells any more" was judged over ninety days.
Both now use the same year. A device with sales this year but none last quarter is fading — a different situation, and now a different word. Both counts are shown side by side, so a verdict can be checked rather than believed.
- Dead stock keeps suppliers you've stopped buying from — you still hold the stock, and that's the report you need for it. Everything forward-looking still leaves them out.
- Explain a product — enter any SKU and see every figure behind its classification, from both caches, with the dates each was built
- Supplier names — give warehouse codes readable names, used across every report and export
The thin-data guard is now measurable rather than asserted: the catalogue can be recomputed at several settings to show how many decisions actually change. On one catalogue, three.
Proof That It's Working
Stockmind told you what to do today. It couldn't show you whether any of it had helped — which is the question anyone else in the business will ask.
The new Progress report tracks ten measures over time: best sellers in stock, products selling while empty, demand being missed, dead stock, surplus units, and more. Charts, starting values, current values, and the change.
Every measure carries the direction that counts as an improvement, and the verdict follows that rather than the direction of travel. The report is able to tell you something got worse — which is what makes the rest of it worth believing.
- Save as PDF — a clean A4 document, no export step
- Present — the same report as full-screen slides for a meeting, printable one slide per page as a handout
- Figures come from the calculation that ran on each date — nothing back-filled, nothing restated
Leaving Suppliers Out
A supplier you've stopped buying from still distorted everything — their dead stock inflated the totals, their products filled the reports, and nothing separated "we stopped buying this" from "this stopped selling".
Suppliers can now be excluded entirely. Their products disappear from every report, total, export and briefing figure at once, so the numbers describe the business you're actually running rather than stock you're only storing.
The chooser shows what each supplier holds — SKUs, how many still sell, units on the shelf — so the decision is made against its real size. Nothing is deleted; include it again at any time.
A Briefing Worth Reading
The written summary was two sentences of totals you could already see on screen. It now runs to several hundred words and names things:
- Restock now — the specific products to order first, with quantities and what each is costing per month
- Worth expanding — named device ranges earning above average, and what to add to them
- Stop buying — ranges to cut back before their stock turns dead
- Already gone — finished device generations, grouped by supplier, since that is one return conversation rather than fifty
The summary now also survives a page reload, and tells you when it was written from figures that have since changed.
The figure checking was tightened in both directions: it no longer mistakes product codes or falling percentages for invented numbers, and where something genuinely doesn't match the data, it now shows you the sentence it appears in.
Accounts For Your Team
Stockmind was protected by a single shared password. That works for one person and fails for a team: no record of who did what, no way to remove one person's access, and anyone with the page had full control.
- Individual accounts with proper password storage and sessions that expire
- Two roles — administrators change settings and start runs; read-only accounts see every report but cannot alter anything
- Repeated failed sign-ins lock an account for an escalating delay, and changing a password ends that person's other sessions immediately
Read-only access is the useful part in practice: a buyer, a colleague or a supplier contact can see the numbers without being able to change a setting or trigger a run.
Devices, Properly Grouped
Stockmind previously worked out which device an accessory fitted by reading the SKU. That split a single phone across several unrelated fragments, because a case and a screen protector for the same handset don't share a code.
It now reads the product class from your warehouse system — the field your own catalogue already uses to record compatibility.
One phone's cases, protectors and chargers now appear as a single named device rather than three unrelated groups — and the name comes from your data, so no guessing is involved.
- Products fitting several devices are handled properly, with a choice of splitting their sales between those devices or counting them in full against each
- Grouping labels such as "Universal" or a screen size are recognised as groupings rather than devices
- Thresholds for what counts as worth expanding or over-extended are now drawn from your own catalogue's distribution, so they stay meaningful as it changes
- Both schemes remain available, switchable at any time
Dead Devices
A year of no sales, rolled up to the device each product fits — with a filter for how long since anything was received. One, two, three or five years.
Scattered dead SKUs are a pruning job. A device where nothing sells any more is a generation to exit. In a SKU list those look identical; at device level the decision makes itself.
- The receipt date used is the most recent across the whole device, so "nothing received in three years" is true of the generation rather than one forgotten line
- Dead SKUs against the device total, how many still sell, units held, age and the suppliers involved — enough to open a return conversation from the row
- CSV and Excel export honouring every filter
A Buy List And A Stop List
Productivity and momentum answer different questions: how hard a range works, and where it's heading. A range that's productive and accelerating is a better bet than either alone — so both now combine into a single score, and the inverse gives you what to wind down.
- Buy list — the device ranges most worth adding products to
- Stop list — unproductive, fading, over-extended ranges to cut back before the stock turns dead
- Every score breaks down into its components on hover, so it's auditable rather than a black box
- An AI action reads the device name out of the product names, so the list reads "Garmin Fenix 8 47mm" rather than an internal code
- Export the whole view to CSV or Excel, filters and all
You can also choose whether per-SKU figures count every SKU on a device or only the ones you still stock — the first measures catalogue efficiency, the second measures whether what you actually buy earns its place.
Category Filtering & The Variant Index
Product categories behave nothing alike. A charger or a screen protector doesn't need six colourways; a case or a strap does. Judging them against one shared benchmark was comparing incomparable things.
- Filter by category on Devices and Variants — cases, watch, screen protectors, accessories — with the benchmark recalculating for whichever you pick
- Variant mix now shows share of sales and share of range together, with an index dividing one by the other
That index is the actionable figure. A colour at 19% of the range but 33% of sales is under-produced. One at 5.8% of the range for 0.7% of sales is occupying shelf space it doesn't earn. Share of sales alone couldn't tell "sells well" from "sells well because there's a lot of it".
The Briefing — And An AI That Can't Invent Numbers
Nine reports answered what is happening. Nothing answered what matters this week. The Briefing does, and it's now the first thing you see.
- Every signal in one place: products selling with nothing on order, whole ranges empty with no substitute, device generations rising and fading, over-extended ranges, capital in slow stock, best-seller fill rate moving, measurement going stale
- Ranked by severity, so the costliest thing is at the top
- Ends in an Order these first list — the specific SKUs, quantities and monthly cost
On top of that sits an optional written summary: the week read back as prose, covering what to restock, which ranges to widen with new products, and what to stop buying.
The model is given only figures Stockmind™ has already calculated, and told not to compute anything. Every number it writes is then checked against the source data — anything that doesn't match is flagged rather than shown as fact.
The replenishment engine remains entirely deterministic. No AI touches a reorder quantity, and the summary is optional: switch it off and nothing else changes.
Which Ranges Deserve More Products
Ten SKUs selling 50 units and five hundred SKUs selling 50 units look identical in a sales total, and call for opposite decisions. Device ranges are now measured on demand per SKU carried, against your own catalogue median.
- Breadth — the share of a range that actually sells — separates a healthy range from one where a single winner carries nine failures
- A plain verdict on each: worth expanding, over-extended, or one winner
- Uses availability-adjusted demand, so a range that is merely out of stock isn't mistaken for one nobody wants
Built To Keep Working At Scale
An audit at full catalogue scale found the system straining against its limits as features accumulated. A round of engineering work fixed it and added the instrumentation to catch the next one early.
45×
less memory per request
- Streaming storage — reports read only what they need instead of loading the whole catalogue, so response times stay flat as a catalogue grows
- Nothing fails silently — every error is recorded with its cause, and a crashed job releases its locks instead of blocking the next run
- Credentials moved out of the published folder, with a warning if they're ever placed somewhere exposed
Overstock & The Action Loop
Overstock fills the gap between best sellers and dead stock: products that do sell, but nowhere near fast enough for the quantity held. Ranked by units in excess of a target cover period.
Did we act — and did it work? Every calculation records what it flagged. A later run reports how many were actually restocked, and of those, how many then sold.
- The honest test of whether a suggestion was worth following
- Lists what was flagged and still hasn't been ordered, with the monthly cost of each
Device Intelligence & Measured Lead Times
Devices groups accessories by the product they fit. A whole generation ramping up or fading out is invisible one SKU at a time — at device level it's a buying decision.
One strap trending up is noise. An entire range up 100% while its predecessor falls 70% tells you where to move the budget.
Measured lead times compare when a purchase order was recorded against when the stock actually arrived — so supplier lead times are measured rather than guessed, including how much they vary and how far they slip against what was promised. One click fills them in.
How The Catalogue Actually Sells
Reporting had focused on the extremes. The Overview now shows the whole distribution — how many products sell 1, 2, 3, 4–5 units and upward, each with its share of total sales and how much of it is in stock.
Products with no sales are split separately by how long since stock was last received, so something that arrived last month isn't judged alongside something last seen five years ago.
Variant Mix & Best-Seller Tracking
Two questions that previously had no answer.
- How should a new range be split across colours? The variant mix shows the share of sales each colour takes across your catalogue, drawn from the warehouse's own colour field, with equivalent spellings across languages collapsed together. The historical split replaces the guess.
- Are we getting better at keeping the good stuff in stock? Each calculation records how the top 200 sellers are doing, charted over time — fill rate, how many sit empty, and units per month being missed from that cohort alone.
Variant Intelligence
Products stop being treated as unrelated SKUs. A strap in six colours is now understood as one range — which unlocks decisions that per-SKU numbers simply can't express.
A colour sitting empty while its siblings have stock is a soft loss — demand shifts. A range where every variant is empty has no substitute at all. Same arithmetic per SKU, very different urgency.
- Gaps in the range — proven ranges with an empty variant, ranked by units missed per month, with the sales mix shown variant by variant
- Dead lines — whole ranges holding stock with no sales. One dead colour is a variant to drop; six is a line to exit
- Sibling-aware stockouts — the stockout report now says whether anything is left to absorb the demand
- Ranges are validated against product naming, so structural exceptions aren't grouped by mistake
Near-Instant Re-Measuring
A past date's stock balances never change, so each snapshot is now extracted once and kept. Sample dates align to a fixed calendar so runs share their work.
Dead Stock, Rebuilt
Was a flat list with a single count. Now shows how much is merely slow versus genuinely abandoned, and where it's concentrated.
- Age breakdown by time since last received, from under a year to five years and beyond
- Biggest holders ranked by supplier — the starting point for a return conversation
- Search, sorting, an age column, and Excel export alongside CSV
Named Incoming Orders
Purchase orders can be given a name — "Garmin restock — Sept" — shown as the headline in the batch list, with the source file beneath it. Existing orders can be renamed at any time.
Paste Purchase Orders Straight In
Supplier lists rarely arrive in a tidy format. Incoming stock can now be entered by pasting directly from a spreadsheet or email — no reformatting first.
- Paste two columns — SKUs on the left, quantities on the right, matched line by line, with a warning if the two don't align
- Or one line per product — tabs, commas, semicolons, pipes and spaces all understood, header rows and description columns ignored
- Live preview shows exactly what was read, and which lines were skipped, before anything is added
Live Progress While Measuring
Availability sampling used to run silently — the only way to track it was waiting and refreshing. It now reports as it works: which snapshot it's on, elapsed time, and an estimate of time remaining.
- Progress resumes if you reload or come back later
- Warns if a run appears to have stalled, instead of spinning indefinitely
Warehouse Overview
A new dashboard view covering the state of the whole operation — units in the warehouse, how much of the catalogue is actually in stock, what's selling, what's on order, and what's suggested.
Including a 90-day warehouse trend chart, built from stock snapshots already gathered during availability measurement — so a full trend is available immediately rather than after months of collecting data.
- Stock breadth and depth tracked separately — SKUs in stock, and total units
- Each calculation adds a row to a running history, so movement becomes visible over time
Per-Supplier Lead Times
Lead time was a single global figure, so an overseas supplier and a local one were held to the same schedule — under-ordering from the slow one and over-ordering from the fast one.
Each supplier can now carry its own lead time, with the global value as the default for anything not overridden.
Two identical products — same velocity, same stock on hand — now behave according to who supplies them. At a 45-day lead one is flagged and ordered heavily; at a 5-day lead the other isn't flagged at all.
- Applies to the reorder trigger, the order quantity, and the window in which incoming stock counts as cover
- Set from a panel listing the suppliers in your catalogue; applies immediately
Choose Your Measurement Precision
Availability sampling frequency is now yours to set — trade analysis time against how precisely stockouts are pinpointed.
±1.8d
twice weekly · 9 min
- Resolution shown live as you choose, so the trade-off is explicit
- Denser sampling also sharpens demand-variability measurement
Stockouts No Longer Look Like Volatility
Demand variability was measured from raw quantities per period. A product that sold nothing in one period because it was out of stock read as erratic — and could be assigned up to two and a half times the safety buffer it actually needed.
Variability is now measured from sales rates — units per available day — and periods with no availability are excluded rather than counted as a collapse in demand.
A product selling 10 / 0 / 10 units, where the empty period was a stockout, is now correctly read as perfectly steady and takes the minimum buffer. Genuinely erratic demand is unchanged.
Variability-Scaled Safety Stock
Safety stock was a flat number of days applied to every product, which over-buffers the predictable and under-protects the volatile. It can now scale to each SKU's own demand pattern.
- Steady sellers carry roughly half the base buffer
- Erratic sellers up to two and a half times it
- Products with too little history to judge keep the flat buffer
Because it redistributes protection rather than simply adding it, total units ordered often barely move while cover lands where it's genuinely needed. Optional, and off by default.
Trend Weighting
Velocity was a flat 90-day average, which treated a product rising from 5 to 15 units a month exactly like one falling from 15 to 5. For catalogues tied to product generations, that was the largest remaining source of error.
Stockmind now compares the recent 30-day rate against the full window and blends the two — with the recent window availability-adjusted in its own right, not a raw count.
Confidence scales with recent volume. A product selling 18 units in the last month moves the number substantially; one selling a single unit barely moves it at all — so a lucky week can't inflate an order.
- Adjustable from 0–100%, applying live like the other settings
- Ships switched off, so existing numbers are unchanged until you enable it
- Best Sellers gained a Trend column; exports gained 30-day quantity and trend percentage
Order Size In Units
The Reorder cards counted SKUs, which told you how many products needed attention but nothing about the size of the resulting purchase order.
- Every card now shows total units alongside the SKU count
- Applies to the filtered view too — select a supplier and see exactly what that PO comes to
Per-List Arrival Dates
Expected arrival is now set for the whole uploaded list rather than per row, so your CSV stays a simple two-column file.
- Date picker with one-click shortcuts at upload time
- Change a batch's arrival date afterwards when a supplier pushes a shipment back
Measured Availability
Velocity is no longer inferred — it's measured. Stockmind now samples your warehouse's historical stock balances across the whole velocity window and counts exactly how many days each product was genuinely on the shelf.
This closes the last blind spot in the calculation. Estimation can only see products that are out of stock right now. A product that sold out on day 10, was restocked on day 50 and sits in stock today looked fully available for the entire period — and those are, by definition, your fastest movers.
Measured across a real 226,000-SKU catalogue:
- Runs on demand from the Ongoing tab, roughly five minutes
- Sample count is configurable for finer resolution
- Falls back to the previous method for any SKU without measurement data
Sales Quantity Exports
Best Sellers now shows units sold alongside velocity, and the Dashboard exports the full selling catalogue — not just what's on screen — in CSV or Excel.
- Columns: quantity sold, days available, velocity, estimated monthly units, on-hand, incoming, days left, last received
- Sorted by units sold, respecting the supplier filter
Incoming Stock Arrival Dates
Purchase orders can now carry an arrival date, and only stock landing inside your coverage window counts as cover. A shipment arriving in sixty days no longer masks a stockout happening in twelve.
- CSV takes an optional third column: a date or a number of days
- Later arrivals stay visible, shown as "+N later"
- The horizon follows your lead time and safety stock settings automatically
Review Period
Order quantities now account for how often you actually place orders. An order has to last until the next one arrives, not merely until this one lands — so if you order monthly, quantities scale to match.
- Order-up-to level = velocity × (lead time + review period + safety stock)
- Reorder triggers are unchanged, so flagged counts stay stable
Adjustable Lead Time & Safety Stock
Lead time and safety stock moved out of configuration files and into the app, with changes applying instantly — no recalculation needed.
- Reorder points, flags and quantities recompute on the fly
- The Reorder tab states the active basis, so the numbers explain themselves
Incoming Stock Visibility
A sold-out product could show a healthy days-left figure with nothing on screen to explain why. Incoming stock had always been counted — the column that made sense of it was missing.
- Incoming column added to Best Sellers; Incoming stat card added to the Reorder tab
- Zero on-hand highlighted, with an "inbound" tag when cover comes entirely from open POs
Deletable Dead Stock
Dead stock now separates zero-stock listings — which can be deleted straight from your WMS and shops — from items physically sitting in the warehouse that need handling.
- "Out of stock only" filter, combining with supplier and age filters
- Exports respect every active filter, so you get a clean deletion list per supplier
Twice As Fast
Full-catalogue calculation runtime roughly halved, with substantially lower memory use.
Fault-Tolerant Data Fetching
A single slow API response could previously end a data fetch early and quietly cache an incomplete catalogue — missing thousands of the newest products with no visible error.
- Failed requests retry automatically with backoff
- If they still fail, the run aborts rather than caching partial data — your last complete dataset stays intact and the app keeps serving correct numbers
Availability-Adjusted Velocity
The original insight the product is built on: you can't sell what isn't on the shelf, so velocity must be measured against availability rather than calendar days.
- Live warehouse integration replacing manual exports
- Server-side calculation and paging for catalogues in the hundreds of thousands
- Best sellers dashboard, incoming PO tracking, supplier filtering and exports