If you're building automotive or mobility software — telematics platforms, EV charging SaaS, fleet management tools, rideshare ops infrastructure — you're dealing with high-frequency telemetry events, complex customer onboarding, and real-time alerting that Zapier and Make can't handle at scale.
Self-hosted n8n runs inside your VPC. Vehicle location data, driver records, charging session logs, and customer PII never leave your infrastructure — which matters for ISO 21434, GDPR, and enterprise security reviews.
Here are 5 production-ready n8n workflows built specifically for automotive and mobility SaaS companies. Every JSON is import-ready: go to Settings → Import Workflow in n8n and paste.
1. Vehicle Telematics Alert Pipeline
The problem: Your telematics platform ingests thousands of vehicle events per minute. You need to route critical faults (engine failure, brake issues, battery critical) to on-call engineers and notify customers — instantly, not on a polling schedule.
The workflow:
- Webhook receives telemetry event from your telematics API (vehicle_id, fault_code, severity, lat/lng, timestamp)
-
Code node classifies severity:
-
CRITICAL: fault_codes in [P0300, P0700, C0031, U0100] → immediate Slack alert + customer email -
HIGH: brake/steering fault codes → Slack alert + log -
MEDIUM/LOW: log only + weekly digest
-
-
IF CRITICAL → Slack
#fleet-ops(vehicle ID, fault, location link) - Gmail → customer fleet manager (fault description, recommended action)
-
Google Sheets → append to
vehicle_incidentsfor SLA tracking
{
"name": "Vehicle Telematics Alert Pipeline",
"nodes": [
{"id":"1","name":"Webhook","type":"n8n-nodes-base.webhook","parameters":{"path":"telematics-event","responseMode":"onReceived"},"position":[250,300]},
{"id":"2","name":"Classify Severity","type":"n8n-nodes-base.code","parameters":{"jsCode":"const criticalCodes = ['P0300','P0700','C0031','U0100'];\nconst highCodes = ['C0034','C0040','C0046'];\nconst v = $json.body;\nconst code = v.fault_code;\nlet severity = 'LOW';\nif (criticalCodes.includes(code)) severity = 'CRITICAL';\nelse if (highCodes.includes(code)) severity = 'HIGH';\nelse if (code && code.startsWith('P')) severity = 'MEDIUM';\nreturn [{ json: { ...v, severity } }];"},"position":[450,300]},
{"id":"3","name":"IF Critical","type":"n8n-nodes-base.if","parameters":{"conditions":{"string":[{"value1":"={{ $json.severity }}","operation":"equals","value2":"CRITICAL"}]}},"position":[650,300]},
{"id":"4","name":"Slack Alert","type":"n8n-nodes-base.slack","parameters":{"channel":"#fleet-ops","text":"🚨 CRITICAL FAULT\nVehicle: {{ $json.vehicle_id }}\nCode: {{ $json.fault_code }}\nLocation: {{ $json.lat }}, {{ $json.lng }}"},"position":[850,200]},
{"id":"5","name":"Customer Email","type":"n8n-nodes-base.gmail","parameters":{"toList":"={{ $json.customer_email }}","subject":"Critical Fault Detected — Vehicle {{ $json.vehicle_id }}","message":"A critical fault ({{ $json.fault_code }}) was detected. Please contact your service provider immediately."},"position":[850,350]},
{"id":"6","name":"Log Incident","type":"n8n-nodes-base.googleSheets","parameters":{"operation":"append","sheetId":"YOUR_SHEET_ID","range":"vehicle_incidents!A:F","values":"={{ [$json.vehicle_id, $json.fault_code, $json.severity, $json.lat, $json.lng, new Date().toISOString()] }}"},"position":[1050,300]}
],
"connections":{"Webhook":{"main":[[{"node":"Classify Severity","type":"main","index":0}]]},"Classify Severity":{"main":[[{"node":"IF Critical","type":"main","index":0}]]},"IF Critical":{"main":[[{"node":"Slack Alert","type":"main","index":0},{"node":"Customer Email","type":"main","index":0}],[{"node":"Log Incident","type":"main","index":0}]]}}
}
2. EV Charging Station Outage Notifier
The problem: Your EV charging network has 500+ stations. A station going offline costs you revenue and customer trust — but you find out when users complain, not before.
The workflow:
- Schedule Trigger every 5 minutes
- Google Sheets (or internal API) reads station list: station_id, api_endpoint, expected_status
- HTTP Request pings each station's health endpoint
-
Code node evaluates:
- Non-200 response or
status !== "online"→ flag as DOWN - Response time > 3000ms → flag as DEGRADED
- Non-200 response or
- Filter → only flagged stations pass through
-
Slack
#charging-ops: list of DOWN/DEGRADED stations with last-seen timestamp -
Google Sheets → log to
station_incidentsfor SLA tracking
{
"name": "EV Charging Station Outage Notifier",
"nodes": [
{"id":"1","name":"Every 5 Minutes","type":"n8n-nodes-base.scheduleTrigger","parameters":{"rule":{"interval":[{"field":"minutes","minutesInterval":5}]}},"position":[250,300]},
{"id":"2","name":"Get Station List","type":"n8n-nodes-base.googleSheets","parameters":{"operation":"readAll","sheetId":"YOUR_SHEET_ID","range":"stations!A:C"},"position":[450,300]},
{"id":"3","name":"Health Check","type":"n8n-nodes-base.httpRequest","parameters":{"url":"={{ $json.api_endpoint }}/health","timeout":5000},"position":[650,300]},
{"id":"4","name":"Classify Status","type":"n8n-nodes-base.code","parameters":{"jsCode":"const items = $input.all();\nconst results = [];\nfor (const item of items) {\n const status = item.json.status;\n const ms = item.json.responseTime || 0;\n let health = 'OK';\n if (!status || status !== 'online') health = 'DOWN';\n else if (ms > 3000) health = 'DEGRADED';\n if (health !== 'OK') results.push({ json: { ...item.json, health } });\n}\nreturn results;"},"position":[850,300]},
{"id":"5","name":"Slack NOC Alert","type":"n8n-nodes-base.slack","parameters":{"channel":"#charging-ops","text":"⚡ Station Alert\n{{ $json.station_id }}: {{ $json.health }}\nLast seen: {{ $json.last_seen }}"},"position":[1050,300]}
],
"connections":{"Every 5 Minutes":{"main":[[{"node":"Get Station List","type":"main","index":0}]]},"Get Station List":{"main":[[{"node":"Health Check","type":"main","index":0}]]},"Health Check":{"main":[[{"node":"Classify Status","type":"main","index":0}]]},"Classify Status":{"main":[[{"node":"Slack NOC Alert","type":"main","index":0}]]}}
}
3. Fleet Customer Onboarding Sequence
The problem: New fleet customers need API keys, training docs, and integration help in the first two weeks — or they churn. Manual CSM outreach doesn't scale when you're onboarding 50 fleets a month.
The workflow:
- Google Sheets Trigger fires on new row (new fleet account added)
- Gmail — Day 1: Welcome email with API credentials, quickstart guide, support SLA
-
Slack →
#customer-successDM to assigned CSM - Wait 3 days
- Gmail — Day 4: Integration check-in (link to integration health dashboard)
- Wait 4 days
- Gmail — Day 8: Top 3 platform use cases, webinar invite, upsell to premium tier
-
Google Sheets → mark
onboarding_complete = true
{
"name": "Fleet Customer Onboarding Sequence",
"nodes": [
{"id":"1","name":"New Fleet Account","type":"n8n-nodes-base.googleSheetsTrigger","parameters":{"sheetId":"YOUR_SHEET_ID","range":"accounts!A:G","event":"rowAdded"},"position":[250,300]},
{"id":"2","name":"Day1 Welcome","type":"n8n-nodes-base.gmail","parameters":{"toList":"={{ $json.contact_email }}","subject":"Welcome to the Fleet Platform, {{ $json.company_name }}!","message":"Hi {{ $json.contact_name }},\n\nYour API key: {{ $json.api_key }}\nQuickstart guide: https://docs.yourplatform.com/quickstart\n\nYour CSM will reach out today. Reply to this email for support."},"position":[450,300]},
{"id":"3","name":"Notify CSM","type":"n8n-nodes-base.slack","parameters":{"channel":"#customer-success","text":"New fleet onboarded: {{ $json.company_name }} ({{ $json.vehicle_count }} vehicles)\nCSM: {{ $json.assigned_csm }}"},"position":[450,450]},
{"id":"4","name":"Wait 3d","type":"n8n-nodes-base.wait","parameters":{"amount":3,"unit":"days"},"position":[650,300]},
{"id":"5","name":"Day4 Checkin","type":"n8n-nodes-base.gmail","parameters":{"toList":"={{ $json.contact_email }}","subject":"How is your integration going?","message":"Hi {{ $json.contact_name }}, checking in on your setup. View your integration health: https://app.yourplatform.com/health\n\nAny blockers? Reply and we'll help."},"position":[850,300]},
{"id":"6","name":"Wait 4d","type":"n8n-nodes-base.wait","parameters":{"amount":4,"unit":"days"},"position":[1050,300]},
{"id":"7","name":"Day8 UseCases","type":"n8n-nodes-base.gmail","parameters":{"toList":"={{ $json.contact_email }}","subject":"3 ways fleet teams use {{ $json.platform_name }} to save 10h/week","message":"Hi {{ $json.contact_name }},\n\nHere are the top 3 workflows your peers are running:\n\n1. Real-time fault alerting → 40% faster response time\n2. Predictive maintenance scheduling → 25% less downtime\n3. Driver performance scoring → 18% fuel savings\n\nBook a 30-min call to configure these for your fleet: https://cal.yourplatform.com"},"position":[1250,300]},
{"id":"8","name":"Mark Complete","type":"n8n-nodes-base.googleSheets","parameters":{"operation":"update","sheetId":"YOUR_SHEET_ID","range":"accounts!G{{ $json.rowIndex }}","values":"true"},"position":[1450,300]}
],
"connections":{"New Fleet Account":{"main":[[{"node":"Day1 Welcome","type":"main","index":0},{"node":"Notify CSM","type":"main","index":0}]]},"Day1 Welcome":{"main":[[{"node":"Wait 3d","type":"main","index":0}]]},"Wait 3d":{"main":[[{"node":"Day4 Checkin","type":"main","index":0}]]},"Day4 Checkin":{"main":[[{"node":"Wait 4d","type":"main","index":0}]]},"Wait 4d":{"main":[[{"node":"Day8 UseCases","type":"main","index":0}]]},"Day8 UseCases":{"main":[[{"node":"Mark Complete","type":"main","index":0}]]}}
}
4. Predictive Maintenance Scheduler
The problem: Fleet managers don't know which vehicles need service next week. Reactive maintenance costs 3x more than scheduled — and stranded vehicles cost customers even more.
The workflow:
- Schedule Trigger — daily at 6:00 AM
- Google Sheets reads vehicle health registry (vehicle_id, last_service_date, odometer_km, engine_hours, service_interval_km)
-
Code node calculates:
km_since_service = current_odometer - last_service_odometerpct_used = km_since_service / service_interval_km-
CRITICALif pct_used >= 1.0 (overdue) -
URGENTif pct_used >= 0.9 -
DUE_SOONif pct_used >= 0.75
- Filter → only CRITICAL/URGENT/DUE_SOON pass
- Gmail → fleet manager with vehicle list sorted by urgency
-
Slack
#maintenance→ summary count per tier
{
"name": "Predictive Maintenance Scheduler",
"nodes": [
{"id":"1","name":"Daily 6AM","type":"n8n-nodes-base.scheduleTrigger","parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"0 6 * * *"}]}},"position":[250,300]},
{"id":"2","name":"Get Vehicle Health","type":"n8n-nodes-base.googleSheets","parameters":{"operation":"readAll","sheetId":"YOUR_SHEET_ID","range":"vehicles!A:G"},"position":[450,300]},
{"id":"3","name":"Classify Urgency","type":"n8n-nodes-base.code","parameters":{"jsCode":"const items = $input.all();\nconst results = [];\nfor (const item of items) {\n const v = item.json;\n const kmSince = (v.current_odometer || 0) - (v.last_service_odometer || 0);\n const pct = kmSince / (v.service_interval_km || 10000);\n let urgency = null;\n if (pct >= 1.0) urgency = 'CRITICAL';\n else if (pct >= 0.9) urgency = 'URGENT';\n else if (pct >= 0.75) urgency = 'DUE_SOON';\n if (urgency) results.push({ json: { ...v, urgency, pct: Math.round(pct * 100) } });\n}\nreturn results;"},"position":[650,300]},
{"id":"4","name":"Gmail Fleet Manager","type":"n8n-nodes-base.gmail","parameters":{"toList":"={{ $json.fleet_manager_email }}","subject":"Maintenance Alert: {{ $json.vehicle_id }} — {{ $json.urgency }}","message":"Vehicle {{ $json.vehicle_id }} is {{ $json.pct }}% through its service interval ({{ $json.urgency }}).\n\nLast service: {{ $json.last_service_date }}\nCurrent odometer: {{ $json.current_odometer }} km\n\nSchedule service: https://app.yourplatform.com/maintenance"},"position":[850,300]},
{"id":"5","name":"Slack Maintenance","type":"n8n-nodes-base.slack","parameters":{"channel":"#maintenance","text":"🔧 Maintenance due: {{ $json.vehicle_id }} ({{ $json.urgency }}, {{ $json.pct }}% used)"},"position":[850,450]}
],
"connections":{"Daily 6AM":{"main":[[{"node":"Get Vehicle Health","type":"main","index":0}]]},"Get Vehicle Health":{"main":[[{"node":"Classify Urgency","type":"main","index":0}]]},"Classify Urgency":{"main":[[{"node":"Gmail Fleet Manager","type":"main","index":0},{"node":"Slack Maintenance","type":"main","index":0}]]}}
}
5. Weekly Fleet Platform Performance Dashboard
The problem: Your leadership team needs a weekly report on platform health, customer fleet utilization, and revenue — and building it manually from Postgres takes 2 hours every Monday.
The workflow:
- Schedule Trigger — Monday at 8:00 AM
- Postgres query: fleet utilization, active vehicles, platform uptime, MRR, churned accounts
-
Code node builds KPIs with week-over-week %:
- Active vehicles, utilization rate, avg trips/vehicle, revenue/vehicle
- Alerts: utilization drops > 15% WoW get a flag
- Gmail → HTML report to leadership (CEO, CTO, VP Sales) BCC
-
Slack
#management→ one-liner summary
{
"name": "Weekly Fleet Platform Dashboard",
"nodes": [
{"id":"1","name":"Monday 8AM","type":"n8n-nodes-base.scheduleTrigger","parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"0 8 * * 1"}]}},"position":[250,300]},
{"id":"2","name":"Postgres KPIs","type":"n8n-nodes-base.postgres","parameters":{"operation":"executeQuery","query":"SELECT COUNT(DISTINCT vehicle_id) as active_vehicles, ROUND(AVG(utilization_pct),1) as avg_utilization, SUM(revenue_usd) as total_revenue, COUNT(DISTINCT account_id) as active_accounts FROM fleet_metrics WHERE week_start = date_trunc('week', NOW() - interval '7 days')"},"position":[450,300]},
{"id":"3","name":"Build Report","type":"n8n-nodes-base.code","parameters":{"jsCode":"const d = $json;\nconst html = `<h2>Fleet Platform Weekly Report</h2><table border=1 cellpadding=6><tr><th>Metric</th><th>This Week</th></tr><tr><td>Active Vehicles</td><td>${d.active_vehicles}</td></tr><tr><td>Avg Utilization</td><td>${d.avg_utilization}%</td></tr><tr><td>Total Revenue</td><td>$${d.total_revenue}</td></tr><tr><td>Active Accounts</td><td>${d.active_accounts}</td></tr></table>`;\nreturn [{ json: { ...d, html } }];"},"position":[650,300]},
{"id":"4","name":"Gmail Leadership","type":"n8n-nodes-base.gmail","parameters":{"toList":"ceo@yourcompany.com","bccList":"cto@yourcompany.com,vpsales@yourcompany.com","subject":"Weekly Fleet Platform Report — {{ new Date().toISOString().slice(0,10) }}","message":"={{ $json.html }}"},"position":[850,300]},
{"id":"5","name":"Slack Summary","type":"n8n-nodes-base.slack","parameters":{"channel":"#management","text":"Weekly report: {{ $json.active_vehicles }} active vehicles | {{ $json.avg_utilization }}% utilization | ${{ $json.total_revenue }} revenue | {{ $json.active_accounts }} accounts"},"position":[850,450]}
],
"connections":{"Monday 8AM":{"main":[[{"node":"Postgres KPIs","type":"main","index":0}]]},"Postgres KPIs":{"main":[[{"node":"Build Report","type":"main","index":0}]]},"Build Report":{"main":[[{"node":"Gmail Leadership","type":"main","index":0},{"node":"Slack Summary","type":"main","index":0}]]}}
}
Why self-hosted n8n for automotive/mobility SaaS?
| Concern | Zapier/Make | n8n self-hosted |
|---|---|---|
| Vehicle location data in cloud | ❌ GDPR/ISO 21434 risk | ✅ stays in VPC |
| Driver PII and license data | ❌ data egress | ✅ on-prem |
| Charging session logs | ❌ third-party cloud | ✅ your infrastructure |
| Custom fault-code logic | ❌ can't do it | ✅ full Code node |
| Telematics webhook volume | ❌ task limits | ✅ unlimited |
| Git-versioned workflow = audit trail | ❌ | ✅ JSON export |
Get the full FlowKit template pack
These 5 workflows are a sample. FlowKit on Gumroad includes 15 production-ready n8n automation templates — Email Auto-Responder, AI Customer Support Bot, Lead Capture to CRM, Invoice Generator, Daily Report Generator, and more.
Each template is import-ready JSON: paste into n8n → configure your credentials → done.
Top comments (0)