We cut out-of-stocks 15% in Q4 by setting ROPs from real lead times and vendor OTIF instead of static min/max. If it helps, I can share the one-page sheet we use — ROP formula, safety stock (1.65 * sales stdev * lead time), and a simple vendor scorecard we update every Monday.
@OP We saw the same effect using real lead times, but the tweak that moved the needle was only counting ‘confirmed on-order’ in the ROP calc and using a 6‑week rolling lead time; our Monday scorecard caught one vendor sliding to 84% OTIF, so we temporarily bumped safety stock just on their SKUs and rolled it back after two clean weeks. Small caveat: during promos I freeze the ROP for fast‑movers and cover with a manual PO, otherwise the 1.65 x stdev x lead time balloons and you end up sitting on extra cases.
Quick example: we stopped feeding promo weeks into the sales stdev, backfilled those days with baseline units, and the 1.65 buffer stopped blowing up small-volume SKUs, @OP. Caveat: for big seasonal shifts we reset the baseline manually for a week so the buffer doesn’t lag. Want the SQL we use to tag promos?
@OP One tweak that paid off for us: we ditched the fixed 1.65 and used ABC-based service levels (A=97%, B=95%, C=90%) to set Z, then rounded ROP to case-pack and delivery-day windows; that cut “extra-each” orders and phantom OOS on slow movers. On the scorecard, adding an “ASN accuracy” line (did the carton count match?) exposed a couple partners who looked fine on OTIF but were short-shipping, which saved us more than any pep talk. If you’re open to it, I’d love to compare your sheet with this approach.