Every driver, vehicle and courier, counted as they move.
Know how long each driver has driven today in their own time zone, which vehicles have stopped moving and how many deliveries each courier made, before you hand out the next job.
watching
watching
watching
The questions this answers
Typical questions, each with the window it usually looks at. Thresholds are starting points you set yourself.
- Driving time
How long has this driver driven today and this week, against the limits you plan with?
calendar day and week, driver's time zone - Deliveries per courier
How many deliveries did this courier complete today?
calendar day, courier's time zone - Earnings this week
How much has this courier earned since Monday, to the cent?
calendar week, courier's time zone - Idle vehicles
Which vehicles have not moved for four hours?
no moving position for 4 hours - Far from its depot
Is this vehicle's latest position more than 50 km from its depot?
latest position against the depot's - Missing deliveries
How often has this address reported a delivery as not received?
rolling 90 days, per address
Offer a job only to a driver with time left
Dispatch has a 90-minute job, and the nearest driver has driven 7 h 50 today. Before assigning it, dispatch asks Aggrelis about the driver with the job's length; the answer says it would pass the day's limit, so the job goes to someone else. The limits are values you set; your tachograph data stays the record.
- Send each driving period when it ends, with the driver and its minutes
- Define minutes per calendar day and week in the driver's time zone, and conditions for your limits
- Ask about the driver before assigning a job, passing the job's estimated minutes
- Act: assign the job, or offer it to a driver with time left
{
"id": "drv_5521_0412",
"type": "driving_ended",
"ts": "2026-10-22T14:05:00Z",
"attrs": {
"driver_id": "d_5521",
"vehicle_id": "v_309",
"minutes": 95
}
}{
"name": "driver_hours",
"description": "Driving time against the limits you plan with",
"spec": {
"entity": "driver",
"input": [{"name": "jobMinutes", "type": "int"}],
"features": {
"drivenToday": {"state": "minutes_by_driver",
"window": {"calendar": "day", "tz": "subject.timezone"}},
"drivenThisWeek": {"state": "minutes_by_driver",
"window": {"calendar": "week", "tz": "subject.timezone"}}
},
"derived": [
{"name": "minutesLeftToday", "expr": "540 - drivenToday"}
],
"reasons": [
{"name": "job_passes_daily_limit",
"when": "drivenToday + input.jobMinutes > 540"},
{"name": "job_passes_weekly_limit",
"when": "drivenThisWeek + input.jobMinutes > 3360"}
]
}
}{
"entity": {"type": "driver", "id": "d_5521"},
"values": {
"drivenToday": 470,
"drivenThisWeek": 2410,
"minutesLeftToday": 70
},
"reasons": ["job_passes_daily_limit"],
"degraded": [],
"skipped": [],
"profileVersion": "driver_hours@v1",
"evaluatedAt": "2026-10-22T14:31:07.903114620Z"
}The parts of Aggrelis behind it
Nothing built for one industry: the same building blocks, configured for this job.
- The driver's own day
Calendar days and weeks start at each driver's local midnight, from a time zone you keep with them.
- Ask with what you know
Pass the job's length with the question, and the answer says whether it still fits.
- Absence triggers
Be told when a vehicle stops sending positions, or has not moved for hours.
- Latest position and distance
Keep each vehicle's last position and measure how far it is from its depot.
- Exact earnings
Courier earnings kept to the cent, per day, week or month in their own time zone.
- Change without a release
Operations set the limits and change them in the workspace, with every version kept.
Your first live numbers, configured not coded
Tell us what you would count first, and we'll help you set it up.