Skip to content

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.

Charter Party compliancegood-weather filterETA vs laycanclaim probabilityAIS positionweather routing

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.
AISStormglassNAVTOR

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 MGO

Deviation against the CP-warranted values:

ΔV = V_actual − V_CP
ΔFOC = FOC_actual − FOC_CP

A 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 typeDaysAvg speedAvg FOCNotes
Good weather1413.2 kn30.6 MTBelow CP (14.0 kn / 28.5 MT)
Bad weather511.4 kn32.8 MTExcluded from CP calculation
Slow-steaming (instructed)211.0 kn27.4 MTExcluded

Filtered to good-weather legs only:

MetricValue
Good-weather coverage67%
Mean speed deviation−0.8 kn
Mean FOC deviation+2.1 MT/day

Verdict: sustained underperformance under good weather — claim probability HIGH.

Pipeline actions:

  1. Generates a CP-claim brief with per-leg numbers, weather classification, and deviation maths.
  2. Routes to Commercial Operator (claim handling) and Technical Superintendent (root cause — fouled hull? Engine?).
  3. 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
MetricCalculation
Projected ETACurrent position + remaining distance / projected speed
Time to laycan startlaycan_start − ETA
Time to laycan endlaycan_end − ETA
ConditionVerdict
ETA before laycan start with marginEarly — risk of demurrage if charterer not ready
ETA inside laycanOn-window
ETA after laycan endLate — 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 bandAction
LowRoutine — log and continue
MediumOwner brief — document for next charter
HighActive claim or counter-claim risk — engage commercial
CriticalSignificant 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
DataSourceCadence
PositionAIS + noon reportContinuous + daily
SpeedNoon reportDaily noon-to-noon
FOC by gradeNoon reportDaily
WeatherNoon report + Stormglass + NAVTORDaily
Routing analysisNAVTORPer voyage
Charter Party termsCP file in vessel recordsPer charter
ETA vs laycanVoyage plan in ERPContinuous

The CP file is re-read on every analysis run — changes mid-voyage are reflected immediately.

Escalation triggers
TriggerSeverity
Speed deficit > 5% under good weather, sustained 3+ legsHIGH
Consumption excess > 5% under good weather, sustained 3+ legsHIGH
ETA threatening laycan endHIGH
Claim probability HIGH or CRITICALCRITICAL
Pattern across 3+ consecutive voyagesCRITICAL
Weather routing adding > 10% to passage timeper case