Voyage Performance
Voyage intelligence, one view.
A vessel that arrives three days late may have been below CP speed, or above CP speed but routed through bad weather, or held by a charterer-induced port delay — and the appropriate conversation is different in each case. The pipeline resolves the ambiguity before the dispute starts.
Three stages
Read CP terms → Filter to good-weather legs → Score deviation + claim probability- Read — Charter Party terms, noon-report stream (speed, FOC, weather), AIS position, Stormglass/NAVTOR weather feed.
- Filter — separate good-weather legs from bad-weather and instructed slow-steaming legs. CP warranted performance only applies to the good-weather subset.
- Score — speed deviation, FOC deviation, ETA vs laycan, claim probability composite.
Charter Party compliance — the central question
Most voyage analysis questions reduce to: “is the vessel performing within Charter Party?” The CP defines a good-weather envelope and a warranted speed-and-consumption profile within it:
GOOD WEATHER ENVELOPE (typical CP) Wind: Beaufort ≤ 4 Sea: Douglas sea state ≤ 3 Current: ≤ ±0.5 knot Swell: ≤ 2 m
WARRANTED PERFORMANCE (within envelope) Speed: 14.0 kn laden / 14.5 kn ballast FOC at sea: 28.5 MT/day VLSFO FOC in port: 3.2 MT/day MGODeviation against the CP-warranted values:
ΔV = V_actual − V_CPΔFOC = FOC_actual − FOC_CPA negative speed deviation under good weather with a positive consumption deviation is the textbook underperformance pattern that drives owner-vs-charterer disputes. A negative speed deviation in bad weather isn’t a CP issue — the warranted speed doesn’t apply.
Worked example — MV POSUN
Voyage: Singapore to Rotterdam, 21 days at sea, laden.
| Leg type | Days | Avg speed | Avg FOC | Notes |
|---|---|---|---|---|
| Good weather | 14 | 13.2 kn | 30.6 MT | Below CP (14.0 kn / 28.5 MT) |
| Bad weather | 5 | 11.4 kn | 32.8 MT | Excluded from CP calculation |
| Slow-steaming (instructed) | 2 | 11.0 kn | 27.4 MT | Excluded |
Filtered to good-weather legs only:
| Metric | Value |
|---|---|
| Good-weather coverage | 67% |
| Mean speed deviation | −0.8 kn |
| Mean FOC deviation | +2.1 MT/day |
Verdict: sustained underperformance under good weather — claim probability HIGH.
Pipeline actions:
- Generates a CP-claim brief with per-leg numbers, weather classification, and deviation maths.
- Routes to Commercial Operator (claim handling) and Technical Superintendent (root cause — fouled hull? Engine?).
- Cross-references ME performance for engine condition signals and fuel oil for fuel-quality signals.
Under the hood
Good-weather filtering — implementation
def good_weather_legs(legs, cp_envelope): """Filter legs to those within CP good-weather definition.""" out = [] for leg in legs: if leg["wind_bf"] > cp_envelope["wind_max"]: continue if leg["sea_ds"] > cp_envelope["sea_max"]: continue if abs(leg["current_kn"]) > cp_envelope["current_max"]: continue if leg["swell_m"] > cp_envelope["swell_max"]: continue out.append(leg) return out
def cp_performance(good_legs, cp): """Mean deviation of speed and FOC under good-weather conditions.""" if not good_legs: return {"verdict": "Insufficient good-weather data", "coverage": 0.0} n = len(good_legs) delta_v = sum(leg["speed_kn"] - cp["warranted_speed"] for leg in good_legs) / n delta_foc = sum(leg["foc_mt"] - cp["warranted_foc"] for leg in good_legs) / n return {"delta_v": delta_v, "delta_foc": delta_foc, "coverage": n / len(legs)}Coverage matters. A voyage with only 10% good-weather legs has too small a sample to support a CP claim either way — the pipeline reports coverage alongside the deviation.
ETA vs laycan tracking
| Metric | Calculation |
|---|---|
| Projected ETA | Current position + remaining distance / projected speed |
| Time to laycan start | laycan_start − ETA |
| Time to laycan end | laycan_end − ETA |
| Condition | Verdict |
|---|---|
| ETA before laycan start with margin | Early — risk of demurrage if charterer not ready |
| ETA inside laycan | On-window |
| ETA after laycan end | Late — penalty exposure |
The pipeline updates ETA every noon report — a TSI sees drift as it happens, not at port-call time.
Claim probability composite
P_claim = w1 × mean(|ΔV|) + w2 × mean(|ΔFOC|) + w3 × (1 − coverage_good_wx)The third term protects against weak claims. Low good-weather coverage means insufficient data to support the deviation either way — the score reflects that.
| P_claim band | Action |
|---|---|
| Low | Routine — log and continue |
| Medium | Owner brief — document for next charter |
| High | Active claim or counter-claim risk — engage commercial |
| Critical | Significant exposure — legal advisory |
Slow-steaming and weather routing
Slow-steaming — a vessel deliberately running below CP speed for fuel saving looks like underperformance unless the CP allows it. The pipeline checks CP terms and master’s voyage instructions; if both agree, the leg is excluded from the deviation calculation.
Bad-weather routing — when a master chose a longer route to avoid weather, the voyage shows as longer at lower average speed. The pipeline cross-references FOC over the routed leg vs the rhumb-line projection — sometimes the longer route is the lower-cost option even though it looks slower on speed alone.
Data sources
| Data | Source | Cadence |
|---|---|---|
| Position | AIS + noon report | Continuous + daily |
| Speed | Noon report | Daily noon-to-noon |
| FOC by grade | Noon report | Daily |
| Weather | Noon report + Stormglass + NAVTOR | Daily |
| Routing analysis | NAVTOR | Per voyage |
| Charter Party terms | CP file in vessel records | Per charter |
| ETA vs laycan | Voyage plan in ERP | Continuous |
The CP file is re-read on every analysis run — changes mid-voyage are reflected immediately.
Escalation triggers
| Trigger | Severity |
|---|---|
| Speed deficit > 5% under good weather, sustained 3+ legs | HIGH |
| Consumption excess > 5% under good weather, sustained 3+ legs | HIGH |
| ETA threatening laycan end | HIGH |
| Claim probability HIGH or CRITICAL | CRITICAL |
| Pattern across 3+ consecutive voyages | CRITICAL |
| Weather routing adding > 10% to passage time | per case |