Inventory planning · NetSuite TD3016323
Demand-based reorder points and safety stock for every item that sold in the last year, and the finding that the account's inventory problem is excess, not shortage.
The account carries $1,079,446 of inventory across 137 items that sold in the last twelve months. Only 4 of those items have a reorder point set in NetSuite, so replenishment is running on judgment. The reorder points recommended below are computed from twelve months of fulfillment and cash sale demand at a 95% service level, and they lead to one conclusion: the problem in this account is not stockouts. It is excess.
4 items are below their recommended reorder point, all four of them at zero on hand with demand of less than one unit a week. 108 items, 79% of the range, have more than 180 days of supply on hand, and they hold $906,559, or 84% of inventory value. The slow block is leather goods and apparel: a single item, the black leather jacket, has 552 units on hand against demand of about one unit every three days, which is four years of supply and $110,400 of cash. The fast movers, mostly beauty consumables selling one to one and a half units a day, are stocked at 90 to 230 days of cover, two to five times what the recommended reorder point requires.
Calculated as: reorder point = average daily demand x lead time + safety stock, and safety stock = Z x daily demand standard deviation x square root of lead time, with Z = 1.65 for a 95% service level. Daily demand is twelve months of fulfilled and cash-sale units divided by 365. Demand variability is the standard deviation of monthly demand, converted to a daily figure. Days of supply is on hand divided by daily demand. Items are classed A, B, or C by annual demand value at average cost: 47 A items carry 80% of the value, 37 B items the next 15%, and 53 C items the last 5%.
The twelve highest-demand items. None has a reorder point set today. The recommended reorder point is the level at which a replenishment order should be placed; the current on-hand and days-of-supply columns show how far above that level the stock sits.
| Item | Current ROP | Recommended ROP | Change | Safety stock | Service level | On hand | Days of supply | Priority |
|---|---|---|---|---|---|---|---|---|
| INV_Volumizing Shampoo | none | 32 | n/a | 21 | 95% | 138 | 91 | Low |
| INV_Replenish Conditioner | none | 29 | n/a | 19 | 95% | 236 | 168 | Low |
| INV_The Gentleman | none | 32 | n/a | 22 | 95% | 166 | 124 | Low |
| INV_Scalp Therapy Shampoo | none | 27 | n/a | 18 | 95% | 160 | 125 | Low |
| INV_Rose Petal Shampoo | none | 24 | n/a | 15 | 95% | 163 | 133 | Low |
| INV_Rose Petal Conditioner | none | 20 | n/a | 12 | 95% | 175 | 144 | Low |
| LOT_3-Tone Eye Shadow with Mirror | none | 37 | n/a | 30 | 95% | 134 | 135 | Low |
| INV_Basil Lemon Hand Wash | none | 23 | n/a | 17 | 95% | 179 | 194 | Low |
| LOT_Posh Eyeliner-HP | none | 36 | n/a | 30 | 95% | 150 | 164 | Low |
| LOT_Posh Eyeliner-RO | none | 38 | n/a | 32 | 95% | 150 | 164 | Low |
| LOT_Posh Eyeliner-CP | none | 37 | n/a | 31 | 95% | 144 | 162 | Low |
| LOT_Glamorous Attraction Eye Shado | none | 27 | n/a | 20 | 95% | 140 | 159 | Low |
Priority is high where on hand is below the recommended reorder point, medium where days of supply is under 60, and low otherwise. For the top twelve, every priority is low: there is no near-term stockout risk in the fast movers. The four high-priority items are two assemblies (AS_SAF001 and AS_MBK001, both at zero on hand with open backorders of 37 and 7 units), a drop-ship end table, and a size of trousers showing negative one on hand, which is a data correction rather than a purchase.
If the fast movers were held at their recommended reorder point plus one order cycle, roughly 45 days of cover, the consumables alone would release a modest amount, because they are cheap. The money is in the slow block. The ten items below hold $493,965 against combined daily demand of under three units. They are not reorder-point problems; they are disposition problems, and the decision on how to move them is a pricing decision for a person.
| Item | On hand | Daily demand | Days of supply | Value at cost |
|---|---|---|---|---|
| INV_Black Leather Jacket | 552 | 0.36 | 1538 | $110,400 |
| INV_Black Leather Valise | 584 | 0.44 | 1324 | $75,336 |
| INV_Brown Leather Satchel | 209 | 0.28 | 734 | $62,698 |
| INV_Gold Watch with Leather Strap | 270 | 0.35 | 776 | $59,400 |
| INV_Brown Leather Valise | 283 | 0.35 | 813 | $45,280 |
| INV_Canvas Backpack | 328 | 0.19 | 1710 | $40,016 |
| INV_Indigo Relaxed Fit | 525 | 0.24 | 2203 | $36,750 |
| INV_Olive Utility Pack | 276 | 0.19 | 1419 | $27,600 |
| INV_The Bindel Jacket | 71 | 0.24 | 298 | $19,880 |
| INV_Estes Park Chair | 54 | 0.13 | 402 | $16,605 |
| Metric | Current | Recommended | Change | Impact |
|---|---|---|---|---|
| Inventory value, items with demand | $1,079,446 | $535,511 | -$543,935 | Assumes 60% of excess is moved at cost over two cycles |
| Items over 180 days of supply | 108 | Under 30 | -78 | Disposition program |
| Items with a reorder point set | 4 | 47 (all A items) | +43 | Replenishment on rules instead of judgment |
| Expected stockouts at 95% service | n/a | 5% of order cycles | On the A items once reorder points exist |
| Phase | Window | Action | Owner |
|---|---|---|---|
| 1 | 30 days | Set reorder points and safety stock on the 47 A items from the table above; correct the negative on-hand record; expedite the two backordered assemblies | Inventory planning |
| 2 | 60 days | Price and run the disposition of the leather goods and apparel with more than a year of cover (human decision on markdown) | Merchandising |
| 3 | 90 days | Record expected receipt dates on purchase orders so lead time and its variability can be measured; then recompute safety stock from real lead times | Purchasing |
| ID | Type | Name | Handle | Scope | Used for | Complete |
|---|---|---|---|---|---|---|
| DL-001 | SuiteQL | Demand by item and month | transaction (ItemShip, CashSale) join transactionline, item | 12 months, 1,013 rows | Daily demand, variability | Yes |
| DL-002 | SuiteQL | Item parameters and stock | item join inventoryitemlocations | 271 active inventory and assembly items | On hand, current reorder points, cost | Yes |
| DL-003 | SuiteQL | Lead time | ItemRcpt lines, createdfrom to PurchOrd | 12 months, 4,380 lines | Lead time (found to be zero) | Yes, not usable |
| DL-004 | SuiteQL | Backorders | transactionline.quantitybackordered on sales orders | Open orders | Stockout evidence | Yes |
Adaptations from the prompt's templates: reorderpoint, preferredstocklevel, safetystocklevel, and leadtime are not on the item record in this account; they live on inventoryitemlocations and were taken from there. The template's lead-time join uses receipt.createdfrom on the header; the link is on the receipt line. Demand uses fulfillments and cash sales rather than sales orders and invoices, so that an order is not counted twice. STDDEV is not supported in this account's SuiteQL, so variability was computed in code from monthly totals. Stockout history used open backordered quantity rather than a status filter.
SELECT tl.item, BUILTIN.DF(tl.item), i.itemtype, BUILTIN.DF(tl.class), TO_CHAR(t.trandate,'YYYY-MM'), SUM(ABS(tl.quantity)), COUNT(DISTINCT t.id)
FROM transaction t JOIN transactionline tl ON tl.transaction = t.id JOIN item i ON i.id = tl.item
WHERE t.type IN ('ItemShip','CashSale') AND tl.mainline = 'F' AND tl.taxline = 'F' AND i.itemtype IN ('InvtPart','Assembly') AND tl.quantity < 0
AND t.trandate > ADD_MONTHS(TRUNC(SYSDATE), -12) GROUP BY ...
SELECT i.id, i.itemid, i.displayname, i.itemtype, i.averagecost, i.cost,
SUM(NVL(iil.quantityonhand,0)), SUM(NVL(iil.quantityonorder,0)), SUM(NVL(iil.quantitybackordered,0)),
MAX(iil.reorderpoint), MAX(iil.preferredstocklevel), MAX(iil.safetystocklevel), MAX(iil.leadtime)
FROM item i LEFT JOIN inventoryitemlocations iil ON iil.item = i.id
WHERE i.itemtype IN ('InvtPart','Assembly') AND i.isinactive = 'F' GROUP BY ...
SELECT tl.item, po.entity, po.trandate, r.trandate, ABS(tl.quantity)
FROM transaction r JOIN transactionline tl ON tl.transaction = r.id AND tl.mainline = 'F' JOIN transaction po ON po.id = tl.createdfrom
WHERE r.type = 'ItemRcpt' AND po.type = 'PurchOrd' AND r.trandate > ADD_MONTHS(TRUNC(SYSDATE), -12)| Assumption | Value | Rationale | Impact if wrong |
|---|---|---|---|
| Service level | 95% (Z = 1.65) | Prompt default for standard items | Safety stock scales with Z |
| Lead time | 7 days floor | Receipts are dated on the PO date; true lead time unmeasurable | Reorder points scale with lead time |
| Demand basis | Fulfillments and cash sales, 12 months | Actual outbound units | Seasonality within the year is captured in the variability |
| Daily variability | Monthly standard deviation / square root of 30 | Standard conversion | Safety stock |
| Excess threshold | 180 days of supply | Common practice | Count of excess items |
| Test | Objective | Result |
|---|---|---|
| G1-001 | Demand data complete | Pass 12 monthly buckets present for the window |
| G1-002 | On-hand reconciles to item records | Pass summed from location records |
| G1-003 | Lead time usable | Fail average 0 days; assumption substituted and disclosed |
| G2-001 | Reorder point formula | Pass computed in code; spot-checked on 5 items |
| G2-002 | Safety stock formula | Pass Z x sigma x root of lead time |
Confidence: high on demand and days of supply; medium on the reorder point levels, because lead time is assumed; high on the excess finding, which does not depend on lead time at all. Service level, the working capital trade-off, and every disposition decision are flagged for human review.