Upload a SKU list to see what to reorder, how much, and what is overstocked.
How the numbers are calculated
Formulas
- Days of cover
- current_inventory ÷ avg_daily_sales
- Lead-time demand
- avg_daily_sales × lead_time_days
- Reorder point
- lead-time demand + safety_stock
- Inventory position
- current_inventory + open_po_qty
- Suggested order
- max(reorder point − position, 0), rounded up to MOQ
Status (checked in order)
- Critical
- position < lead-time demand
- Reorder
- position < reorder point
- Overstock
- days of cover > 90
- Healthy
- everything else
Data handling
- Expected columns: sku, product_name, current_inventory, open_po_qty, avg_daily_sales, lead_time_days, safety_stock, moq, unit_cost. Header matching is case-insensitive.
- Blank or non-numeric values are treated as 0 and the row is flagged (⚠) so nothing silently changes the result.
- Zero or missing sales: days of cover shows as “no sales”; lead-time demand is 0, so the reorder point equals safety stock. Stock on hand with no sales counts as overstock; no stock and no sales is healthy.
- MOQ of 0, blank or negative is treated as 1 (no rounding). A suggested order is never below the shortfall.
- Rows without a SKU are skipped. Duplicate SKUs are kept and flagged.
- Negative quantities are clamped to 0 and flagged.
Upload a shipment log to find deliveries that were late or cost well above the lane norm, ranked by money at stake.
How exceptions are identified
Formulas
- Lane
- origin → destination
- Cost per mile
- freight_cost ÷ distance_miles
- Lane average
- mean cost per mile of all shipments on the lane
- Variance
- cost per mile ÷ lane average − 1
- Late days
- actual_delivery_date − promised_delivery_date
- Excess cost
- max((cost per mile − lane average) × distance_miles, 0)
Status (checked in order)
- Critical
- high cost and late
- High Cost
- variance > +30%
- Late
- actual delivery after promised
- Normal
- everything else
The table ranks by excess cost, then late days, so the most expensive exceptions are at the top. Excess cost is an estimate of what the shipment would have saved at the lane's average rate; it is not a claim against the carrier.
Data handling
- Expected columns: shipment_id, origin, destination, carrier, distance_miles, freight_cost, ship_date, promised_delivery_date, actual_delivery_date. Header matching is case-insensitive. Dates should be YYYY-MM-DD; other common formats are accepted where unambiguous.
- Zero, blank or invalid mileage, or a zero/blank/invalid cost: cost per mile can't be calculated, the shipment is left out of the lane average and can't be flagged High Cost. It can still be flagged Late. The row is marked ⚠.
- A missing or invalid promised or actual date: late days are unknown (shown as —) and the shipment is not flagged Late. Blank actual date usually means not yet delivered.
- A lane with only one measurable shipment is its own benchmark: variance 0, no excess cost, flagged “no benchmark”.
- Rows without a shipment ID are skipped. Duplicate IDs are kept and flagged. Negative costs or mileage are treated as invalid.
Upload supplier metrics to rank suppliers on delivery, quality, cost and service with weights you control.
Select a supplier to see what drove its score.
How suppliers are scored
Dimension scores (each 0–100, clamped)
- Delivery
- otif_percent
- Quality
- 100 − defect_rate_percent × 10
- Cost
- 100 − max(price_variance_percent, 0) × 10
- Service
- 100 − avg_response_hours × (100 ÷ 48)
- Overall
- Σ (dimension score × weight)
So a 2% defect rate scores 80, a 5% unfavorable price variance scores 50, and a 24-hour response time scores 50. Favorable (negative) price variance scores 100. Weights must sum to 100%.
Ratings
- Preferred
- overall ≥ 85
- Acceptable
- 70 – 84.99
- Watch
- 55 – 69.99
- Critical
- < 55
- Incomplete
- one or more required metrics missing or invalid — not scored
Data handling
- Expected columns: supplier, annual_spend, otif_percent, defect_rate_percent, price_variance_percent, avg_response_hours. Header matching is case-insensitive.
- The four scoring metrics (otif_percent, defect_rate_percent, price_variance_percent, avg_response_hours) must each be present and numeric. If any is blank, non-numeric, or invalid, the supplier is marked Incomplete: no overall score or rating is calculated, and it's excluded from rank, average score, spend-weighted average, and highest-rated. It stays visible in the table with the missing field(s) named (hover the ⚠).
- Price variance may legitimately be negative (favorable pricing) — this is valid, not missing. Otherwise-valid zero values (e.g. 0% defects) are scored normally and are not treated as missing.
- otif_percent, defect_rate_percent, and avg_response_hours must be ≥ 0 to be valid; a negative value there is treated as invalid (Incomplete), not clamped to 0.
- annual_spend is not a required scoring metric — a blank or invalid spend is treated as $0 and doesn't affect completeness.
- Rows without a supplier name are skipped. Duplicate names are kept and flagged.
- Ranking is by overall score among scored suppliers only, ties broken by annual spend.