name: agentic-n8n description: Build automated fleet monitoring workflows using n8n. Use this skill when asked to create agents, automations, or monitoring systems that connect Geotab to external services like Slack, Discord, email, or other APIs. license: Apache-2.0 metadata: author: Felipe Hoffa (https://www.linkedin.com/in/hoffa/) version: "1.0"
Agentic Fleet Monitoring with n8n
When to Use This Skill
- Building automated monitoring that runs on a schedule
- Sending Geotab alerts to Slack, Discord, Teams, or email
- Creating multi-step workflows (detect → decide → act)
- Integrating Geotab with external systems without writing code
- Any "if this happens in Geotab, do that" automation
n8n Basics
n8n is a visual workflow builder. Workflows consist of nodes connected together:
[Trigger] → [Action] → [Action] → [Action]
Common Nodes
| Node | Purpose |
|---|---|
| Schedule Trigger | Run workflow on interval (every 5 min, hourly, etc.) |
| HTTP Request | Call any API (including Geotab) |
| IF | Branch based on condition |
| Filter | Only pass items matching criteria |
| Slack | Send Slack messages |
| Discord | Send Discord messages |
| Send Email | Send email alerts |
| Code | Custom JavaScript logic |
Geotab API Pattern in n8n
Step 1: Authenticate
HTTP Request node: {% raw %}
Method: POST
URL: https://my.geotab.com/apiv1
Body (JSON):
{
"method": "Authenticate",
"params": {
"database": "{{ $vars.GEOTAB_DATABASE }}",
"userName": "{{ $vars.GEOTAB_USERNAME }}",
"password": "{{ $vars.GEOTAB_PASSWORD }}"
}
}
{% endraw %}
Step 2: Fetch Data
HTTP Request node (after Authenticate): {% raw %}
Method: POST
URL: https://my.geotab.com/apiv1
Body (JSON):
{
"method": "Get",
"params": {
"typeName": "Trip",
"credentials": {{ JSON.stringify($json.result.credentials) }},
"search": {
"fromDate": "{{ $now.minus({hours: 1}).toISO() }}",
"toDate": "{{ $now.toISO() }}"
}
}
}
{% endraw %}
Common TypeNames
| TypeName | Data |
|---|---|
Device |
Vehicles |
Trip |
Completed trips |
User |
Users and drivers |
DeviceStatusInfo |
Current location/status |
ExceptionEvent |
Rule violations (speeding, etc.) |
FaultData |
Engine fault codes |
Zone |
Geofences |
LogRecord |
GPS breadcrumbs |
Workflow Patterns
Pattern: Speeding Alerts to Slack
Schedule (15 min)
→ HTTP Request (Authenticate)
→ HTTP Request (Get Trips)
→ Filter (speedingDuration > 30)
→ Slack (Send message)
Filter node condition: {% raw %}
{{ $json.result.speedingDuration > 30 }}
{% endraw %}
Slack message: {% raw %}
🚨 *Speeding Alert*
*Vehicle:* {{ $json.result.device.name }}
*Duration:* {{ $json.result.speedingDuration }} seconds
{% endraw %}
Pattern: Fault Code Alert
Schedule (5 min)
→ HTTP Request (Authenticate)
→ HTTP Request (Get FaultData, last hour)
→ Filter (severity == "Critical")
→ Slack + Email (parallel)
Pattern: Geofence Entry Notification
Schedule (5 min)
→ HTTP Request (Authenticate)
→ HTTP Request (Get ExceptionEvent for zone rules)
→ Filter (new events only)
→ Discord (Send notification)
Pattern: Daily Fleet Summary
Schedule (daily at 8am)
→ HTTP Request (Authenticate)
→ HTTP Request (Get Trips, last 24h)
→ Code (calculate totals)
→ Email (send summary)
Code node for summary:
const trips = $input.all();
const totalDistance = trips.reduce((sum, t) => sum + (t.json.result?.distance || 0), 0);
const totalTrips = trips.length;
return [{
json: {
totalTrips,
totalDistanceKm: (totalDistance / 1000).toFixed(1),
date: new Date().toISOString().split('T')[0]
}
}];
Credential Security
Never hardcode credentials. Use n8n Variables:
- Go to Settings → Variables
- Add:
-
GEOTAB_DATABASE -
GEOTAB_USERNAME -
GEOTAB_PASSWORD
-
Reference in nodes: {% raw %}{{ $vars.GEOTAB_DATABASE }}{% endraw %}
Alert Destinations
Slack Webhook
- Create app at api.slack.com/apps
- Enable Incoming Webhooks
- Copy webhook URL
- Use in Slack node with "Webhook" authentication
Discord Webhook
- Server Settings → Integrations → Webhooks
- Create webhook, copy URL
- Use in Discord node
n8n Cloud includes email sending. Self-hosted needs SMTP config.
Avoiding Common Mistakes
Rate Limiting
Don't poll every second. Use 5-15 minute intervals for most cases.
Duplicate Alerts
Track what you've already alerted on. Use a Code node to filter:
// Store last run timestamp in static data
const lastRun = $getWorkflowStaticData('global').lastRun || 0;
$getWorkflowStaticData('global').lastRun = Date.now();
// Filter to only new items
return $input.all().filter(item => {
const itemTime = new Date(item.json.result?.start).getTime();
return itemTime > lastRun;
});
Credential Expiry
Geotab sessions expire. Always authenticate at the start of each workflow run.
Testing
- Build workflow
- Click "Test Workflow" (or Cmd/Ctrl + Enter)
- Check each node for errors (red = error)
- Fix issues, re-test
- When working, click "Active" to enable
n8n Resources
Related Skills
-
geotab-api-quickstart- Geotab API basics for Python -
geotab-addins- Building MyGeotab Add-Ins
chat Comments (0)
Sign in to join the discussion and leave a comment.
Skill Details
Related Skills
Build your own?
Join 12,000+ developers contributing to the Claude ecosystem.
No comments yet. Be the first to share your thoughts!