NEW: The Decision Factory — a novel about decisions under uncertainty. Get it on Amazon
Decision Science · · Adam DeJans Jr.

Vendor Outages Belong Outside the Planning Engine

How to model supplier shutdowns, capacity interruptions, and temporary buying restrictions without burying fragile business logic inside the optimization core.

supply-chaindecision-scienceplanning-systemsvendor-managementoptimization

Vendor Outages Belong Outside the Planning Engine

A vendor outage looks like a simple planning exception until someone tries to implement it.

A supplier is closed for two weeks. A factory line is down. A port disruption makes the normal lead time unusable. A vendor can receive orders but cannot ship a specific family of SKUs. The business asks the planning system to “just account for the outage.” Engineering adds an override. The planner gets a button. The optimization model receives another constraint. Everyone moves on.

That is how planning systems slowly become impossible to reason about.

The issue is not that vendor outages are unimportant. They are absolutely important. The issue is that temporary operational facts should not be hard-coded into the mathematical engine unless they are truly part of the enduring decision model. A vendor outage is usually a calendar, eligibility, availability, or state problem. It should be expressed through clean upstream inputs and policy rules, not as a pile of special cases inside the optimizer.

Start with the decision

The first question is not “how do we add an outage override?” The first question is: what decision changes because of the outage?

For a buying system, the relevant decisions may include whether to place a purchase order, how much to buy, when the order should arrive, which vendor to source from, which products to prioritize under limited capacity, whether to pull demand forward before the outage, and whether to transfer inventory from another node instead of buying. These are different decisions. They do not require the same implementation.

A shutdown that prevents new purchase orders is different from a shutdown that prevents shipment. A shipment outage is different from a production outage. A vendor that can ship existing purchase orders but cannot accept new ones is different from a vendor that can accept orders but has unreliable future capacity. Treating all of these as the same boolean flag is the beginning of the mess.

A clean framing separates the problem into four pieces: the current state, the controllable decision, the uncertain future, and the transition logic. The vendor outage belongs in the state and transition logic. It should influence which actions are feasible and how those actions unfold over time. It should not become a mysterious side door that rewrites the optimization model after the fact.

The wrong implementation

The bad implementation is usually recognizable. Somewhere inside the planning engine, code checks whether a vendor is on an outage list. If yes, it mutates the planning horizon, blocks certain orders, changes lead times, clips quantities, or forces a manual value. A few weeks later, another outage behaves slightly differently, so another conditional branch appears. Eventually nobody knows whether the model is optimizing the business policy or navigating a graveyard of historical exceptions.

This approach creates three problems.

First, it mixes business process with mathematical logic. The optimizer should solve a decision problem. It should not be the authoritative source of vendor calendars, outage definitions, emergency rules, and operational escalation logic.

Second, it makes testing nearly impossible. A temporary outage may only apply to one vendor, one product group, one region, and one date range. If the logic lives inside the engine, every outage introduces a new branch of behavior that needs regression tests against the whole planning system.

Third, it makes expiration fragile. Temporary logic has a way of becoming permanent. The outage ends, but the override stays. Or the override technically expires, but a planner learns to rely on a field that was supposed to be temporary. Six months later the system is optimizing around ghosts.

The cleaner design

A vendor outage should usually be represented as structured input to the planning policy. The engine should consume a normal, well-defined representation of availability rather than hosting custom outage logic.

At minimum, the outage representation should answer these questions:

  • Which vendor, facility, lane, SKU group, or product is affected?
  • Which dates are affected?
  • Which action is restricted: order placement, production, shipment, receipt, appointment scheduling, or all of the above?
  • Is the restriction hard or soft?
  • Is there known residual capacity?
  • Are existing orders affected?
  • Is the lead time distribution changed or is the action infeasible?
  • Who owns the entry and when does it expire?

Once this information exists upstream, the planning engine can stay generic. It can read order calendars, vendor eligibility, capacity windows, lead time distributions, and receiving constraints the same way it always does. The outage becomes data that modifies the state of the world, not code that changes the meaning of the model.

A practical policy structure

Suppose the planning system decides weekly purchase quantities for vendor-product pairs. A simple policy might include decisions such as:

[ x_{v,i,t} = \text{units ordered from vendor } v \text{ for item } i \text{ in week } t ]

The outage should not require a new decision variable. It should modify feasibility and transition behavior. For example, an order placement outage may create:

[ x_{v,i,t} = 0 \quad \text{for affected } (v,i,t) ]

A shipping outage may instead allow the order to be placed but delay receipts:

[ \text{receipt}{i,t+L} = x{v,i,t} ]

where the lead time (L) changes because the vendor cannot ship during the outage window. A partial-capacity outage may use a capacity constraint:

[ \sum_i x_{v,i,t} \leq C_{v,t} ]

where (C_{v,t}) is a calendar-driven capacity value.

These are not exotic constraints. The point is to make the outage flow through the same modeling language as every other operational restriction. Do not create a separate universe called “outage logic.”

Uncertainty matters

A vendor outage is rarely perfectly known. The start date may be clear, but the recovery date may be uncertain. The vendor may claim capacity will return next week, but historical recovery behavior says otherwise. A port may reopen, but congestion may persist. A factory may restart, but yield may be poor for the first few runs.

That uncertainty should be explicit. Instead of representing an outage as a single deterministic interval, planners should consider scenarios such as on-time recovery, delayed recovery, partial recovery, and relapse. The output should not be one magical answer. It should show the economic consequences of acting under each recovery assumption.

This is where many teams get the framing wrong. They ask, “what is the forecasted recovery date?” That is a forecasting question. The decision question is, “what should we do now given the distribution of possible recovery dates?”

For example, pulling forward inventory before an outage may look wasteful under the optimistic recovery scenario and highly profitable under the delayed recovery scenario. The right action depends on margin, lost-sales exposure, storage cost, cash constraints, substitution, and how much the business values resilience. The date itself is not the decision.

Metrics that matter

Do not evaluate outage handling by whether the system “accepted the override.” That is a software metric, not a business metric.

Better metrics include expected lost margin avoided, incremental inventory created, aged inventory risk, order churn, expedite cost, planner override rate, number of affected purchase orders, projected service loss, and recovery time after the outage ends. You should also track how often outage rules expire correctly and how often expired rules still influence planning behavior.

A mature system also tracks decision deltas. If the outage input changes the recommendation from 1,000 units to 1,800 units, that difference should be explainable. Which constraint bound? Which product group? Which future week? Which risk scenario? If nobody can explain the delta, the outage design is not trustworthy.

Implementation notes

Build outages as a managed operational object. It should have an owner, scope, start date, end date, affected actions, severity, confidence, source, approval status, and expiration rule. It should be versioned. The planning run should record which outage records were active when recommendations were generated.

Do not make the optimizer call a random operational table with loose semantics. Normalize the outage data into planning primitives before optimization. That means order calendar, receiving calendar, vendor eligibility, lead-time distribution, capacity profile, and existing order status. The optimizer should consume the normalized primitives, not the messy operational truth directly.

Keep manual overrides separate from outage records. A planner may manually change an order because of an outage, but that override is not the outage itself. The outage is state information. The override is a human decision. Conflating the two destroys learning.

Common failure modes

The most common failure mode is treating the outage as a global vendor blackout when the real restriction is narrower. A vendor may only have a plant outage for one product family. Blocking every item from that vendor may create unnecessary shortages.

The opposite failure mode is making the outage too narrow. Teams encode it at SKU level because that is where orders exist, but the real capacity issue is shared across a vendor, line, or material group. The model then recommends orders that are individually feasible but collectively impossible.

Another failure mode is ignoring open orders. If purchase orders were placed before the outage, they may or may not still ship. The planning system must distinguish new order feasibility from existing order reliability.

The final failure mode is failing to remove the logic. Every temporary rule needs an expiration path. If a business user wants the rule to persist, force them to create a durable planning policy rather than quietly extending an emergency patch forever.

What to do in practice

When a vendor outage appears, resist the instinct to patch the optimizer. Define the affected operational action first. Translate the outage into normal planning inputs. Run the policy under a few recovery scenarios. Show the economic tradeoff. Record which decision changed and why.

The planning engine should be boring here. It should receive a changed state of the world and solve the same type of decision problem it always solves. The outage process can be messy. The model interface should not be.

That is the practical standard. Temporary operational disruption should change the inputs, not corrupt the engine.