Skip to content

Fuel Oil Analysis

Every fuel-borne risk, scored.

A vessel running 35 tonnes of HSFO a day is also running every gram of sulphur, every milligram of cat fines, every drop of water that came with the fuel. The lab report arrives 5–7 days after the fuel is in the tank — by then half of it is already in the engine. This pipeline turns bunker data, lab results, and ROB position into a TSI-grade view of what’s about to happen, not what already did.

cat finessulphur complianceROB planningconsumption variancestem timing

Three passes

Per-bunker quality → Tank distribution & ROB → Consumption variance

Each pass produces its own verdict; the three compose into the senior-review disposition.

Where the data comes from

StreamSourceWhat it tells us
Bunker analysisBDN + independent lab reportPer-bunker quality: viscosity, density, sulphur, cat fines, water, sediment
Tank ROBLatest noon report (12:00 UTC)Current quantity per grade, per tank
Daily consumptionNoon-report streamBurn rate per grade, normalised to engine load and weather
Stem scheduleBunker plan in ERPNext bunker port, supplier, expected quantity
Vessel ECA exposureVoyage planWhether the next leg is in an Emission Control Area

Labs used: Bureau Veritas / VeriFuel, VPS, Maritec, Tribocare, Viswa Lab, FOBAS. Results arrive by email after the bunker is sampled at delivery; the pipeline parses each lab report and reconciles against the BDN.

Bureau Veritas / VeriFuelVPS — Veritas Petroleum ServicesMaritecTribocareViswa LabFOBAS

Fuel grades tracked: HSFO, VLSFO, ULSFO, MDO, LSMGO, LNG.

The thresholds

Cat fines (Aluminium + Silicon)

Cat fines are catalyst fines from the refining process — silicon and aluminium oxides hard enough to score liners, rings, and fuel pumps. ISO 8217 caps them at 60 mg/kg in the delivered bunker. Engine makers want 15 mg/kg or below at the engine inlet; fuel treatment can reduce 60 → 15 only if centrifuges are working perfectly.

ThresholdStatusAction
≤ 15 mg/kgSafeRoutine
15–60 mg/kgRiskyConfirm centrifuge effectiveness, monitor closely
> 60 mg/kgCriticalDebunkering candidate — engine-damage risk
Sulphur — BDN vs lab

ISO 8217 sulphur caps: 0.50% m/m globally, 0.10% m/m in ECAs. Two checks run in parallel:

  1. BDN compliance — the supplier’s declared sulphur must be at or below the operating cap.
  2. Lab confirmation — the independent test must confirm the BDN within tolerance.
Discrepancy % = |S_lab − S_BDN| / S_BDN × 100

Above 5% triggers a supplier dispute flag.

Viscosity, density, water, sediment

Viscosity (cSt at 50 °C) and density (kg/m³ at 15 °C) determine whether the engine’s fuel system can handle the fuel. Too viscous and the heater can’t drop it to injection viscosity; too dense and centrifuge separation efficiency falls. Water above 0.5% v/v is corrosive; sediment above 0.10% m/m clogs filters and erodes pumps.

ROB safety reserve
Days of fuel = ROB / C_daily
Days remainingTier
< 7 with no stem arrangedCRITICAL
7–14 with stem more than 7 days outHIGH
14–30 — routine planningMEDIUM
> 30OK

Per-bunker disposition

DispositionTrigger
AcceptAll parameters Safe
MonitorOne or more Risky, none Critical
BlendRisky on cat fines or sulphur where mixing with cleaner stock can dilute below threshold
DebunkerAny Critical, especially cat fines > 60 mg/kg
DisputeBDN-vs-lab sulphur discrepancy above 5%

Bunker planning formula

Bunker intake (to 85%) = (0.85 × V_capacity) − V_current

A tank already above 85% gets flagged for ullage check rather than further loading. Aggregated across grade gives the recommended quantity for the next bunker call.

Consumption variance

Variance % = (C_actual − C_design) / C_design × 100

Sustained variance over 10% is flagged. Combined with the main engine SFOC analysis, the analyzer can usually distinguish a fuel-quality cause (consumption + cat fines) from an engine-condition cause (consumption + cylinder asymmetry).

Worked example — bad bunker on MV POSUN

POSUN took on 480 tonnes of VLSFO at Singapore on 2026-04-12. The lab report arrives on 2026-04-19, mid-passage to the Suez Canal — already burning the fuel.

ParameterBDNLabVerdict
Cat fines (Al+Si)24 mg/kg74 mg/kgCritical
Sulphur (% m/m)0.420.46Compliant, within discrepancy tolerance
Viscosity (cSt @ 50 °C)380385Within engine spec
Water (% v/v)0.300.35Within tolerance

Verdict: Critical — cat fines 14× above the 15 mg/kg engine-inlet target and 23% above the 60 mg/kg ISO cap.

The pipeline tags escalation_required: true, routes the case to the Technical Superintendent and Commercial Operator, and generates three options:

  1. Debunker at next port — cleanest, supplier dispute follows. Est. USD 30–50k port costs + supplier credit recovery.
  2. Blend with clean VLSFO at 1:3 ratio — reduces engine-inlet exposure to ~18 mg/kg with reliable centrifuge operation. Requires 1,440 tonnes of clean stock at next port.
  3. Run with maximum centrifuge cleaning + frequent fuel-system inspection — operational risk highest, cost lowest. Not recommended.

Under the hood

Cat-fines fleet split — implementation sketch
risky_threshold = 15 # mg/kg
risky_df = df[df["aluminium+Silicon"] > risky_threshold]
safe_df = df[df["aluminium+Silicon"] <= risky_threshold]
fig.add_trace(go.Scatter(name="Safe CatFine Level", x=safe_df.imo,
y=safe_df["aluminium+Silicon"], mode="markers"))
fig.add_trace(go.Scatter(name="Risky CatFine Level", x=risky_df.imo,
y=risky_df["aluminium+Silicon"], mode="markers",
marker=dict(color="red")))
fig.add_trace(go.Scatter(y=[15] * len(totaldf),
mode="lines", line=dict(color="red", dash="dot")))
BDN-vs-lab sulphur compliance check
def evaluate_sulfur(row,
bdn_sulfur_unit: str = "% m/m",
sulfur_unit: str = "% m/m"):
if row["sulfur"] is None or row["bdnSulfur"] is None:
return "No Data"
discrepancy = abs(row["sulfur"] - row["bdnSulfur"]) / row["bdnSulfur"] * 100
if discrepancy > 5:
return "Dispute"
if row["sulfur"] > REGULATORY_CAP[row["zone"]]:
return "Non-compliant"
return "Compliant"
ROB aggregation — noon report only, from 715k records
json_rob = list(common_consumption.aggregate([
{"$match": {"IMO No": {"$in": active_imos}}},
{"$addFields": {"reportTime":
{"$dateToString": {"format": "%H:%M:%S", "date": "$Report Date"}}}},
{"$match": {"reportTime": "12:00:00"}}, # noon report only
{"$sort": {"IMO No": 1, "Report Date": -1}},
{"$group": {"_id": "$IMO No", "latestRecord": {"$first": "$$ROOT"}}},
{"$replaceRoot": {"newRoot": "$latestRecord"}},
]))
# 715K records → one record per active vessel
Escalation triggers

The pipeline routes to the Technical Superintendent and the Commercial Operator simultaneously when fuel quality fails — fuel disputes are technical and commercial in equal measure.

TriggerSeverityOwner
Cat fines above 60 mg/kgCRITICALTSI + Commercial
Quality issues requiring debunkeringCRITICALTSI + Commercial
ROB critical with no stem arranged (under 7 days)CRITICALTSI + Commercial
Sustained consumption variance above 10%HIGHTSI
Sulphur breach in ECACRITICALTSI + Commercial + Master
BDN-vs-lab sulphur discrepancy above 5%HIGHCommercial

Why this pipeline exists

A vessel without this pipeline finds out about a bad bunker when the engineers complain about filter blockages — usually two weeks after loading, with several hundred running hours already on the engine. With the pipeline, the lab report and BDN are reconciled within hours of arrival, the disposition decision is auto-routed, and the cost of doing nothing is calculated against the cost of acting.