Logistics

Supply chain resilience — vendor risk and single-source exposure

How procurement, ops, and supply chain teams use NTHMAP to assess vendor risk, monitor critical supply lanes, and plan for disruptions.

Global supply chains have more single points of failure than most companies realize until one of them breaks. A single port strike, hurricane, or geopolitical event can cascade through a manufacturer's production schedule within days.

NTHMAP gives supply chain teams the physical-world awareness to see those failures developing — or better, to plan around them in advance.

Identify your critical lanes

Step one in any supply chain resilience program is mapping your critical lanes. For a US consumer goods manufacturer importing from Asia, that might look like:

  • Shenzhen / Yantian → Los Angeles / Long Beach (container)
  • Shanghai → Oakland (container)
  • Chittagong → New York (container + bulk)
  • Mumbai → Houston (bulk + container)

For each lane, NTHMAP tells you the current state:

# Shenzhen outbound
nthmap vessels list --bbox 113.8,22.4,114.3,22.8 --types "Container Ship" --format json | jq length

# Los Angeles inbound
nthmap vessels list --bbox -118.4,33.6,-118.0,33.8 --types "Container Ship" --max-speed 1 --format json | jq length

Build a small dashboard with these numbers and watch for deviations from baseline.

Single-port risk

Many companies discover only during a crisis that 80% of a critical component passes through a single port. A simple NTHMAP analysis can surface this in advance.

For your suppliers, look up:

  1. Which port(s) they typically ship from
  2. NTHMAP's port infrastructure entry for each
  3. What else goes through that port (diversity or concentration?)
import nthmap

client = nthmap.Client(api_key="ntm_live_...")

# Example: your supplier ships from Shenzhen Yantian
yantian_vessels = client.vessels(
    bbox=[114.2, 22.6, 114.4, 22.8],
    types=["Container Ship"],
)
print(f"Typical Yantian outbound: {len(yantian_vessels)} container ships visible now")

# Check for active events affecting Yantian
yantian_events = client.events(bbox=[113.8, 22.4, 114.5, 22.9], active=True)
if yantian_events:
    print("ALERT: active events affecting Yantian:")
    for e in yantian_events:
        print(f"  - {e['event_type']} ({e['severity']}): {e['description']}")

If the alert triggers, you know to expect delays before your supplier does.

Chokepoint dependency mapping

Many supply chains run through one or more of the 8 strategic maritime chokepoints. Ask: if this chokepoint closed tomorrow, how much of our inbound is affected?

chokepoint_bbox = [54, 25, 58, 28]  # Hormuz

inbound = client.vessels(bbox=chokepoint_bbox)
relevant = [v for v in inbound if v["destination"] in YOUR_RECEIVING_PORT_CODES]
print(f"{len(relevant)} of your inbound vessels currently in Hormuz")

Repeat for each chokepoint your supply chain touches. This is a 10-minute exercise that most supply chain teams have never done because the data wasn't accessible.

Disruption playbook triggering

The classic supply chain problem: you have a disruption playbook for a major event, but by the time you realize the event is happening, you've lost 48 hours of reaction time.

NTHMAP lets you wire playbooks to trigger automatically:

#!/bin/bash
# /opt/supply-chain/monitor.sh

export NTHMAP_API_KEY=ntm_live_...

# Check Malacca status
MALACCA=$(nthmap chokepoints list --format json | \
  jq -r '.[] | select(.name == "Strait of Malacca") | .status')

if [ "$MALACCA" != "Normal" ]; then
  # Trigger playbook: notify alt-routing team, pull inbound forecast
  echo "Malacca status: $MALACCA" | mail -s "SC PLAYBOOK TRIGGERED: Malacca disruption" \
    sc-ops@firm.com

  # Fetch current inbound via Suez for comparison
  nthmap vessels list --bbox 31,29,34,33 --format json > /tmp/suez-snapshot.json
  cp /tmp/suez-snapshot.json s3://sc-ops/snapshots/$(date +%s).json
fi

This turns "we'll check on it tomorrow morning" into "we have the data on the wire by 8am EST".

Contingency routing analysis

Once a disruption fires, the next question is: what are our alternatives? For a container lane through Malacca, the alternatives are:

  1. Sunda Strait (through Indonesia, adds 500 nm)
  2. Lombok Strait (through Indonesia, adds 1000 nm)
  3. Around Australia (adds weeks — emergency only)

NTHMAP lets you compare current traffic on each:

for name in "Malacca:99,0,106,6" "Sunda:104,-7,107,-5" "Lombok:115,-9,117,-7"; do
  ROUTE=${name%:*}
  BBOX=${name#*:}
  COUNT=$(nthmap vessels list --bbox $BBOX --format json | jq length)
  echo "$ROUTE: $COUNT vessels"
done

You can see routing shifts in real time.

ESG / climate disclosure angle

For companies subject to climate disclosure requirements (CSRD, SEC climate rule, CDP), demonstrating supply chain resilience to climate events is increasingly mandatory.

NTHMAP events provide an auditable historical record of what weather/climate events affected your supply chain:

# Historical events in a specific region over a period (enterprise tier)
# - Currently only live events available; Enterprise adds 5-year history
nthmap events list --bbox -95,24,-85,30 --types hurricane

Enterprise customers can archive nightly snapshots of events, vessels, and flows to build their own historical dataset for disclosure reporting.

Integration with SAP, Oracle, etc.

NTHMAP data can feed into existing supply chain visibility platforms:

  • SAP Integrated Business Planning — add NTHMAP flow data as an input to demand/supply planning
  • Oracle SCM — port congestion as a lead-time multiplier
  • Blue Yonder / JDA — disruption alerts as a scenario input
  • project44 / FourKites — NTHMAP as a complementary source (their strength is first-mile visibility; NTHMAP is sea-leg visibility)

The CLI outputs clean JSON which maps into most ETL pipelines without further processing.

Getting started

Pick one supply lane. Just one. Build a daily automated snapshot of the inbound side using the CLI. Watch it for two weeks. You'll start noticing patterns — port delays, bunching, anchor waits — that affect your operations in ways you hadn't quantified before.

See the CLI docs and API reference for implementation details.