Reference for a twice-weekly (Mon + Thu) inventory transfer and PO planning loop. Every parameter here is a seeded default: measured values from your own PO/receipt history and actual demand data should override these as soon as n ≥ 6–8 observations exist per lane/SKU.
1. Safety stock & service levels
Core formula (factory POs — always use the combined form)
SS = z × sqrt( (L + R) × σ_d² + d_avg² × σ_LT² )
All inputs in days and units/day: L = lead time (90d China→warehouse), R = 3.5d review interval, d_avg = trailing daily velocity, σ_d = std dev of daily demand, σ_LT = std dev of lead time (Silver–Pyke–Peterson; Chopra & Meindl; supplychainmath.com). The d_avg² × σ_LT² term usually dominates for imported goods on fast movers — omitting it systematically understates the buffer.
- σ_LT default = 10 days for the factory→ocean→US/EU/CA lane. Pure RSS of component ranges gives ~9d (production ±4d, ocean ±7d, customs ±3d), but 2025–26 transpacific on-time reliability is only 52–65% with 3–7d congestion delays, so seed the fatter 10d (Drewry Q3 2025; Sea-Intelligence 2025–26). Recompute per lane from PO-date-to-receipt-date once ≥ 6–8 receipts exist; a 12d value is a deliberate tail-risk override for CNY/congestion seasons only.
- Protection period = L + R = 93.5d. The periodic-review penalty vs continuous is sqrt(93.5/90) − 1 = +1.9% — twice-weekly review is essentially free at this lead time; even weekly (R=7) adds only ~4% (MIT CTL.SC1x; Silver–Pyke–Peterson).
Simplified formula — per-SKU test, no blanket exemptions
SS = z × σ_d × sqrt(L + R) is allowed only if d_avg × σ_LT < 0.5 × σ_d × sqrt(L+R) (lead-time term inflates combined σ by < ~12%). Run the test per SKU:
- Factory POs: always fail (any SKU above ~0.2–0.9 units/day) → full formula.
- Internal transfers (L = 3–7d, σ_LT ≈ 1d): slow/lumpy SKUs usually pass; fast smooth movers above ~1–1.5 units/day fail (e.g., a hero SKU replenishing FBA at 10/day would be understated 35–40%). Test, don't exempt (Vandeput; netstock.com — corrected per verification).
Service-level tiers
z-table: 85% = 1.04, 90% = 1.28, 95% = 1.645, 97.5% = 1.96, 98% = 2.05, 99% = 2.33
| Class | Definition | CSL | z |
|---|---|---|---|
| A | Top ~20% SKUs / ~80% revenue (hero SKUs, best-performing licensed-line variants) | 95% | 1.645 |
| A-committed | A SKUs with contracted wholesale obligations (MAP-protected licensed-line SKUs) | 98% | 2.05 |
| B | Mid-tier | 90% | 1.28 |
| C | Slow colorway/size tail | 85% or DoC floor | 1.04 |
Practitioner bands run A 95–98 / B 91–95 / C 85–90 (bizowie.com; lokad.com; Teunter et al.). A brand at this scale sits mid-band, not top: the airfreight expedite option and a $48–90 unit capital cost argue against 99%+ anywhere — z jumps 1.645→2.33 from 95%→99%, +42% safety stock for the last 4 points of service. Skip incremental safety stock entirely where MOQ ≥ 3× monthly demand — MOQ cycle stock already delivers the service.
Demand-variability estimation
d_avg: 28-day trailing window (keep current practice).σ_d: trailing 90 days (13 weeks), minimum 60 non-stockout days — a 28-day σ estimate whipsaws every review. Prefer weekly buckets:σ_daily = σ_weekly / sqrt(7)to kill day-of-week noise. Exclude stockout days (censored demand biases both inputs down exactly when stock was needed) and promo days (Prime Day, BFCM) (Vandeput).- Intermittency gate: if a SKU has < 10 selling days per 90d OR CV = σ_d/d_avg > 1.5, the normal z-formula produces nonsense — use a flat min-stock of 60 days of cover, rounded up to inner-carton multiple, or make the SKU build-to-PO (Croston/Syntetos–Boylan; lokad.com).
2. Order-up-to policy for Mon + Thu review (R = 3.5d)
Adopt a periodic-review (R,s,S) hybrid — not pure order-up-to (which would fire sub-MOQ orders every review against 1,000–2,000-unit factory MOQs) and not continuous (s,Q) (Silver–Pyke–Peterson; INFORMS WSC15).
Every Mon and Thu, per SKU per echelon:
IP = on-hand + open POs + in-transit − backorders − allocated wholesale
s = d_avg × (L + R) + SS # reorder point
S = s + max(MOQ, EOQ) # order-up-to level
if IP < s: order qty = max(MOQ, S − IP)
- Always trigger on inventory position, never on-hand. With a 90-day pipeline vs ~45 days on hand, ~2/3 of system inventory is in transit; on-hand triggering double/triple-orders every review. ERP: include open POs + in-transit transfers across every active stocking location (MIT CTL.SC1x).
- Order-up-to demand component:
S = 93.5 × d_avg + z × σ_d × sqrt(93.5)≈93.5 × d_avg + 9.67 × z × σ_d, plus the lead-time-variance term from §1. - In days-of-supply terms, s ≈ 93.5 + SS_days ≈ 100–140 days on IP depending on tier — most A-SKUs will always have an open PO. That is correct behavior, not over-ordering.
- Consolidation rule: max one factory PO per review cycle (≤ 2/week). Joint replenishment: when any A SKU breaches s, also top up any SKU with IP below
s + 7 × d_avgto fill the container — this is the operational payoff of periodic over continuous review (joint-replenishment heuristics, arXiv:1902.11025). - Keep the 45-day cover figure as an on-hand health KPI only — it is not the ordering trigger in this framework.
3. Lead times & variability
Lane table (door-to-door, Shenzhen origin — seeded defaults, override with measured receipts)
| Lane / mode | Mean (days) | σ (days) | Notes |
|---|---|---|---|
| Production (contract factory) | 37.5 (range 30–45) | ~4 | Per-PO; confirm at order |
| Ocean LCL → Miami via USWC + transload | 40 | 7 | 14–21d port-to-port + transload + 5–7d rail/4–5d truck + dwell; FCL = 35d (Freightos; Dimerco — corrected: 30d is P10–P20 of lane, not mean) |
| Ocean LCL → Miami all-water (EC) | 50 | 7–10 | 28–38d port-to-port (Shenzhen–Miami ~32–35d); FCL = 45d; Panama queue drives the fatter σ |
| Ocean LCL penalty vs FCL, any lane | +7 mean | +3 | CFS consolidation/deconsolidation both ends; worse at peak (Freightos; Unicargo) |
| Ocean → Rotterdam (the EU hub / Amazon DE) | 50 (40 port-to-port) | 8 | Bimodal Suez/Cape routing; drop to ~40 door-to-door if sustained Suez confirmed on actual carrier — review quarterly (Maersk advisory) |
| Air China → US/EU | 8 | 2 | 2–5d airport-to-airport; UN3481 lithium handling adds cost not much time; +1–3d in Q4/CNY peak (Freightos; Dimerco) |
| Customs (US or EU) | 6 (5–7) | 3 | Fat tail on exams |
| Domestic transfer (regional hub → forward warehouse) | 3–7 | 1 | Simplified SS formula usually OK — but run the §1 test |
| Total PO→US warehouse (ocean) | ~90 | 10 | Matches current heuristic; σ from §1 |
Standing congestion buffer: add +6 days to every unbuffered carrier ETA — 2025–26 on-time is 59–65% globally (transpacific hit 29% Jan 2026) with late vessels averaging 5.2–5.5d late, so expected delay ≈ (1−0.62) × 5.5 ≈ 2d plus tail (Sea-Intelligence GLP Jan–May 2026). Never promise availability off the raw ETA.
Chinese New Year 2027 (CNY Day = Sat Feb 6, 2027)
- Holiday projected Feb 5–12, 2027 — official State Council schedule publishes ~Nov 2026; treat dates as projected until then (Titoma; Insight Quality — corrected).
- Total disruption window: 6–8 weeks (mid-Jan → mid/late-Mar); factory-effective capacity loss: 4 weeks.
- Production cutoff: ~Jan 20, 2027. Any factory PO that cannot finish production by then gets lead time inflated +28–42 days (use +35d default).
- Last safe PO date: Nov 20 – Dec 1, 2026 (raw math at 30–45d production = Dec 6–21; the 2–3 week pull-forward covers pre-CNY factory congestion, QC, and the late-Jan vessel-space crunch — corrected from the erroneous Oct 15–Nov 1 figure).
- Loop behavior: from Oct 1, 2026, every review must project whether each SKU's next PO lands pre- or post-CNY window and pull orders forward accordingly.
Golden Week (Oct 1–7 annually, occasionally 8 days)
- Inflate lead time +7–10 days for any PO whose production window overlaps Oct 1–8. Book ocean 3–4 weeks before Oct 1; air 1 week. Auto-flag every PO placed Aug 15 – Sep 30 (Flexport; DHL GF; SEKO). This is a 1–2 week disruption, not CNY-scale.
4. Forecast error & buffer sizing
- Primary KPI = WAPE = Σ|forecast − actual| / Σactual, monthly, at three levels: portfolio, brand (flagship / licensed product lines), SKU. Suppress per-SKU MAPE display when monthly actuals < 20 units — plain MAPE explodes on the low-volume tail (demandplanning.net).
- Targets: established SKUs 40% SKU-month WAPE (green < 40%, yellow 40–55%, red > 55%); aggregate 20%; new launches graded at 60% for first 6 months. Sub-30% SKU-level in year one would be exceptional — never size buffers assuming it (planster.io; toolsgroup.com; fashion/CE benchmarks 35–60%).
- Bias, tracked separately: rolling 3-month bias % per SKU; tolerance ±5–10% (A), ±15% (B), ±25% (C/new). Tracking signal alert at |cumulative error / MAD| > 4 (~3σ, since σ ≈ 1.25 × MAD) → force model review before next Mon/Thu cycle (umbrex.com; demandplanning.net). Persistent bias is worse than random error against 90-day leads and MOQ commitments.
- Buffer from forecast error (preferred once error history exists):
SS_units = z × (1.25 × MAD_monthly) × sqrt(3)= z × 1.25 × MAD × 1.73 for the 3-month lead time; σ ≈ 1.2533 × MAD conversion (demandplanning.net; estepsoftware.com). - Days-of-cover form:
SS_days = z × 1.25 × WAPE × 1.73 × 30.4. At 40% WAPE: A (z=1.645) ≈ 43d, B (z=1.28) ≈ 34d, C (z=1.04) ≈ 27d. The flat 45-day cover target approximates the A-tier requirement only — reinterpret as tiered. - Measure at lag-3 (forecast made 3 months ago vs this month's actual) — that is the buying-decision lag; lag-3 error runs ~1.3–1.5× lag-1, so lag-1 sizing under-buffers. Freeze a monthly forecast snapshot per SKU to enable this. Require ≥ 6 monthly error observations (prefer 12) before trusting SKU-level RMSE; else fall back to brand-level WAPE (APICS CPIM practice).
- Horizon scaling: protection interval = 3.0 + 0.12 months ≈ 3.1; σ_protection = σ_monthly × 1.77. Review frequency is not the constraint — the 90-day lead time is. Halving effective lead time (air split, a bonded forward buffer near origin) cuts required SS by 1 − sqrt(45/90) = 29%.
5. Transfer-vs-reorder decision rules
Principle: transfers fix a distribution problem (right total, wrong place); POs fix a quantity problem (network total too low). Two-gate waterfall every Mon + Thu, in order (van Wijk et al., EJOR 2019; MIT thesis 1721.1/142952):
Gate 1 — Quantity (PO trigger, network level)
Place/expedite a factory PO when network-wide IP days-of-cover < L + R + SS_days, i.e. 90 + 7 + tier SS_days ≈ 140d (A) / 131d (B) / 124d (C) on inventory position (use the full 7-day week here as cheap insurance, not the 3.5d average-delay convention — corrected; the old 45+3.5d trigger would guarantee ~40 days of stockout before a 90-day PO lands). Transfers cannot fix a Gate-1 breach.
Gate 2 — Distribution (transfer screen, per SKU-region pair)
A transfer executes only if it passes all five checks in sequence:
- Trigger band: receiver DOC < 30d AND donor DOC > 90d AND (network DOC ≥ 60d OR a PO is already in transit arriving before the donor's run-out) — the OR-clause lets a transfer legitimately bridge the 90-day PO gap (corrected: without it there's a dead zone at network DOC 48–60).
- Donor protection (the most important guard): donor floor = days-until-next-confirmed-inbound-receipt + 14d buffer, minimum 30d; if NO confirmed inbound PO, floor = 90d (full replenishment lead time; 60d absolute minimum under working-capital pressure).
Transferable = max(0, donor AVAILABLE (on-hand − committed/allocated) − floor × donor 28d daily velocity). Never drain a donor below its own 30-day trigger (corrected from the flat 45d floor, which guaranteed a ~45-day donor stockout with no inbound PO; principle per USPTO US10713615; ShipBob; frePPLe). - Economics (newsvendor): transfer if
P(stockout at receiver before other relief) × (unit margin + goodwill) > c_transfer/unit, goodwill = 25% of margin. Break-even stockout probability P* = c_t / (1.25 × margin): domestic $2/unit → P* ≈ 3–4% (almost always transfer); international $8/unit → P* ≈ 12–15% (UT Dallas OPRE 6302; Cornell newsvendor). Requires per-SKU margin + per-lane cost tables, not just velocity. - Minimum transfer qty:
MTQ = max( qty where fixed shipment cost ≤ 5% of transferred COGS, 14 days of receiver velocity ), rounded up to full master cartons. At an illustrative ~$60 unit cost: a $150 domestic shipment → ~50 units min; a $600 international shipment → ~200 units min. Below MTQ, wait or bundle SKUs (fixed cost is per shipment, not per SKU). - Anti-ping-pong (all three together): (a) hysteresis — trigger at 30d (0.67× the 45d reference), donor threshold 90d (2×), fill receiver to 45d, never above; (b) max 1 transfer per SKU-lane per review; (c) no reverse transfer of the same SKU on the same lane for 90 days (one PO cycle) without manual override; (d) transfer qty capped so donor post-transfer DOC never falls below its own 30d trigger (mechanisms per USPTO US11797919 — corrected attribution — and US9942324).
Cross-border rule
International lateral transfers (e.g., the Miami warehouse ↔ a Canadian hub, US ↔ the EU hub) cost $6–12/unit landed (freight + duty + brokerage) vs $1–3/unit domestic, plus 1–3 weeks transit. Execute only if receiver run-out < 30d AND the next PO cannot arrive in time. The cheapest international "rebalance" is re-splitting the next PO's allocation at origin (the contract factory ships direct per region — zero incremental freight). For network shortages, air-freighting part of a PO (production + ~8d air ≈ 40–50d total) costs ~$1.5–3/unit premium against a $40–60 margin — prefer it over emergency transfers (Freightos FAX; BSI 2026).
Sanity check
Proactive scheduled rebalancing is preferred over stockout-triggered moves in long-lead periodic-review systems (Burton & Banerjee 2005; Tiacci & Saetta 2011); simulation pooling gains run ~13–26% of system cost/profit in favorable domestic settings — for a brand's international regions expect the low end, a modest ceiling on holding-cost savings (illustrative: ~$20–60K/yr for a ~$5M-revenue brand — corrected, keep the rule simple). Expect single-digit transfer candidates per review; if the screen regularly flags > 10, the origin PO split is wrong — fix upstream.
6. Freight economics matrix (~350g boxed unit, ~2.5L cube → ~400 units/CBM)
| Mode | $/unit (US lane) | Door-to-door | Use for |
|---|---|---|---|
| Air ($5.50/kg planning, band $4–8; EU $4.50, band $3.5–6) | $2.50–3.00 (chargeable 0.45–0.55 kg/unit) | 8–10d (5–8d = express courier only) | Stockout top-offs, launches |
| Ocean LCL ($175/CBM all-in, band $130–250) | ~$0.45 | 40d (WC+transload) / 50d (all-water Miami) | Steady-state replenishment |
| Ocean FCL 40HQ ($4,500/FEU base + $1,200–1,800 drayage/destination) | ~$0.23 (~26K units/40HQ) | 35d / 45d | Rare — only at multi-series consolidated POs |
- Dim weight: chargeable kg = max(actual, CBM × 167) air (divisor 6000) or CBM × 200 courier. At ~140 kg/CBM actual density, a brand at this profile is volumetric-bound — always compute from cube (IATA standard). Lithium batteries (UN3481/PI967) push air to the top of the rate band.
- Mode thresholds: ≤ 2 CBM (≈ 800 units) or stockout-within-lead-time-gap → air; > 2 CBM → LCL; > 13–15 CBM → FCL 20ft; > 25–28 CBM → FCL 40ft (40HQ usable ~65–68 CBM). LCL shipments under 2 CBM hit $300–450 flat minimums; 5 CBM all-in ≈ $800–1,400 (Freightos; Suaid Global; Gerudo).
- Air premium ≈ 3–5% of COGS at an illustrative $48–90 unit cost — rational insurance vs weeks of stockout. Air trigger: projected DoC at PO arrival < 14 days.
- Rate volatility: FCL spot swung ~3× in under 5 months (FBX01 ~$1.9–2.4K/FEU Feb 2026 → Drewry WCI $6,349/FEU Shanghai–LA Jul 2, 2026; Shanghai–Rotterdam $4,682). But at 1–3 FEU/yr equivalent, FCL swings move landed cost only ~$0.06–0.21/unit — refresh LCL $/CBM and air $/kg quarterly as the primary inputs; FCL is secondary (Drewry WCI; Freightos Baltic — corrected materiality).
- Duties, US (China origin, example composition — verify per shipment with your broker): a brand classified under HTS 8517.62 (transceivers/communications hardware) rather than sunglasses 9004.10 can see 0% MFN + 7.5% §301 List 4A + 10% §122 surcharge = 17.5% base case under its own binding ruling — cheaper than the 9004.10 path at 19.5%. Stress case 35% (reclassification under 8518.30.20 / List 3) if CBP extends its 2024–25 Bluetooth-headset ruling revocations to audio eyewear — a live risk to monitor. Low case 7.5% if the §122 surcharge lapses as scheduled ~Jul 24, 2026 without replacement. Actions: verify your 7501s cite the correct HTS/program codes; flag any IEEPA refund eligibility (CAPE portal) to finance (CBP rulings; classification is product- and ruling-specific — don't assume this composition applies to yours).
- EU (via the EU hub): duty 0% (8517 electronics) or 2.9% (9004.10); 21% NL import VAT is cash-flow only with an Article 23 deferment license — confirm your EU entity holds one (EU TARIC; belastingdienst.nl).
7. Benchmarks
| Metric | Target / threshold | Notes |
|---|---|---|
| Inventory turns, on-hand | Green > 4x (< 91d), yellow 2–4x, red < 2x | DTC electronics/eyewear band 4–6x; ecommerce median only 2.8x; eyewear retail 2.5–6x (Eightx; Umbrex) |
| Inventory turns, total owned incl. in-transit | Green ≥ 3.5x (~104d DSI), yellow 2–3.5x, red < 2x | Corrected: gating total inventory at 4x would structurally false-alarm given 45d on-hand + 30–45d pipeline + MOQ cycle stock |
| Per-SKU days of cover | > 120d = caution; > 150d = markdown/redeploy review | A items target 45–90d on-hand (4–8x), corrected from "15–30d" which implies FBA-style replenishment most brands at this lead time don't have (Eightx; Onramp) |
| Stockout cost | weekly velocity × GM (illustrative $50–60/unit at a $90–110 ASP, 50–58% GM) × lost-sale fraction | Fraction: 0.4 Shopify, 0.7 Amazon FBA (algorithmic substitution + rank decay), 0.5 default; +10–15% repeat-purchase uplift on repeated stockouts (GMA/retail OOS research) |
| Backorder policy | Enable on A-SKUs when inbound ETA ≤ 30d, stated ship date padded +1–2 wks | Lost fraction with backorder: 0.35–0.50 (0.25–0.35 only if wait ≤ 14d) — corrected from vendor-claimed 0.15–0.25; ~45% of NEW customers abandon backorders. No PO placed (90d gap): 0.7–0.9 lost. Cap backorder units at inbound qty; proactive wait updates (cancellations ~triple without them) |
| Dead stock staging | Slow-mover review 90d (60d = aggressive electronics override, not consensus); excess 90–120d; dead at 180d | Velocity trigger < 0.25 u/day evaluated at company level (per-location would flag most of the catalog at ~1.7 u/day avg/SKU); start the clock at receipt date and exempt first-order MOQ cover; write-down flag 180–365d — if you're a public company, the reserve decision goes through finance/audit review, not this loop (ERP; nventory) |
| Dead stock KPI | 180d+ zero-sales < 5% of inventory value | > 10% = structural problem |
| Working capital | Inventory 13–18% of TTM revenue norm, 20% hard ceiling; NWC 10–15% of sales | Damodaran consumer electronics 13.6% inventory/sales, 11.2% NWC — corrected from flat "20% typical." Illustrative for a ~$5M-revenue brand: ~$650–900K inventory norm, ~$1.0M ceiling, ~$500–750K NWC |
| Cash conversion cycle | < 135d near-term; < 100d once inventory is near the norm | CCC = DIO + DSO − DPO; blended DSO ~6–11d (a wholesale channel at Net 30+ terms adds meaningfully to AR — size it as a % of wholesale revenue, not a flat day count — corrected from ~3d). Pre-ship-on-terms manufacturing makes DPO ~0. Every 10 days of DSI cut releases roughly 9–11% of inventory value in freed cash |
| MOQ trap | MOQ / daily velocity > 180 days → flag "MOQ-trapped" | Consolidate colorways or exit; the binding constraint at scale — illustrative, e.g. a catalog of 50–70 SKUs with 1,000–2,000-unit MOQs (Eightx) |
8. Config defaults (machine-readable)
# scm-config v1.0 — seeded defaults; measured ERP / order-history overrides
review:
cadence_days: 3.5 # Mon + Thu
po_gate_review_days: 7 # conservative full week for network PO trigger
max_factory_pos_per_review: 1
service_levels: # cycle service level -> z
A: {csl: 0.95, z: 1.645}
A_committed: {csl: 0.98, z: 2.05} # contracted wholesale only
B: {csl: 0.90, z: 1.28}
C: {csl: 0.85, z: 1.04}
z_table: {85: 1.04, 90: 1.28, 95: 1.645, 97.5: 1.96, 98: 2.05, 99: 2.33}
skip_ss_if_moq_months_demand: 3 # MOQ >= 3x monthly demand -> no incremental SS
safety_stock:
formula: "SS = z * sqrt((L+R)*sigma_d^2 + d_avg^2*sigma_LT^2)"
simplified_ok_test: "d_avg*sigma_LT < 0.5*sigma_d*sqrt(L+R)" # run per SKU, incl. transfers
sigma_LT_factory_days: 10 # derived RSS ~9; recompute after >=6-8 receipts/lane
sigma_LT_transfer_days: 1
intermittency_gate: {min_selling_days_per_90d: 10, max_cv: 1.5}
intermittent_fallback_doc_days: 60 # rounded up to carton multiple
ss_days_by_tier_at_wape40: {A: 43, B: 34, C: 27} # z*1.25*WAPE*1.73*30.4
demand_estimation:
d_avg_window_days: 28
sigma_d_window_days: 90 # min 60 non-stockout days; weekly buckets /sqrt(7)
exclude: [stockout_days, promo_days]
policy_RsS:
ip: "on_hand + open_po + in_transit - backorders - allocated_wholesale"
s: "d_avg*(L+R) + SS" # ~100-140 days of supply on IP
S: "s + max(MOQ, EOQ)"
order_qty: "max(MOQ, S - IP) if IP < s"
joint_replenishment_topup_days: 7 # add SKUs with IP < s + 7d demand to triggered PO
lead_times_days: # door-to-door means; add congestion_buffer to ETAs
production_factory: {mean: 37.5, sigma: 4}
ocean_lcl_westcoast_to_hub: {mean: 40, sigma: 7}
ocean_lcl_allwater_to_hub: {mean: 50, sigma: 10}
ocean_fcl_westcoast_to_hub: {mean: 35, sigma: 7}
ocean_fcl_allwater_to_hub: {mean: 45, sigma: 10}
ocean_to_eu_hub: {mean: 50, sigma: 8} # 40 if sustained Suez; review quarterly
air_cn_to_us_eu: {mean: 8, sigma: 2}
customs: {mean: 6, sigma: 3}
domestic_transfer: {mean: 5, sigma: 1}
total_po_to_warehouse: {mean: 90, sigma: 10}
congestion_buffer_days: 6
seasonal:
cny_2027:
holiday_projected: 2027-02-05..2027-02-12 # official schedule ~Nov 2026
production_cutoff: 2027-01-20
last_safe_po_date: 2026-11-20..2026-12-01 # raw math Dec 6-21 + 2-3wk buffer
lead_time_inflation_days_if_missed: 35 # range 28-42
factory_capacity_loss_weeks: 4
start_projecting_from: 2026-10-01
golden_week:
dates: 10-01..10-08
lead_time_inflation_days: 8 # range 7-10
flag_pos_placed: 08-15..09-30
book_ocean_weeks_ahead: 4
forecast_error:
primary_kpi: WAPE
suppress_sku_mape_below_monthly_units: 20
targets: {sku_established: 0.40, aggregate: 0.20, new_product_first_6mo: 0.60}
sku_wape_bands: {green: 0.40, yellow: 0.55} # red above 0.55
bias_tolerance: {A: 0.10, B: 0.15, C_new: 0.25}
tracking_signal_limit_mad: 4
mad_to_sigma: 1.25
error_lag_months: 3 # lag-3 for buffer sizing; lag-1 for sensing
min_error_observations: 6 # prefer 12; else brand-level WAPE
sqrt_protection_multiplier: 1.77 # sigma_monthly -> 3.1-month protection interval
transfers:
gate1_po_trigger_ip_doc_days: {A: 140, B: 131, C: 124} # L + 7 + SS_days
trigger_band: {receiver_doc_lt: 30, donor_doc_gt: 90}
network_gate: "network_doc >= 60 OR inbound_po_arrives_before_donor_runout"
donor_floor_days: "days_to_next_confirmed_inbound + 14, min 30; if none: 90 (60 abs min)"
transferable: "max(0, donor_available - floor * donor_28d_velocity)"
fill_receiver_to_days: 45 # never above
goodwill_pct_of_margin: 0.25
breakeven_p_stockout: {domestic: 0.035, international: 0.135}
transfer_cost_per_unit: {domestic: 2, international: 8} # intl range 6-12
mtq: "max(qty at fixed_cost<=5% COGS, 14d receiver velocity), full cartons"
mtq_example_units: {domestic: 50, international: 200}
anti_ping_pong:
max_transfers_per_sku_lane_per_review: 1
reverse_cooldown_days: 90
donor_post_transfer_doc_floor: 30
air_topup_trigger_doc_at_po_arrival: 14
expected_candidates_per_review: "<10; more -> fix origin PO split"
freight: # refresh air $/kg + LCL $/CBM quarterly (primary); FCL secondary
units_per_cbm: 400 # ~2.5L/unit boxed, 350g actual
air: {usd_per_kg_us: 5.50, band_us: [4.0, 8.0], usd_per_kg_eu: 4.50, band_eu: [3.5, 6.0],
dim_divisor_air: 6000, dim_divisor_courier: 5000,
chargeable_kg_per_unit: 0.50, usd_per_unit_us: 2.75}
lcl: {usd_per_cbm_allin: 175, band: [130, 250], flat_min_under_2cbm: [300, 450],
usd_per_unit: 0.45}
fcl: {usd_per_feu_uswc: 4500, band_uswc: [2000, 8000], usd_per_feu_neur: 4500,
band_neur: [2300, 5500], destination_fees_per_feu: [1200, 1800],
usd_per_unit_40hq: 0.23}
mode_thresholds_cbm: {air_max: 2, lcl_max: 14, fcl20_max: 27} # 40HQ usable 65-68 CBM
air_threshold_units: 800
duties:
us: {base: 0.175, # example HTS 8517.62 composition (0% MFN + 7.5% Sec301-4A + 10% Sec122) — verify your own binding ruling with your broker
alt_9004: 0.195, stress_reclassification: 0.35,
low_if_sec122_lapses: 0.075, sec122_expiry: 2026-07-24,
actions: [verify_7501_hts, monitor_ruling_revocation, flag_refund_eligibility_to_finance]}
eu: {duty: 0.0, # 8517 path; 0.029 if 9004.10
nl_import_vat: 0.21, vat_treatment: cashflow_only_article23,
confirm: eu_entity_article23_license}
benchmarks:
turns_on_hand: {green: 4.0, yellow: 2.0} # red below 2.0
turns_total_owned: {green: 3.5, yellow: 2.0}
on_hand_cover_target_days: 45 # health KPI, not order trigger
sku_doc_flags: {caution: 120, markdown_review: 150}
a_item_on_hand_days: [45, 90]
stockout_lost_fraction: {shopify: 0.4, amazon_fba: 0.7, default: 0.5,
backorder_eta_le_30d: 0.42, backorder_wait_le_14d: 0.30,
no_po_90d_gap: 0.80}
unit_gross_margin_usd: [50, 60]
dead_stock: {slow_review_days: 90, excess_days: 120, dead_days: 180,
velocity_trigger_units_day_company_level: 0.25,
max_pct_inventory_value: 0.05, clock_starts: receipt_date}
working_capital: {inventory_pct_ttm_rev_norm: [0.13, 0.18], ceiling: 0.20,
nwc_pct_sales: [0.10, 0.15], dso_days: [6, 11],
ccc_target_days: {near_term: 135, steady_state: 100},
cash_per_10d_dsi_pct_of_inventory: [0.09, 0.11]}
moq_trapped_days: 180