Skip to content

Inventory Optimization

Inventory Optimization computes the optimal safety stock to hold at each facility across a multi-echelon supply chain. Given your network (facilities, flows, demand, lead times, and service targets), it calculates how much buffer inventory each facility should carry to absorb demand and lead-time variability while meeting your target service level.

TIP

Inventory Optimization is a separate module from Network Optimization. Network Optimization decides the network design and flows to minimize cost or maximize profit; Inventory Optimization takes the network as given and computes safety stock. Open it from the Inventory Optimization (boxes) icon in the left sidebar.

Screens

The module has four tabs:

TabPurpose
DataManage scenarios, import input data, and browse the input tables.
ComparisonCompare total safety stock cost/quantity and networks across scenarios.
AnalysisDeep-dive a single scenario: network graph, per-facility demand, lead time, and safety stock.
ResultsReview the computed Safety Stocks table.

Before You Start

Prepare an Excel workbook with your network data. The easiest way to start is from the sample file, which contains exactly the sheets this feature uses.

TIP

Download the Inventory Optimization sample workbook and edit it with your own data.

Input sheets

The sample workbook contains the sheets this feature needs:

SheetPurpose
PeriodsPlanning periods.
Products / Product IndividualsProduct master and per-product attributes.
LocationsGeographic master. Each location must also appear as a Customer, Facility, or Supplier.
Suppliers / Facilities / CustomersThe three location subtypes. Facilities carry a type such as DC, Port, or Mfg.
DemandsDemand quantity per customer × product × period.
FlowsShipment quantity per from-location × to-location × product × period. This sheet defines the network topology the optimizer runs over.
PathsDistances between locations.
Facility Processing TimesProcessing time per facility × product.
Inventory PoliciesCarrying-cost percentage and inventory turns per facility × product, plus optional safety stock bounds.
Customer PoliciesTarget service level and maximum guaranteed service time per customer × product.

WARNING

Every customer × product with demand needs a Customer Policies row. If one is missing, the run fails for that product with a Missing Customer Policy error.

Setting service levels per product group (ABC analysis)

The productName column on Customer Policies and Inventory Policies accepts a group representative product name in place of a product name. That row then applies to every member product of the group.

To drive service levels from an ABC analysis:

  1. Register Class A / Class B / Class C in Products with type = Group.
  2. Assign each product to a class in Product Groups (groupProductName = the class, memberProductName = the product).
  3. Write one Customer Policies row per customer × class instead of one per product.

Rows resolve in this order:

  • A row naming the product itself wins. Add one when a single product needs to deviate from its class-wide level.
  • Otherwise a row naming one of the product's group representatives applies.
  • A product matching two group rows for the same customer is an error. There is no way to tell which level was intended, so add a row for the product itself to disambiguate.

Safety stock bounds

The minSafetyStock and maxSafetyStock columns on the Inventory Policies sheet set business bounds on the safety stock a facility may hold for a product. Both are in the product's quantity unit — the same unit as the reported safety stock. Leave a cell blank to leave that side unbounded.

  • minSafetyStock is a floor on top of the statistical requirement. When the quantity derived from demand variability falls below the floor, the facility stocks up to the floor. It does not change guaranteed service times.
  • maxSafetyStock is a hard cap on what the facility may hold. Stock it can no longer carry shifts to downstream facilities or to the customer node.
  • maxSafetyStock must not be less than minSafetyStock; violations are reported at import time.
  • If a cap is too tight to meet the customer maximum service times, that product is recorded as infeasible on the Errors sheet and the other products still produce results.

WARNING

The Flows sheet defines which nodes are connected. Any leg (Supplier → Facility, Facility → Facility, or Facility → Customer) must have a Flow row for that connection to be part of the optimized network.

The Data tab lists additional input tables (for example Transportation Policies and Sourcing Policies) because the schema is shared with Network Optimization, but they are not required for an inventory optimization run. For column-level details of each sheet, see the Excel File Format reference.

1. Create a Scenario

On the Data tab, click the New scenario (+) icon in the Scenario panel, enter a Scenario name, and click Create scenario. Each scenario holds its own input data and results, which is what makes the Comparison tab meaningful.

You can add a free-text description to a scenario, and delete scenarios with the Delete scenarios () icon.

2. Import Your Data

With your scenario selected, click Upload data in the Input Data panel, choose your .xlsx file, and click Import. A success message confirms the upload.

Once imported, the sheets appear under Tables in the left sidebar. Click any table to review its rows in a sortable, filterable grid.

If you get an error during upload

3. Configure and Run

Click Run to open the run dialog. There is nothing to configure at run time, so the dialog is a simple confirmation.

Click Run to start. The button shows Running with a spinner while the job executes, and a toast appears when it finishes: Check results on success, or View errors on failure.

TIP

Service level and maximum guaranteed service time are part of your input data, not run-time settings: set them per customer × product in the Customer Policies sheet. To try a different service level, edit that sheet (or use another scenario) and re-run.

You can select multiple scenarios and run them together in a single job.

If you get an error during optimization

4. Review Results

Open the Results tab. A summary strip at the top shows the Algorithm parameters and Run at timestamp used for the latest run.

  • Safety Stocks — the core output, one row per location × product, holding the full set of per-node metrics.
  • Errors — shown only when a run fails. Each row describes a per-product failure so you can fix the input and re-run.

Results grids are sortable, filterable, and paginated.

Safety Stocks columns

ColumnMeaning
location / productThe location and product the row describes
propagatedDemandMeanMean daily demand this node serves (summed over its downstream nodes)
propagatedDemandStdDevStandard deviation of that daily demand (summed in quadrature over downstream nodes)
processingTimeProcessing time in days, from Facility Processing Times
inboundGuaranteedServiceTimeInbound lead time guaranteed by upstream nodes, in days
guaranteedServiceTimeService time this node guarantees downstream, in days
netReplenishmentTimeNet replenishment time τ in days — the window safety stock has to cover
cycleStockCycle stock
safetyStockSafety stock
inTransitInventoryIn-transit inventory
serviceLevelTarget service level applied to this node

The three inventory components

A facility's average inventory splits into three parts, and cycleStock + safetyStock + inTransitInventory is its total inventory.

cycleStock is the average inventory a replenishment lot leaves behind. It comes from Inventory Policies.inventoryTurns (turns per period):

Q = propagatedDemandMean × period length in days ÷ inventoryTurns
cycleStock = Q ÷ 2

The ÷ 2 is the average as stock draws down from Q to zero over the cycle. It is blank for supplier and customer nodes, which have no Inventory Policies row and therefore no lot-size inventory.

WARNING

inventoryTurns is required for an inventory optimization import. Leaving it blank would put half a period's demand into cycle stock, so the import errors rather than standing a default in for a real decision.

safetyStock absorbs demand and lead time variability. The statistical requirement is the z-factor of serviceLevel × propagatedDemandStdDev × √netReplenishmentTime. Where you set a minSafetyStock on Inventory Policies, a facility whose statistical requirement falls below that floor reports the floor instead.

inTransitInventory is the stock sitting on the inbound lane: propagatedDemandMean multiplied by the inbound transit time, computed from the Paths distance and the transportation mode's speed. It therefore scales with demand as well as with distance. A node fed by several lanes uses the longest of them, and a node with no inbound lane reports zero.

TIP

cycleStock and inTransitInventory are not decision variables. Both are derived from your input data and reported so you can see how the optimized safety stock placement lands against a facility's total inventory.

5. Analyze a Scenario

The Analysis tab is a single-scenario deep dive. Select a Scenario and, once results exist, a Product; the graph and charts then focus on that product.

Supply chain network graph

An interactive node-edge diagram, laid out upstream → downstream, built from the selected product's Flows:

  • Suppliers (upstream), Facilities (with their subtype, e.g. "DC1 (DC)"), and Customers (downstream) are color-coded.
  • Click a node to focus it — its upstream and downstream are highlighted and unrelated nodes dim.
  • Pan and zoom to explore large networks.

Charts

  • Demand by facility — propagated demand mean per facility, with a standard-deviation error bar.
  • Supply capacity vs Demand by facility — demand against each facility's supply capacity, labelled with utilization.
  • Lead time breakdown by facility — a stacked bar of processing time, inbound guaranteed lead time, and net replenishment time (τ).
  • Inventory by facility — a stacked bar of cycle stock, safety stock, and in-transit inventory, so the full height is the facility's total inventory.
    • Cycle stock is the average inventory a replenishment lot leaves behind. It comes from Inventory Policies.inventoryTurns (turns per period): one replenishment covers Q = propagated daily demand × period length ÷ turns, and cycle stock is Q ÷ 2 — the average as stock draws down from Q to zero over the cycle. It is undefined for supplier and customer nodes, which have no Inventory Policies row.
    • In-transit inventory is the stock on the facility's inbound lane: the facility's propagated daily demand multiplied by the inbound transit time, which comes from the Paths distance and the transportation mode's speed. It therefore scales with demand as well as with distance. A facility fed by several lanes uses the longest of them. Root facilities have no inbound lane, so their in-transit inventory is zero.

A scenario optimized before in-transit inventory or cycle stock existed does not show those bands. When neither is present the chart is titled Safety stock by facility. Re-run the optimization to see them.

The per-node numbers behind these charts live in the Safety Stocks grid on the Results tab, where they are sortable and filterable.

TIP

The per-facility demand, lead-time, net-replenishment-time, and in-transit-inventory metrics are produced by the solver. If a scenario was optimized before these details were added, re-run the optimization to populate them. The Analysis tab tells you when this is the case.

6. Compare Scenarios

On the Comparison tab, select the scenarios to include with the checkboxes. The comparison uses each scenario's latest successful result.

  • Comparison tableTotal safety stock cost and Total safety stock quantity per scenario.
  • Bar charts — total safety stock cost and total safety stock quantity across scenarios.
  • Scenario map comparison — a map per selected scenario showing locations and flow lines, labeled by scenario name.

Comparing against today (ASIS)

To hold the optimized safety stock up against what you carry today, create a scenario for the as-is state, import its data as usual, then load your current safety stock through Upload ASIS data. The imported result behaves like any other result, so you can select it next to your optimized scenarios on the Comparison tab. See Importing ASIS Data.