Bulk Inventory Projection

A visual walkthrough of the programme · current at 2026-09-30, Run #4 · Top Lids, Shipping

This guide explains. It does not decide.

REPORT - Bulk Inventory Projection.md is the wording authority and Workpapers\ holds the arithmetic. Where this guide and the Report disagree, the Report is right and this guide has a bug. The plain Markdown twin of this page is Guide - Bulk Inventory Projection.md.

Every figure here regenerates: python "Workpapers\stock_threshold.py" for the quantities, node "Workpapers\seasonality.mjs" for the Seasonal Baseline, and python "Workpapers\order_export_forensics.py" for the claims about the Order export.

1The programme in one paragraph

Top Lids makes aquarium screen top lids to order. Every Lid is cut for a specific tank and configured by the Client, which today means every Lid is made from scratch after the Order lands and flown from Shanghai. The programme holds a small number of the most-ordered Lids in stock in a Miami warehouse, shipped by sea in bulk, so that those Orders ship from a shelf instead of a factory.

Two things make that possible on a product with several hundred configurations per tank: a Stock Threshold that picks which tanks are worth stocking at all, and Postponement, which stocks one physical Lid with its Cutouts still open and resolves the Client's actual choice at Kitting time from Add-On Product stock.

2Which Orders the stock offer can serve

Stage 1 — which tanks get stocked 484 Tank Identifiers with a Lid Order 30 stocked 454 Custom only, never stocked The Stock Threshold: 24 or more Orders in the trailing 365 days, counted as distinct Orders. Stage 2 — which of those Orders the shelf actually serves 809 Orders served from the shelf — Capture Rate 0.70 346 still custom 1,155 Orders landed on those 30 Tank Identifiers in the trailing 365 days The Capture Rate is the share of a Tank Identifier's Orders expected to accept the Standard Stock Configuration. Run #4 measured its ceiling at 0.720, so the 0.70 assumption sits just under a real number rather than beside nothing.
The offer is deliberately narrow. Of 484 Tank Identifiers, 30 clear the Stock Threshold. Everything else stays custom, which is not a failure of the plan — it is the plan. A Tank Identifier ordered 3 times a year cannot justify inventory.

The Stock Threshold replaced 4 ranked Stock Tier bands in Run #4, because a rank band is relative and a threshold is absolute — an item can fall out of a band because something else grew, without its own demand changing at all. The separate retirement rule, a Captured Velocity below 0.15 per week, was retired with the bands: it was a second, differently scaled test of the same question, and two tests of one question disagree sooner or later.

3Postponement, and its one absolute dependency

400-odd configurations become 1 Stock Lid plus a pool of Add-On Products 1 Stock Lid Standard Stock Configuration Cutouts leave the Warehouse OPEN stocked per Tank Identifier 161 Add-On Types 1,499 units at launch Light Mount / Auto Feeder Feed Door / Cup / Blanks pooled across every Tank Identifier Kitting at Fulfillment time Kitted Package ships The dependency is absolute, not a risk to manage If the Insert is out of stock the Stock Lid cannot ship — no matter how much of the Stock Lid is on the shelf. 95% service on Lids × 70% service on Inserts = 66% service on Orders. A Client whose Order is held for a 4 dollar Insert has not had a better experience than one who waited for a custom Lid. Which is why the Add-On Products are a co-requisite of this plan and not an extension to it.
Postponement relocates variety rather than removing it. Run #4 measured the case instead of arguing it: across the 30 stocked Tank Identifiers there were 1,119 configured Lids, and the most common exact configuration for each captures a weighted 9.1%. The worst case had 75 distinct configurations across 90 Lids. Stocking finished configured Lids would strand over nine tenths of demand.

4The Lead Time is 9 weeks, it is serial, and it varies

5 serial stages, drawn to scale — nothing overlaps Manufacturing 1.43 wk Shanghai 1.00 wk Ocean transit, Shanghai to Miami 5.29 wk (37 days) Miami 0.86 Warehouse receiving 0.29 variability, weeks 0.43 0.60 1.20 0.80 0.15 Total: 8.86 weeks, rounded to 9 Manufacturing sits INSIDE the Lead Time, not beside it: nothing sails until the Freight Pallet is finished. Variability: 1.63, rounded to 1.6 Combined in QUADRATURE, not added. Adding gives 3.18 and assumes every stage runs late on the same shipment.
The original 7 week figure assumed manufacturing overlapped the pre-booking window. It does not. Review Weeks contributes zero variability by construction, because the Review Date is a fixed calendar day — which is the real reason the Cadence is calendar fixed rather than triggered.

5The two formulas, and why the second term matters

Order-Up-To Level = Captured Velocity x (Lead Time Weeks + Review Weeks)
                  + Service Factor x sqrt( Captured Velocity x (Lead Time Weeks + Review Weeks)
                                         + Captured Velocity² x Lead Time Variability Weeks² )

Reorder Point     = the same, at Lead Time Weeks alone

Inventory Position = ( On Hand - Allocated ) + On Order

Order Quantity     = MAX( 0, Order-Up-To Level - Inventory Position )

Nothing was replaced when Lead Time Variability was added: the old formula is the exact special case at variability 0.

The second term under the square root is proportional to velocity SQUARED. So Lead Time risk is negligible on a slow mover and dominant on a fast one — 5% of total risk at 0.21 units a week, 83% at 20.42. That is why the correction was worth +9 Lids across the Stock Lids but +339 units, 24%, across the Add-On Products: the Add-Ons are the fast movers.

Allocated is SUBTRACTED. Counting Allocated units as available under-orders by the size of the open Order book, every cycle, permanently. A single “On Hand” column let the Organization be vague about this; a real Inventory Management System forces the choice.

6Seasonality, measured in Run #4

The programme ran on a flat 1.000 index until 2026-09-30. It is now measured from the all-time Order export — 20,286 rows, 2021 to 2026.

The 12 Seasonal Baseline figures — they average exactly 1.000 1.000 0 a year redistributed, never inflated Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 1.153 1.161 1.234 1.011 0.864 0.809 0.859 0.861 0.806 0.800 1.348 1.094 Shipment #1 covers 2026-12-02 to 2027-02-17 — December, January and February, day weighting to 1.1315. The swing is 1.68x from October at 0.800 to November at 1.348. A flat index on that book is a standing error, not a neutral placeholder.
De-trending is mandatory. A raw month-over-month ratio confuses seasonality with growth, and a business growing 40% a year shows every later month as “high season”. Each month is divided by a centered 12 month moving average of its own series first, which is why 24 months of input yields only 12 months of index. The index is Organization level, never per Stock Lid — the top Stock Lid sells about 6 units a month, and an index built on 6 units is noise with a decimal point on it.

The forward window is the whole point

Deseasonalised Velocity = 0.6 x ( trailing 6 week units  / 6  / Seasonal Baseline of those 6 weeks )
                        + 0.4 x ( trailing 12 week units / 12 / Seasonal Baseline of those 12 weeks )

Captured Velocity = Deseasonalised Velocity
                  x Seasonal Baseline of the coming Lead Time plus Review window
                  x Capture Rate

De-seasonalise the history, blend, then re-seasonalise forward onto the window the Order covers. The index multiplies a velocity and is never added to one. An Order placed on a Review Date is bought for the weeks 9 to 11 ahead, so the months that matter are the ones the Freight Pallet lands in and sells through.

Buying December's stock on October's index is how a seasonal business runs out in its best month.

What re-seasonalising Shipment #1 onto its arrival window changed
FigureSeasonally flatRe-seasonalised
Captured Velocity15.57 / wk17.62 / wk
Reorder Point273297
Order-Up-To Level310 Lids339 Lids
Add-On Product loose units1,2801,499
Total Freight Pallets78

Had arrival landed in June or October the index would have released capital instead. Either way it is a real number and it changes the Order that is about to be placed.

7The replenishment loop

Every 2 weeks, on a fixed calendar Review Date Review Date fixed calendar day Inventory Position ( On Hand − Allocated ) + On Order Order-Up-To Level the target position Order Quantity MAX( 0, Order-Up-To Level − Inventory Position ) Bulk Reorder Proposal Shipping Manager Releases or Holds On Order arrives 9 weeks later → On Hand arriving stock re-enters the position The 85% rule Fills 85% or more of a Freight Pallet → the Shipping Manager MUST Release. Below that, Hold a week or pull the next Tank Identifier in, so the Freight Pallet ships full.
The Reorder Point is checked hourly, not on the Review Date, because a Stockout does not wait for a calendar. Shipping air in a sea container's place is the one avoidable cost in the chain, which is what the 85% rule exists to prevent.

8The Inventory Feed, and the four gates in front of it

The Warehouse owns exactly two numbers: On Hand and Allocated. On Order can never come from the Warehouse — the Warehouse has no idea what is on the water.

Feed Health asks four questions before any Proposal is built Warehouse On Hand, Allocated Inventory Feed 1. Fresh updated inside its window? a feed that died quietly 2. Complete all 211 mapped items present? an item silently dropped 3. Moving has anything changed? a feed serving stale numbers 4. Mapped every item code resolves? an unmapped new item all four PASS Bulk Reorder Proposal is built any ONE gate FAULTS NO Proposal at all not one carrying a warning A Proposal that exists is a Proposal somebody will Release. So a faulted feed produces nothing, rather than something with a caveat. An item ABSENT from the feed is not an item at 0 On Hand. Absent is unknown; 0 is empty. Confusing them orders stock already on the shelf.
A sheet fails loudly and a feed fails silently. A manual sheet nobody filled in is obviously blank; a feed that stopped updating looks exactly like a business where nothing sold. “Moving” needs a second signal — nothing changed for 48 hours and units shipped in that period — otherwise it cries wolf every quiet weekend and gets ignored, which is worse than not having it.

The Cycle Count is kept, and its job has changed: it is now the only independent check on the feed. Replacing manual entry with the Inventory Feed removes the error signal along with the typing, and the Cycle Count is what puts one back.

9The Weekly Scorecard

Weekly Scorecard — 5 Metrics, owned by the Shipping Manager Metric 1 Stocked-Order Share is the Capture Rate real? Metric 2 Sell-Through at the planned velocity? Metric 3 Stockout Rate out of all 211 items Metric 4 Dead Stock what has not moved? Metric 5 Contribution the one that could retire the programme Contribution asks whether a stocked Lid contributes MORE than the same Lid sold custom. The stocked lane saves roughly 45 to 50 dollars per Lid of air freight, and pays for warehousing, storage and tied-up capital instead. That trade must be measured, never assumed. Metric 3 counts Add-On Types too, because an Insert Stockout blocks a Lid.
Five Metrics, and one of them can end the programme. Stockout Rate is measured out of 211 items rather than 30, because the Add-On Products are counted: an Insert Stockout blocks a Lid just as completely as a missing Lid does.

10Shipment #1

The launch Order, re-seasonalised onto its arrival window
FigureValue
Tank Identifiers stocked30 of 484
Order-Up-To Level339 Lids
Reorder Point297
Add-On Product units1,499 in 43 Stock Packages
Freight Pallets8
Arrivesweek 9 — 2026-12-02
Marketing push notice needed11 weeks

At launch On Hand is 0 and On Order is 0, so the formula asks for the full Order-Up-To Level. Shipment #1 is therefore an initiation, not a cover estimate. The old “top 25 at 8 week cover” plan is retired: at a 9 week Lead Time an 8 week cover is gone before the first Freight Pallet lands. The Air Seed Batch must carry Inserts, or it buys 5 weeks of unfulfillable stock.

The buy-up rule needs no cost data. Component discounts are per component, and buying up to tier T is worth it when T x (1 - new discount) < order quantity x (1 - old discount). The unit cost cancels. For Shipment #1: Screened Inserts at 1,692 units clear the 1,000 tier and fall short of 1,864, so do not buy up; Lid Frames at 269 clear 200 and fall short of 474, so do not buy up either.

11What is still open

Every default is safe, and no response to a flag means agreement
FlagThe questionDefault if you say nothing
F218 Freight Pallets against a 2 to 4 capital envelopeOrder the full Order-Up-To Level anyway — anything less is a planned Stockout
F24Is the current Feed Door part of the Standard Stock Configuration?Keep it, 1 per Stock Lid. The Flag worth answering first — worth 284 units, and a design decision rather than a data gap
F36The Evaporation Cover attaches to 48.0% of configured Lids and is in no stocking planDo not stock it in Shipment #1 — it would add 198 panels and take 8 Freight Pallets to 12
F22Lead Time Variability of 1.6 is constructed from 5 judgementsKeep 1.6; replace with measured Purchase Order dates after 4 Shipments
F26, F276 Add-On Attach Rates and the Light Type mix are assumedKeep. Run #4 established these cannot be measured from the Order record at all — they must be instrumented where the Client chooses

12The lesson from Run #4

Run #3 left the seasonality computation “finished and tested against synthetic input”, needing “only its input file”. Both claims were true, and the result would still have been wrong.

A configured Lid in the Order export is two rows, not one — a parent Lineitem and an upcharge Lineitem carrying the Options — and the second was rolled out in 2025-09. Counting every row doubles recent demand and leaves 2023 alone, putting a step change in the middle of the series that the de-trending cannot see through. Separately, the Organization is called “Top Lids”, so matching the word “Lid” catches its own service lines, and unevenly: 20.6% of 2021's Lid units against 0.0% of 2026's. The corrected series is 8,224 Lid units where a naive count returns 23,627. Roughly two thirds of the rows in that file are not Lids.

A synthetic test validates the arithmetic and says nothing about what the rows mean. A tested computation and a trustworthy number are different things, and the gap between them is entirely in the input. Budget for reading the file, not for running the script.