DEV Community

Alex Kane
Alex Kane

Posted on

n8n for Automotive & Mobility SaaS: 5 Automations That Scale Platform Ops (Free Workflow JSON)

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:

  1. Webhook receives telemetry event from your telematics API (vehicle_id, fault_code, severity, lat/lng, timestamp)
  2. 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
  3. IF CRITICAL → Slack #fleet-ops (vehicle ID, fault, location link)
  4. Gmail → customer fleet manager (fault description, recommended action)
  5. Google Sheets → append to vehicle_incidents for 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}]]}}
}
Enter fullscreen mode Exit fullscreen mode

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:

  1. Schedule Trigger every 5 minutes
  2. Google Sheets (or internal API) reads station list: station_id, api_endpoint, expected_status
  3. HTTP Request pings each station's health endpoint
  4. Code node evaluates:
    • Non-200 response or status !== "online" → flag as DOWN
    • Response time > 3000ms → flag as DEGRADED
  5. Filter → only flagged stations pass through
  6. Slack #charging-ops: list of DOWN/DEGRADED stations with last-seen timestamp
  7. Google Sheets → log to station_incidents for 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}]]}}
}
Enter fullscreen mode Exit fullscreen mode

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:

  1. Google Sheets Trigger fires on new row (new fleet account added)
  2. Gmail — Day 1: Welcome email with API credentials, quickstart guide, support SLA
  3. Slack#customer-success DM to assigned CSM
  4. Wait 3 days
  5. Gmail — Day 4: Integration check-in (link to integration health dashboard)
  6. Wait 4 days
  7. Gmail — Day 8: Top 3 platform use cases, webinar invite, upsell to premium tier
  8. 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}]]}}
}
Enter fullscreen mode Exit fullscreen mode

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:

  1. Schedule Trigger — daily at 6:00 AM
  2. Google Sheets reads vehicle health registry (vehicle_id, last_service_date, odometer_km, engine_hours, service_interval_km)
  3. Code node calculates:
    • km_since_service = current_odometer - last_service_odometer
    • pct_used = km_since_service / service_interval_km
    • CRITICAL if pct_used >= 1.0 (overdue)
    • URGENT if pct_used >= 0.9
    • DUE_SOON if pct_used >= 0.75
  4. Filter → only CRITICAL/URGENT/DUE_SOON pass
  5. Gmail → fleet manager with vehicle list sorted by urgency
  6. 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}]]}}
}
Enter fullscreen mode Exit fullscreen mode

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:

  1. Schedule Trigger — Monday at 8:00 AM
  2. Postgres query: fleet utilization, active vehicles, platform uptime, MRR, churned accounts
  3. 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
  4. Gmail → HTML report to leadership (CEO, CTO, VP Sales) BCC
  5. 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}]]}}
}
Enter fullscreen mode Exit fullscreen mode

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.

Browse all templates at stripeai.gumroad.com

Top comments (0)