Skill Tracer
Skills › Knowledge Work Plugins › inventory-planner › velocity_and_reorder.md

velocity_and_reorder.md

154 lines · small-business/skills/inventory-planner/reference/velocity_and_reorder.md at 2574e29

Open on GitHub
1# Velocity and Reorder Sizing
2
3The math, and the judgment around the math.
4
5---
6

Velocity and Reorder Sizing

The math, and the judgment around the math.


Raw lines 1 to 6
7## The two windows
8
9**7-day velocity** = units sold in the last 7 days ÷ 7
10**28-day velocity** = units sold in the last 28 days ÷ 28
12Both, always, for every item. The point is not to pick one — it is that the gap between them tells you something.
14| Pattern | Reading | Action |
15|---|---|---|
16| 7-day ≈ 28-day | Steady | Plan on the 28-day rate. Easy |
17| 7-day much higher | Trending up, or one bulk order | Check the order detail before believing it |
18| 7-day much lower | Cooling, or a stockout mid-week | Check whether stock was available all week |
19| 7-day zero, 28-day positive | Stopped selling, or stocked out | Check stock history before calling it dead |
21**When the two disagree by more than 50%, look at the underlying orders before recommending anything.** One wholesale order of 40 units makes a slow item look like a bestseller for exactly one week, and ordering into that spike is how a pallet gets bought.
23---

The two windows

7-day velocity = units sold in the last 7 days ÷ 7 28-day velocity = units sold in the last 28 days ÷ 28

Both, always, for every item. The point is not to pick one — it is that the gap between them tells you something.

PatternReadingAction
7-day ≈ 28-daySteadyPlan on the 28-day rate. Easy
7-day much higherTrending up, or one bulk orderCheck the order detail before believing it
7-day much lowerCooling, or a stockout mid-weekCheck whether stock was available all week
7-day zero, 28-day positiveStopped selling, or stocked outCheck stock history before calling it dead

When the two disagree by more than 50%, look at the underlying orders before recommending anything. One wholesale order of 40 units makes a slow item look like a bestseller for exactly one week, and ordering into that spike is how a pallet gets bought.


Raw lines 7 to 24
25## Which velocity to plan on
27Two different numbers, and they must not be mixed up:
29- **`stockout_velocity`** = the **higher** of the 7-day and 28-day rates. Used for days of cover and the stockout date.
30- **`sizing_velocity`** = the **28-day** rate. Used for the reorder quantity.
32That asymmetry is deliberate:
34- Stockout dates should be pessimistic. Being early costs a little carrying cost. Being late costs the sale and sometimes the customer.
35- Reorder quantities should be sober. Sizing 60 days of stock off a one-week spike is how cash gets buried.
37Say which rate went into each number. An owner who can see "running out on the 5.8 rate, ordered on the 4.1 rate" can override either one in seconds. Never use one word — "planning velocity" — for both, because the two numbers are different on exactly the items that matter most.
39---

Which velocity to plan on

Two different numbers, and they must not be mixed up:

  • **stockout_velocity = the higher** of the 7-day and 28-day rates. Used for days of cover and the stockout date.
  • **sizing_velocity = the 28-day** rate. Used for the reorder quantity.

That asymmetry is deliberate:

  • Stockout dates should be pessimistic. Being early costs a little carrying cost. Being late costs the sale and sometimes the customer.
  • Reorder quantities should be sober. Sizing 60 days of stock off a one-week spike is how cash gets buried.

Say which rate went into each number. An owner who can see "running out on the 5.8 rate, ordered on the 4.1 rate" can override either one in seconds. Never use one word — "planning velocity" — for both, because the two numbers are different on exactly the items that matter most.


Raw lines 25 to 40
41## Distortions to strip out
43**Stockout periods.** Days with zero stock are not days of zero demand. Exclude them from the denominator: velocity is units sold ÷ days the item was actually available. Failing to do this permanently under-orders exactly the items that keep running out.
45**Bulk or wholesale orders.** A single order well outside the normal order size distorts the window it lands in. Identify it, report it, and offer both numbers — with and without.
47**Returns.** Net them out of the period they were sold in, not the period they came back in.
49**Promotions.** A period with a discount running is not a baseline. If promotion data is available, mark those periods. If it is not, and the owner mentions a sale, ask.
51**New items.** An item with under 28 days of history has no reliable 28-day velocity. Say "not enough history" by SKU rather than annualizing a week.
53---

Distortions to strip out

Stockout periods. Days with zero stock are not days of zero demand. Exclude them from the denominator: velocity is units sold ÷ days the item was actually available. Failing to do this permanently under-orders exactly the items that keep running out.

Bulk or wholesale orders. A single order well outside the normal order size distorts the window it lands in. Identify it, report it, and offer both numbers — with and without.

Returns. Net them out of the period they were sold in, not the period they came back in.

Promotions. A period with a discount running is not a baseline. If promotion data is available, mark those periods. If it is not, and the owner mentions a sale, ask.

New items. An item with under 28 days of history has no reliable 28-day velocity. Say "not enough history" by SKU rather than annualizing a week.


Raw lines 41 to 54
55## Days of cover and the order decision
57```
58days_of_cover = (stock_on_hand + units_on_order) ÷ stockout_velocity
59```
61Inbound stock counts. An item with 4 days on the shelf and a pallet landing Thursday is not about to stock out, and flagging it as urgent teaches the owner to ignore the urgent list.
63**Zero velocity has no days of cover.** Dividing by zero produces either an error or an absurd number, and either way the item does not belong on this ladder — nothing is selling, so nothing is running out. Skip the cover calculation entirely and send it straight to the slow-mover list with the cash tied up in it. The one exception is a season the owner has named; see below.
65Compare against lead time plus a safety buffer. Default buffer is 7 days, or half the lead time, whichever is larger — long lead times need proportionally more room. **Cap the buffer at 30 days.**
67```
68buffer = min(30, max(7, lead_time_days ÷ 2))
69```
71The cap matters on slow imports. A 120-day lead time would otherwise produce a 60-day buffer, which quietly turns a 60-day order into a 150-day one and buries a quarter of the year's cash in a container. Past 30 days the right answer is ordering more often, not ordering more.
73| Condition | Status | Wording |
74|---|---|---|
75| cover < lead time | Too late | "Will stock out before an order can land. Ordering now shortens the gap, it does not close it" |
76| cover < lead time + buffer | Order now | "X days of cover, Y-day lead time. This is the week" |
77| cover < 45 days | Order soon | "Fine for now, put it on the next cycle" |
78| cover 45–120 days | Fine | No action |
79| cover > 120 days | Overstock | Not a reorder. See the slow-mover list |

Days of cover and the order decision

days_of_cover = (stock_on_hand + units_on_order) ÷ stockout_velocity

Inbound stock counts. An item with 4 days on the shelf and a pallet landing Thursday is not about to stock out, and flagging it as urgent teaches the owner to ignore the urgent list.

Zero velocity has no days of cover. Dividing by zero produces either an error or an absurd number, and either way the item does not belong on this ladder — nothing is selling, so nothing is running out. Skip the cover calculation entirely and send it straight to the slow-mover list with the cash tied up in it. The one exception is a season the owner has named; see below.

Compare against lead time plus a safety buffer. Default buffer is 7 days, or half the lead time, whichever is larger — long lead times need proportionally more room. Cap the buffer at 30 days.

buffer = min(30, max(7, lead_time_days ÷ 2))

The cap matters on slow imports. A 120-day lead time would otherwise produce a 60-day buffer, which quietly turns a 60-day order into a 150-day one and buries a quarter of the year's cash in a container. Past 30 days the right answer is ordering more often, not ordering more.

ConditionStatusWording
cover < lead timeToo late"Will stock out before an order can land. Ordering now shortens the gap, it does not close it"
cover < lead time + bufferOrder now"X days of cover, Y-day lead time. This is the week"
cover < 45 daysOrder soon"Fine for now, put it on the next cycle"
cover 45–120 daysFineNo action
cover > 120 daysOverstockNot a reorder. See the slow-mover list
Raw lines 55 to 80
81### The one carve-out for zero velocity
83A pool heater sells nothing in February and that is not dead stock — it is February. When the owner has named a season for an item or a category, a zero-velocity item inside that season does not go on the slow-mover list as something to clear.
85It goes on a **dated watch list** instead: the item, the date the owner says its season starts, and the date the decision has to be made, which is the season start minus the lead time.
87```
88Pool heater, 400k BTU SKU PHT-400
89 Velocity 0/day (28d) — Ray says the season starts around May 15
90 On hand 4 units
91 Decide by April 10 — 35-day lead time from the season start
92 Status WATCH, not a slow mover
93```
95Two rules keep this honest. **The owner names the season; it is never inferred** from a quiet month or from what the item sounds like. And **the watch entry carries a date**, because an undated "seasonal, check later" is how a business misses the first hot week entirely. When the decide-by date arrives with still no sales history, ask — do not size an order from a season that has not started.
97---

The one carve-out for zero velocity

A pool heater sells nothing in February and that is not dead stock — it is February. When the owner has named a season for an item or a category, a zero-velocity item inside that season does not go on the slow-mover list as something to clear.

It goes on a dated watch list instead: the item, the date the owner says its season starts, and the date the decision has to be made, which is the season start minus the lead time.

Pool heater, 400k BTU        SKU PHT-400
  Velocity      0/day (28d) — Ray says the season starts around May 15
  On hand       4 units
  Decide by     April 10 — 35-day lead time from the season start
  Status        WATCH, not a slow mover

Two rules keep this honest. The owner names the season; it is never inferred from a quiet month or from what the item sounds like. And the watch entry carries a date, because an undated "seasonal, check later" is how a business misses the first hot week entirely. When the decide-by date arrives with still no sales history, ask — do not size an order from a season that has not started.


Raw lines 81 to 98
99## Reorder quantity
101Sized on the 28-day rate, never on the hot one.
103```
104target = (60 + lead_time_days) × sizing_velocity
105order_qty = target − stock_on_hand − units_on_order
106```
108The target covers 60 days of selling **plus** the lead time, because the stock has to last from the day it lands until the next order lands. Sizing 60 days flat means running short by the length of the lead time on every single cycle.
110Then adjust:
112- Round **up** to pack size, unless that overshoots 90 days of cover at the sizing velocity, in which case round down and say so
113- Respect minimum order quantity — see below
114- Never return a negative quantity. Below zero means there is already enough; that item goes on the no-action list
115- **Always subtract units on order.** When inbound quantity is unknown, say the number assumes nothing is inbound

Reorder quantity

Sized on the 28-day rate, never on the hot one.

target    = (60 + lead_time_days) × sizing_velocity
order_qty = target − stock_on_hand − units_on_order

The target covers 60 days of selling plus the lead time, because the stock has to last from the day it lands until the next order lands. Sizing 60 days flat means running short by the length of the lead time on every single cycle.

Then adjust:

  • Round up to pack size, unless that overshoots 90 days of cover at the sizing velocity, in which case round down and say so
  • Respect minimum order quantity — see below
  • Never return a negative quantity. Below zero means there is already enough; that item goes on the no-action list
  • Always subtract units on order. When inbound quantity is unknown, say the number assumes nothing is inbound
Raw lines 99 to 116
117### Minimum order quantity
119**An MOQ is almost always a floor on the whole vendor order, not on each line.** Vendors set a minimum dollar or unit amount per shipment. Check the total against it first — three items that each fall short may clear it together, and splitting one line to hit a shipment minimum orders stock nobody needs.
121When the order still falls short and the vendor will not ship, the owner has a real decision, so give them the real numbers rather than quietly padding the order:
123```
124Ferguson's minimum is USD 1,000. The order as sized comes to USD 888.
125Clearing the minimum means one more case — 40 filters, USD 148, about 10 extra
126days of stock at the 4.1/day rate.
127Order the extra case, hold the order until the next item comes due, or
128split it across two vendors?
129```
131Excess units, excess dollars, and excess days — all three, every time. Then the owner decides. **Never silently round an order up to a vendor minimum.**
133---

Minimum order quantity

An MOQ is almost always a floor on the whole vendor order, not on each line. Vendors set a minimum dollar or unit amount per shipment. Check the total against it first — three items that each fall short may clear it together, and splitting one line to hit a shipment minimum orders stock nobody needs.

When the order still falls short and the vendor will not ship, the owner has a real decision, so give them the real numbers rather than quietly padding the order:

Ferguson's minimum is USD 1,000. The order as sized comes to USD 888.
Clearing the minimum means one more case — 40 filters, USD 148, about 10 extra
days of stock at the 4.1/day rate.
Order the extra case, hold the order until the next item comes due, or
split it across two vendors?

Excess units, excess dollars, and excess days — all three, every time. Then the owner decides. Never silently round an order up to a vendor minimum.


Raw lines 117 to 134
135## Every line shows its work
137```
138Merv 11 filter, 20x25x1 SKU FLT-2025
139 Velocity 4.1/day (28d), 5.8/day (7d) — running hot
140 On hand 38 units, none inbound
141 Runs out 6.6 days of cover on the 5.8 rate (38 ÷ 5.8)
142 Lead time 3 days (Ferguson) + 7-day buffer
143 Status ORDER NOW
144 Sized on 4.1/day, the 28-day rate — the 7-day spike is one week old
145 Target 258 units — 63 days (60 + 3 lead) × 4.1
146 Order 240 units (258 − 38 on hand = 220, rounded up to 6 cases of 40)
147 Cost USD 888 at USD 3.70/unit
148```
150Two different rates in one block, each labeled. The item runs out on the fast rate because being late loses the sale; it is ordered on the slow rate because a one-week spike is not a reason to buy a pallet. An owner who thinks the spike is real says so and the order gets resized in one step.
152The rounding check: 38 on hand plus 240 ordered is 278 units, about 68 days at 4.1/day. Under the 90-day ceiling, so rounding up to a full case is fine. Had it landed over 90 days, the order drops to 5 cases and the line says why.
154The owner approves this in ten seconds because the reasoning is visible. A bare "order 240" gets rebuilt by hand every time.

Every line shows its work

Merv 11 filter, 20x25x1        SKU FLT-2025
  Velocity      4.1/day (28d), 5.8/day (7d) — running hot
  On hand       38 units, none inbound
  Runs out      6.6 days of cover on the 5.8 rate (38 ÷ 5.8)
  Lead time     3 days (Ferguson) + 7-day buffer
  Status        ORDER NOW
  Sized on      4.1/day, the 28-day rate — the 7-day spike is one week old
  Target        258 units — 63 days (60 + 3 lead) × 4.1
  Order         240 units (258 − 38 on hand = 220, rounded up to 6 cases of 40)
  Cost          USD 888 at USD 3.70/unit

Two different rates in one block, each labeled. The item runs out on the fast rate because being late loses the sale; it is ordered on the slow rate because a one-week spike is not a reason to buy a pallet. An owner who thinks the spike is real says so and the order gets resized in one step.

The rounding check: 38 on hand plus 240 ordered is 278 units, about 68 days at 4.1/day. Under the 90-day ceiling, so rounding up to a full case is fine. Had it landed over 90 days, the order drops to 5 cases and the line says why.

The owner approves this in ten seconds because the reasoning is visible. A bare "order 240" gets rebuilt by hand every time.

Raw lines 135 to 154