Shipping companies, port operators, and maritime software vendors face a compliance burden that dwarfs almost every other industry: IMO DCS annual fuel submissions, MARPOL CII ratings, ISM Code safety audits, ISPS security assessments, MLC 2006 crew records, and Port State Control inspections — all on different calendars, all with vessel detention or flag state action as the downside.
This is the n8n guide for Maritime SaaS vendors: companies building software for ship operators, fleet managers, port authorities, and maritime compliance teams.
Store: All 15 production-ready n8n workflow templates are available at stripeai.gumroad.com
Why Cloud iPaaS Creates Unique Risks in Maritime Ops
ISPS Code Section 9.4 requires ship security plans to control access to sensitive security information. Routing vessel position data, crew manifests, or port call schedules through Zapier's cloud means that information leaves your network — a potential breach of the Ship Security Plan.
IMO DCS (MARPOL Annex VI Reg. 22A) requires fuel consumption records to be submitted annually and retained for 3 years. Zapier's 30-day log retention means records disappear before any flag state audit.
MLC 2006 Standard A2.2 requires wage accounts and rest hour records to be held securely. Crew personal data processed by third-party automation tools creates GDPR exposure for EU-flagged vessels.
n8n on your VPC closes all three: vessel data never leaves your infrastructure, permanent audit log for IMO DCS, crew PII stays in your network.
Workflow 1: New Maritime Customer Regulatory Onboarding Drip
Target: SaaS vendors selling to ship operators, fleet managers, port authorities, or classification society clients.
The problem: A VLCC operator needs MARPOL CII + IMO DCS onboarding. A cruise line needs MLC 2006 + ISPS. A bulk carrier needs ISM Code + Port State Control prep. A one-size drip onboards nobody correctly.
{
"name": "Maritime Customer Regulatory Onboarding Drip",
"nodes": [
{
"name": "Google Sheets Trigger",
"type": "n8n-nodes-base.googleSheetsTrigger",
"parameters": {
"sheetId": "YOUR_SHEET_ID",
"triggerOn": "rowAdded"
}
},
{
"name": "Classify Tier and Compliance Flags",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const row = $input.first().json;\nconst fleet = parseInt(row.fleet_size || 0);\nconst seg = row.vessel_type || '';\n\nlet tier = 'SINGLE_VESSEL_OPERATOR';\nif (fleet >= 50 || seg.includes('MAJOR_CARRIER')) tier = 'MAJOR_CARRIER';\nelse if (fleet >= 15) tier = 'REGIONAL_CARRIER';\nelse if (fleet >= 3) tier = 'SMB_OPERATOR';\n\nconst flags = {\n IMO_DCS_REQUIRED: row.imo_dcs === 'yes' || fleet > 0,\n MARPOL_APPLICABLE: row.marpol_annex_vi === 'yes',\n CII_RATING_REQUIRED: parseInt(row.vessel_gt || 0) >= 5000,\n ISM_CODE_REQUIRED: row.ism_code === 'yes',\n ISPS_CERTIFIED: row.isps_code === 'yes',\n MLC_2006_APPLICABLE: row.mlc_2006 === 'yes',\n EU_MRV_APPLICABLE: row.eu_mrv === 'yes',\n GDPR_CREW_DATA: row.eu_flag === 'yes' || row.eu_crew === 'yes'\n};\nreturn [{ json: { ...row, tier, complianceFlags: flags, enrichedAt: new Date().toISOString() } }];"
}
},
{
"name": "Day 0 Welcome Email",
"type": "n8n-nodes-base.gmail",
"parameters": {
"subject": "Welcome to FlowKit \u2014 your maritime compliance workspace is ready",
"message": "Hi {{ $json.contact_name }},\n\nYour FlowKit account is configured for: {{ Object.entries($json.complianceFlags).filter(([k,v]) => v).map(([k]) => k).join(', ') || 'Standard' }}.\n\n{{ $json.complianceFlags.IMO_DCS_REQUIRED ? 'IMO DCS: Annual fuel submission workflow pre-configured for MARPOL Annex VI Reg. 22A.' : '' }}\n{{ $json.complianceFlags.CII_RATING_REQUIRED ? 'CII: Carbon Intensity Indicator monitoring workflow active for vessels >= 5,000 GT.' : '' }}\n{{ $json.complianceFlags.ISM_CODE_REQUIRED ? 'ISM Code: Safety management audit calendar loaded per SOLAS Chapter IX.' : '' }}\n\nYour compliance deadline calendar is pre-loaded. Next: configure your vessel endpoint list."
}
},
{
"name": "Slack CSM",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#cs-maritime",
"text": "New maritime customer: {{ $json.company_name }} ({{ $json.tier }}, {{ $json.fleet_size }} vessels)\nFlags: {{ JSON.stringify($json.complianceFlags) }}\nAssign CSM within 24h."
}
},
{
"name": "Wait 3 Days",
"type": "n8n-nodes-base.wait",
"parameters": {
"unit": "days",
"amount": 3
}
},
{
"name": "Day 3 Endpoint Setup",
"type": "n8n-nodes-base.gmail",
"parameters": {
"subject": "FlowKit Day 3: Connect your AIS and fleet data endpoints",
"message": "Quick check \u2014 have you connected your first vessel AIS endpoint? Here is the configuration guide for {{ $json.tier }} operators."
}
},
{
"name": "Wait 4 Days",
"type": "n8n-nodes-base.wait",
"parameters": {
"unit": "days",
"amount": 4
}
},
{
"name": "Day 7 Compliance Calendar",
"type": "n8n-nodes-base.gmail",
"parameters": {
"subject": "FlowKit Day 7: review your pre-loaded compliance calendar",
"message": "Your IMO/MARPOL/ISM/MLC deadline calendar is pre-loaded with {{ $json.fleet_size }} vessels. Book your compliance config call to review and adjust due dates."
}
},
{
"name": "Sheets Audit Log",
"type": "n8n-nodes-base.googleSheets",
"parameters": {
"operation": "append",
"sheetId": "YOUR_AUDIT_SHEET",
"values": [
[
"={{ $json.customer_id }}",
"={{ $json.tier }}",
"DAY_7_SENT",
"={{ $now }}"
]
]
}
}
]
}
ISPS angle: The Day 0 email confirms no vessel position or security plan data left your VPC — that confirmation is part of your ISPS compliance record.
Workflow 2: Vessel AIS & System Health Monitor
Target: Fleet management SaaS, vessel tracking platforms, maritime safety compliance tools.
The problem: SOLAS Chapter V Reg. 19 requires AIS to remain operational at all times underway. ISM Code §7 requires companies to have procedures to respond to accidents and emergencies. An AIS or ECDIS data gap is not just an ops problem — it is a SOLAS finding during Port State Control.
{
"name": "Vessel AIS and System Health Monitor",
"nodes": [
{
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": {
"interval": [
{
"field": "minutes",
"minutesInterval": 5
}
]
}
}
},
{
"name": "Load Vessel Endpoint List",
"type": "n8n-nodes-base.googleSheets",
"parameters": {
"operation": "read",
"sheetId": "YOUR_VESSEL_SHEET"
}
},
{
"name": "Poll Each Vessel API",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{ $json.health_endpoint }}",
"continueOnFail": true,
"timeout": 15000
}
},
{
"name": "Classify Status",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const items = $input.all();\nreturn items.map(item => {\n const vessel = item.json;\n const statusCode = vessel.statusCode || 0;\n const aisAge = vessel.ais_last_update_seconds || 0;\n const latency = vessel.responseTime || 99999;\n\n let status = 'OK', regulatory_note = '';\n if (statusCode !== 200) {\n status = 'DOWN';\n regulatory_note = 'SOLAS V/19 \u2014 AIS must be operational at all times underway. ISM Code \u00a77 SMS incident trigger.';\n } else if (aisAge > 600) {\n status = 'STALE_DATA';\n regulatory_note = 'SOLAS V/19.2.4 \u2014 AIS data gap. IMO DCS fuel log gap risk. PSC may cite ISM Code \u00a73.3.';\n } else if (latency > 8000) {\n status = 'DEGRADED';\n regulatory_note = 'ISM Code \u00a710 maintenance SLA \u2014 ECDIS/AIS degraded response, schedule maintenance.';\n }\n\n const prevStates = $getWorkflowStaticData('global');\n const key = `vessel_${vessel.imo_number}`;\n const now = Date.now();\n const lastAlert = prevStates[key] || 0;\n const shouldAlert = status !== 'OK' && (now - lastAlert) > 30 * 60 * 1000;\n if (shouldAlert) prevStates[key] = now;\n\n return { json: { ...vessel, status, regulatory_note, shouldAlert } };\n}).filter(i => i.json.shouldAlert);"
}
},
{
"name": "Slack #fleet-ops",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#fleet-ops",
"text": ":ship: *{{ $json.vessel_name }}* (IMO {{ $json.imo_number }}) \u2014 `{{ $json.status }}`\n{{ $json.regulatory_note }}\nEndpoint: `{{ $json.health_endpoint }}`"
}
},
{
"name": "Postgres Incident Log",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "INSERT INTO vessel_incidents (imo_number, vessel_name, status, regulatory_note, detected_at) VALUES ('{{ $json.imo_number }}', '{{ $json.vessel_name }}', '{{ $json.status }}', '{{ $json.regulatory_note }}', NOW()) ON CONFLICT DO NOTHING"
}
}
]
}
PSC angle: Every AIS downtime event is logged with its regulatory citation. When a Port State Control inspector asks for your ISM Code §7 incident records, you have a timestamped Postgres log.
Workflow 3: IMO/MARPOL/ISM/ISPS/MLC/STCW Compliance Deadline Tracker
Target: Maritime compliance SaaS, fleet management platforms, classification society tools.
The problem: IMO DCS annual submission late = MARPOL Annex VI deficiency. ISM Code external audit overdue = ISM Certificate lapse = vessel detained. STCW certificate expired = illegal crew watchkeeping. All on different cycles, all with severe consequences.
{
"name": "Maritime Compliance Deadline Tracker",
"nodes": [
{
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 8 * * 1-5"
}
]
}
}
},
{
"name": "Load Deadlines Sheet",
"type": "n8n-nodes-base.googleSheets",
"parameters": {
"operation": "read",
"sheetId": "YOUR_COMPLIANCE_SHEET"
}
},
{
"name": "Classify Urgency",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const items = $input.all();\nconst today = new Date();\nconst actionMap = {\n IMO_DCS_ANNUAL_SUBMISSION: { action: 'Submit fuel oil consumption data to flag state via IMO GISIS', reg: 'MARPOL Annex VI Reg. 22A', penalty: 'Flag state deficiency + PSC detention risk' },\n MARPOL_ANNEX_VI_CII_REPORT: { action: 'Submit Carbon Intensity Indicator annual report', reg: 'MARPOL Annex VI Reg. 28 (IMO MEPC 76)', penalty: 'CII rating downgrade to D/E \u2014 enhanced review required' },\n MARPOL_ANNEX_VI_EEXI_VERIFICATION: { action: 'Obtain EEXI Technical File from classification society', reg: 'MARPOL Annex VI Reg. 23 (vessels >= 400 GT)', penalty: 'IACS deficiency \u2014 vessel cannot trade' },\n ISM_CODE_INTERNAL_AUDIT: { action: 'Complete ISM Code internal SMS audit', reg: 'ISM Code \u00a712 \u2014 annual internal audit', penalty: 'ISM Document of Compliance suspension' },\n ISM_CODE_EXTERNAL_AUDIT: { action: 'Schedule ISM Code external audit with classification society', reg: 'ISM Code \u00a713 \u2014 5-year external audit cycle', penalty: 'SMC/DOC lapse \u2014 vessel detained by PSC' },\n ISPS_CODE_SHIP_SECURITY_AUDIT: { action: 'Complete ISPS ship security assessment review', reg: 'ISPS Code Part A \u00a79', penalty: 'ISSC lapse \u2014 denied port entry' },\n MLC_2006_MLC_INSPECTION: { action: 'Schedule MLC 2006 flag state inspection', reg: 'MLC 2006 Standard A5.1.3 \u2014 5-year cycle', penalty: 'DMLC/MLC Certificate lapse \u2014 port detention' },\n STCW_CERTIFICATE_RENEWAL: { action: 'Initiate STCW certificate renewal for affected crew', reg: 'STCW 95 Reg. I/11 \u2014 5-year revalidation', penalty: 'Illegal watchkeeping \u2014 immediate suspension' },\n EU_MRV_ANNUAL_REPORT: { action: 'Submit EU MRV CO2 emissions report', reg: 'EU Regulation 2023/1805 (FuelEU Maritime)', penalty: 'EUR 50,000+ penalty + expulsion from EU ports' },\n PORT_STATE_CONTROL_PREP: { action: 'Run PSC pre-inspection checklist for scheduled port call', reg: 'Paris MOU / Tokyo MOU / USCG 33 CFR \u00a796.230', penalty: 'Deficiency notices \u2014 vessel detention' },\n IACS_CLASSIFICATION_SURVEY: { action: 'Schedule classification renewal survey', reg: 'IACS UR Z7 \u2014 annual class surveys', penalty: 'Class lapse \u2014 P&I insurance void, vessel cannot trade' },\n BALLAST_WATER_CONVENTION: { action: 'Submit BWM Convention compliance documentation', reg: 'BWM Convention (IMO) Reg. B-3', penalty: 'PSC deficiency + port state action' }\n};\n\nconst prevStates = $getWorkflowStaticData('global');\nconst results = [];\n\nfor (const item of items) {\n const d = item.json;\n const dueDate = new Date(d.due_date);\n const daysUntil = Math.floor((dueDate - today) / 86400000);\n\n let urgency = null;\n if (daysUntil < 0) urgency = 'OVERDUE';\n else if (daysUntil <= 7) urgency = 'CRITICAL';\n else if (daysUntil <= 30) urgency = 'URGENT';\n else if (daysUntil <= 60) urgency = 'WARNING';\n else if (daysUntil <= 90) urgency = 'NOTICE';\n\n if (!urgency) continue;\n\n const dedupeKey = `deadline_${d.id}_${urgency}`;\n const lastAlert = prevStates[dedupeKey] || 0;\n if (Date.now() - lastAlert < 4 * 60 * 60 * 1000) continue;\n prevStates[dedupeKey] = Date.now();\n\n const meta = actionMap[d.deadline_type] || { action: 'Review deadline', reg: 'Internal', penalty: 'Unknown' };\n results.push({ json: { ...d, urgency, daysUntil, ...meta } });\n}\nreturn results;"
}
},
{
"name": "Route by Urgency",
"type": "n8n-nodes-base.switch",
"parameters": {
"rules": [
{
"value1": "={{ $json.urgency }}",
"operation": "equal",
"value2": "OVERDUE"
},
{
"value1": "={{ $json.urgency }}",
"operation": "equal",
"value2": "CRITICAL"
}
]
}
},
{
"name": "Slack #maritime-compliance @here",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#maritime-compliance",
"text": ":rotating_light: *{{ $json.urgency }} \u2014 {{ $json.deadline_type }}*\n*Vessel/Entity:* {{ $json.vessel_name || $json.entity_name }}\n*Due:* {{ $json.due_date }} ({{ $json.daysUntil }} days)\n*Reg:* {{ $json.reg }}\n*Penalty:* {{ $json.penalty }}\n*Action:* {{ $json.action }}\n@here"
}
},
{
"name": "Gmail DPA/Fleet Manager",
"type": "n8n-nodes-base.gmail",
"parameters": {
"to": "={{ $json.owner_email }}",
"subject": "[{{ $json.urgency }}] {{ $json.deadline_type }} \u2014 {{ $json.vessel_name || $json.entity_name }} \u2014 {{ $json.daysUntil }} days",
"message": "Deadline: {{ $json.deadline_type }}\nVessel/Entity: {{ $json.vessel_name || $json.entity_name }}\nDue: {{ $json.due_date }} ({{ $json.daysUntil }} days)\nRegulation: {{ $json.reg }}\nPenalty: {{ $json.penalty }}\nRequired action: {{ $json.action }}"
}
}
]
}
PSC angle: Port State Control inspectors check compliance documents. This tracker ensures no deadline lapses silently — and the Postgres log proves you had an active monitoring system in place.
Workflow 4: Maritime Incident & Environmental Violation Alert Pipeline
Target: Safety management SaaS, HSQE platforms, fleet compliance tools.
The problem: MARPOL oil spills require flag state notification within 24 hours. ISM Code dangerous occurrences require investigation within 72 hours. ISPS security breaches require flag state and port authority notification within 1 hour. Manual escalation chains fail at sea.
{
"name": "Maritime Incident and Environmental Violation Alert Pipeline",
"nodes": [
{
"name": "Webhook Trigger",
"type": "n8n-nodes-base.webhook",
"parameters": {
"httpMethod": "POST",
"path": "maritime-incident",
"responseMode": "onReceived"
}
},
{
"name": "Classify Incident",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const evt = $input.first().json;\nconst incidentTypeMap = {\n MARPOL_POLLUTION_VIOLATION: { severity: 'CRITICAL', sla_hours: 1, reg: 'MARPOL Annex I Reg. 11 \u2014 immediate flag state notification', action: 'Notify flag state + coastal state + record in Oil Record Book Part II. Preserve evidence for flag state investigation.' },\n ISM_DANGEROUS_OCCURRENCE: { severity: 'CRITICAL', sla_hours: 1, reg: 'ISM Code \u00a79.1 \u2014 dangerous occurrences must be reported, investigated, analyzed', action: 'File ISM near-miss report, initiate root cause analysis within 72h, update SMS procedures' },\n ISPS_SECURITY_BREACH: { severity: 'CRITICAL', sla_hours: 0.5, reg: 'ISPS Code Part A \u00a78.4 \u2014 CSO must be notified immediately', action: 'Notify Company Security Officer + Flag State + port authority. Preserve SSAS records.' },\n STCW_CREW_FATIGUE_VIOLATION: { severity: 'HIGH', sla_hours: 2, reg: 'STCW 2010 Manila Reg. VIII/1 \u2014 minimum rest hours 10h/24h, 77h/7d', action: 'Log rest hour violation in crew rest hours record, notify DPA, adjust watchkeeping schedule' },\n CII_RATING_DEGRADATION: { severity: 'HIGH', sla_hours: 4, reg: 'MARPOL Annex VI Reg. 28 \u2014 CII D rating triggers corrective action plan', action: 'Initiate CII Corrective Action Plan (CAP), notify technical superintendent, update IMO DCS records' },\n MLC_SEAFARER_COMPLAINT: { severity: 'HIGH', sla_hours: 2, reg: 'MLC 2006 Standard A5.1.5 \u2014 onboard complaint procedure required', action: 'Log via MLC complaint procedure, notify DPA, respond within 24h per MLC Standard A5.1.5' },\n PORT_STATE_CONTROL_DEFICIENCY: { severity: 'HIGH', sla_hours: 4, reg: 'Paris MOU / Tokyo MOU \u2014 rectify deficiency before departure', action: 'Notify fleet manager, initiate rectification. Document completion for PSC clearance.' },\n BALLAST_WATER_DISCHARGE_VIOLATION: { severity: 'CRITICAL', sla_hours: 1, reg: 'BWM Convention Reg. B-3 \u2014 mandatory D-2 standard treatment', action: 'Cease discharge, notify flag state, document in Ballast Water Record Book' }\n};\n\nconst incident = evt.incident_type || 'ISM_DANGEROUS_OCCURRENCE';\nconst meta = incidentTypeMap[incident] || incidentTypeMap['ISM_DANGEROUS_OCCURRENCE'];\n\nconst prevStates = $getWorkflowStaticData('global');\nconst key = `incident_${evt.imo_number}_${incident}`;\nconst lastAlert = prevStates[key] || 0;\nconst shouldAlert = (Date.now() - lastAlert) > 30 * 60 * 1000;\nif (shouldAlert) prevStates[key] = Date.now();\n\nreturn shouldAlert ? [{ json: { ...evt, ...meta, incident_type: incident, detectedAt: new Date().toISOString() } }] : [];"
}
},
{
"name": "Slack #fleet-hsqe <!channel>",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#fleet-hsqe",
"text": ":warning: *{{ $json.severity }} \u2014 {{ $json.incident_type }}*\n*Vessel:* {{ $json.vessel_name }} (IMO {{ $json.imo_number }})\n*SLA:* {{ $json.sla_hours }}h\n*Reg:* {{ $json.reg }}\n*Action:* {{ $json.action }}\n<!channel>"
}
},
{
"name": "Postgres Audit Trail",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "INSERT INTO maritime_incidents (imo_number, vessel_name, incident_type, severity, reg_citation, action_required, detected_at) VALUES ('{{ $json.imo_number }}', '{{ $json.vessel_name }}', '{{ $json.incident_type }}', '{{ $json.severity }}', '{{ $json.reg }}', '{{ $json.action }}', NOW()) ON CONFLICT DO NOTHING"
}
}
]
}
ISM angle: Every incident is logged with its regulatory citation and required action. When a flag state investigator asks for your ISM Code §9 non-conformity and accident records, you have a complete timestamped audit trail.
Workflow 5: Weekly Fleet KPI Dashboard with CII Rating
Target: Fleet operations SaaS, ship management platforms, maritime analytics vendors.
{
"name": "Weekly Maritime Fleet KPI Dashboard",
"nodes": [
{
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 8 * * 1"
}
]
}
}
},
{
"name": "Query Fleet Metrics",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "SELECT COUNT(DISTINCT imo_number) AS active_vessels, AVG(uptime_pct) AS avg_ais_uptime, COUNT(CASE WHEN cii_rating IN ('D','E') THEN 1 END) AS vessels_at_cii_risk, SUM(fuel_consumption_mt) AS total_fuel_mt FROM fleet_metrics WHERE week_of = DATE_TRUNC('week', NOW() - INTERVAL '1 week')"
}
},
{
"name": "Query Compliance Metrics",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "SELECT COUNT(*) AS total_incidents, COUNT(CASE WHEN incident_type='MARPOL_POLLUTION_VIOLATION' THEN 1 END) AS marpol_violations, COUNT(CASE WHEN incident_type='ISM_DANGEROUS_OCCURRENCE' THEN 1 END) AS ism_occurrences, COUNT(CASE WHEN incident_type='PORT_STATE_CONTROL_DEFICIENCY' THEN 1 END) AS psc_deficiencies FROM maritime_incidents WHERE detected_at > NOW() - INTERVAL '7 days'"
}
},
{
"name": "Merge",
"type": "n8n-nodes-base.merge",
"parameters": {
"mode": "passThrough"
}
},
{
"name": "Build HTML Dashboard",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const fleet = $('Query Fleet Metrics').first().json;\nconst compliance = $('Query Compliance Metrics').first().json;\n\nconst ciiRisk = parseInt(fleet.vessels_at_cii_risk || 0);\nconst ciiFlag = ciiRisk > 0 ? ` [CII RISK: ${ciiRisk} VESSELS]` : '';\nconst marpolFlag = parseInt(compliance.marpol_violations) > 0 ? ' [MARPOL VIOLATION]' : '';\nconst subject = `FlowKit Weekly Fleet Report${ciiFlag}${marpolFlag}`;\n\nconst ciiColor = ciiRisk > 5 ? '#e74c3c' : ciiRisk > 0 ? '#f39c12' : '#27ae60';\n\nconst html = `<h2>Weekly Fleet KPI Report</h2><table border='1' cellpadding='6' style='border-collapse:collapse'><tr><th>Metric</th><th>Value</th></tr><tr><td>Active Vessels</td><td>${fleet.active_vessels}</td></tr><tr><td>Avg AIS Uptime</td><td>${parseFloat(fleet.avg_ais_uptime).toFixed(2)}%</td></tr><tr><td>Vessels at CII Risk (D/E)</td><td style='color:${ciiColor}'>${fleet.vessels_at_cii_risk}</td></tr><tr><td>Total Fuel Consumed (MT)</td><td>${Number(fleet.total_fuel_mt).toLocaleString()}</td></tr></table><h3>Compliance Events This Week</h3><table border='1' cellpadding='6' style='border-collapse:collapse'><tr><th>Type</th><th>Count</th></tr><tr><td>MARPOL Violations</td><td style='color:${compliance.marpol_violations>0?'#e74c3c':'#27ae60'}'>${compliance.marpol_violations}</td></tr><tr><td>ISM Dangerous Occurrences</td><td>${compliance.ism_occurrences}</td></tr><tr><td>PSC Deficiencies</td><td style='color:${compliance.psc_deficiencies>0?'#e74c3c':'#27ae60'}'>${compliance.psc_deficiencies}</td></tr><tr><td>Total Incidents</td><td>${compliance.total_incidents}</td></tr></table>`;\n\nreturn [{ json: { subject, html } }];"
}
},
{
"name": "Gmail CEO BCC Fleet Superintendent",
"type": "n8n-nodes-base.gmail",
"parameters": {
"to": "ceo@company.com",
"bcc": "fleet.superintendent@company.com,dpa@company.com",
"subject": "={{ $json.subject }}",
"message": "={{ $json.html }}",
"options": {
"bodyType": "html"
}
}
},
{
"name": "Slack #fleet-management",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#fleet-management",
"text": "Weekly fleet report sent. CII at-risk vessels: {{ $('Query Fleet Metrics').first().json.vessels_at_cii_risk }}. MARPOL violations: {{ $('Query Compliance Metrics').first().json.marpol_violations }}. PSC deficiencies: {{ $('Query Compliance Metrics').first().json.psc_deficiencies }}."
}
}
]
}
CII angle: CII D/E vessels appear in the email subject line — the DPA and fleet superintendent get immediate visibility without navigating a dashboard.
Why n8n Beats Zapier for Maritime Ops
| Factor | Zapier | n8n (self-hosted) |
|---|---|---|
| ISPS security plan | Vessel data leaves your network — ISPS §9.4 concern | Data stays inside your VPC |
| IMO DCS audit trail | 30-day log retention — gone before flag state audit | Permanent Postgres log |
| MLC 2006 crew PII | Third-party cloud access — GDPR Article 28 DPA required | No third-party access |
| ISM Code §12 audit evidence | No git versioning — audit trail is a screenshot | JSON export to git — audit-ready |
| CII monitoring latency | Zapier 15-min minimum polling | 5-min polls, real-time webhook |
| Cost at 10,000 vessels | ~$50K+/mo Zapier Enterprise | ~$500/mo VPS |
Get All 15 Workflows
All 15 production-ready n8n workflow templates are available at stripeai.gumroad.com.
Each template includes: complete import-ready JSON, setup guide with credential configuration, and regulatory compliance notes.
Questions? Drop a comment below.
Top comments (0)