Logistics · Fleet data platform
Sahil Transport — Fleet monitoring platform with demurrage calculation for road freight
From a GPS ping to a line on the invoice
Sahil Transport is a Baku road-freight carrier with about 180 trucks. We built its fleet data platform: GPS, fuel and CAN weight sensor streams meet in one place, every stop gets a reason, waiting time at customer sites is priced from the contract, and driver invoice photos are read by AI and matched with trips and finance records.
- Moving 103
- Customer waiting 27
- Operational stop 37
- Offline 9
10-XX-014 Baku → Sumgayit Moving
Speed 62 km/h
Fuel 212 L
Net weight 21.4 t
Project facts
- Project type
- Client project
- Industry
- Logistics and transport
- Platforms
- Web dashboard · Telegram bot · Excel reports
- Languages
- Azerbaijani
Before The challenge
Every truck reports. Nobody connects the dots.
A carrier’s day throws off thousands of signals: positions every few minutes, tank levels, axle weights, paper invoices photographed in the cab. At Sahil Transport they lived in three places that never talked to each other, and money was slipping through the gaps between them.
≈180 trucks
with GPS trackers and tank fuel sensors, and CAN weight sensors on part of the fleet, each reporting every few minutes.
Where the data lived
-
Telematics portal
Positions, speed, fuel, axle weight
-
Chat groups
Invoice photos from drivers
-
Finance records
Customers, contracts, payments
No shared trip. No shared truth.
-
Waiting time went unbilled
Trucks queued at loading sites beyond the free time in the contract, and nobody could show for how long.
-
Every stop looked the same
In raw GPS data a customer queue, a fuel stop and a traffic jam are one and the same thing: speed zero.
-
Invoices were retyped by hand
Drivers photographed paper invoices, and the office copied them into spreadsheets, late and with typos.
-
Three records, three truths
Trips, invoices and finance records rarely agreed, and finding the right one meant checking line by line.
06:00 The fleet in real time
The whole fleet on one screen
The platform pulls position, speed, fuel and weight for every truck from Wialon and turns them into a dispatcher’s view: who is moving, who is waiting at a customer, who has stopped for its own reasons and who has gone quiet.
Moving
103
Customer waiting
27
Operational stop
37
Offline
9
Driver A.
Baku → Sumgayit road
- Speed
- 62 km/h
- Fuel
- 212 L
- Net load
- 21.4 t
Driver B.
Demo Quarry zone
- Speed
- 0 km/h
- Fuel
- 148 L
- Net load
- 0.0 t
Driver E.
Alat → Baku road, empty
- Speed
- 74 km/h
- Fuel
- 188 L
- Net load
- 0.0 t
Driver C.
Alat road, outside zones
- Speed
- 0 km/h
- Fuel
- 96 L
- Net load
- 18.7 t
Driver F.
Demo Terminal zone
- Speed
- 0 km/h
- Fuel
- 175 L
- Net load
- 24.3 t
Driver D.
Last seen near Hajigabul
- Speed
- —
- Fuel
- —
- Net load
- —
Fleet status
176 trucks
- 59%
- 15%
- 21%
- 5%
Data freshness
- GPS 40 s ago
- Invoices 3 min ago
- Finance today 06:00
Needs attention 3
- 10-XX-051 No signal for 34 min
- 10-XX-062 Fuel at 12%
- 10-XX-027 Free time almost used
-
Four states that mean something
Moving, customer waiting, operational stop and offline, in the same colours on the map, the cards, the alerts and the reports.
-
Net cargo, not raw sensor readings
For a truck with a CAN weight sensor the platform learns its empty weight, so the sensor reads as net cargo in tonnes instead of a raw value.
-
Fuel in litres, next to kilometres
Tank sensor levels are kept in litres and per cent alongside the distance driven, on the truck card and for every trip.
-
An attention queue, not a wall of dots
Trucks that went quiet, run low on fuel or are close to the end of their free time rise to the top of the list.
-
Freshness you can see
Every data source shows when it last synced, so a silent feed is never mistaken for a parked truck.
-
A map made for dispatchers
Status filters, plate search and a detail view with each truck’s latest trail, driver and sensor readings.
09:40 Stop classification
Speed zero is not an answer
A truck standing still may be queueing at a customer’s gate, refuelling or stuck in traffic, and only the first one can be billed. The platform puts every stop through four checks and gives it a reason.
10-XX-027 · one sample day
- Driving
- Customer waiting
- Operational stop
Four checks on every stop
-
Zone Is the truck inside a customer’s geofence?
No → operational stop
-
Trip Is that customer on this truck’s trip?
No → operational stop
-
Load Did the weight sensor go up or down?
Up → loading · down → unloading
-
Contract How much free time does the contract allow?
Beyond it → billable waiting
How the day was classified
-
07:05–07:25 20 min
- Zone
- No customer zone
- Trip
- —
- Load
- Fuel level up
Operational stop Refuelling
-
09:40–12:05 2 h 25 min
- Zone
- Demo Quarry
- Trip
- This trip’s customer
- Load
- 0.0 → 24.1 t
Customer waiting Loading · 25 min beyond free time
-
12:40–12:55 15 min
- Zone
- Demo Plant B
- Trip
- Another customer
- Load
- No change
Operational stop Not this trip’s customer
-
13:20–13:50 30 min
- Zone
- No customer zone
- Trip
- —
- Load
- No change
Operational stop Driver rest
-
14:10–15:55 1 h 45 min
- Zone
- Demo Terminal
- Trip
- This trip’s customer
- Load
- 24.1 → 0.0 t
Customer waiting Unloading · within free time
Stops of a few minutes are treated as GPS noise, and a truck hovering on a zone border is smoothed out before it is classified.
11:40 Demurrage calculation
Waiting time turns into a billable line
Every customer contract sets its own free time for loading and unloading and its own hourly rate. When a truck waits longer, the platform counts the excess, prices it from that contract and attaches the fee to the trip, together with the evidence.
- Free time
- 2:00
- Excess
- 0:25
Trip T-0412 · Demo Quarry
- 09:40 Entered the Demo Quarry zone, empty
- 11:16 Free time almost used: the dispatcher is warned
- 11:40 Free time exceeded: the fee starts running
- 11:50 Loaded: 24.1 t net
- 12:05 Left the zone: the fee is closed
Waiting fee Trip T-0412
- Customer
- Demo Quarry
- Operation
- Loading
- In the zone
- 09:40 – 12:05
- Free time, from the contract
- 2 h 00 min
- Billable excess
- 0 h 25 min
Fee added to the trip 35.00 ₼
Evidence kept: zone entry and exit, weight change, GPS trail
-
Separate limits for loading and unloading
Each contract carries its own free time for both operations, so the same wait can be free at one customer and billable at another.
-
Warnings while the truck is still at the gate
Dispatchers get a warning as a truck nears the end of its free time and a critical alert once it is exceeded.
-
A fee with its proof attached
Arrival, departure, zone and weight change are stored with every fee, so a disputed line arrives with its own evidence.
14:30 AI invoice reading
A photo from the cab becomes a checked record
Drivers photograph paper invoices and send them to a Telegram group. The platform straightens the image, AI reads every field with a confidence score, and business checks catch what reading alone misses. When the AI is unsure, a person decides.
- Vehicle 10-XX-027
- Date 14.09
- From Demo Quarry
- To Demo Terminal
- Cargo Crushed stone
- Net weight 24.1 t
- Amount 412.00 ₼
Read by AI
- Vehicle 10-XX-027 Sure
- Date 14.09 Unsure
- From Demo Quarry Sure
- To Demo Terminal Sure
- Cargo Crushed stone Sure
- Net weight 24.1 t Checked
- Amount 412.00 ₼ Sure
Review lane
What happens to every photo
-
The photo arrives
The Telegram bot takes photos from the drivers’ groups and replies at once, so the driver knows it landed.
-
The image is cleaned up
Rotated, resized and sharpened before reading, because cab photos are rarely straight or sharp.
-
AI reads the fields
Vehicle, date, route, customer, weight and amount come back as structured data, each with its own confidence, even with Azerbaijani, Russian and English on one page.
-
Business checks run
The plate format, a valid date, a known customer and totals that add up are verified before anything is saved.
-
Recorded or reviewed
Confident reads are recorded. Unsure ones are read again by a second AI model, and anything still unclear waits in the review lane for a person.
Every read keeps the raw AI answer, its confidence and the model that produced it, so any record can be traced back to its photo.
23:00 Three-way reconciliation
Trip, invoice and finance record must agree
Every night the platform rebuilds the day from raw data: trips from GPS, stops and waiting fees, then a three-way match between each trip, its invoice and its finance record. What agrees is marked reconciled. What does not lands in a queue that names the field that differs.
- T-0415 10-XX-033 Amount 380.00 ₼ on the invoice, 308.00 ₼ in finance Approve Reject
- T-0419 10-XX-051 No invoice Trip found, no photo received yet Approve Reject
- T-0422 10-XX-014 Vehicle The invoice says 10-XX-041 Approve Reject
-
Field-level matching
Vehicle, date, route, weight and amount are compared one by one, so a mismatch arrives with its reason instead of a red row.
-
Decisions in batches
Accountants approve or reject mismatches in bulk, and every decision stays on the record.
-
Rebuilt, never patched
Running a night again gives the same result, and a changed rule rebuilds the history from raw data.
08:00 Reports and the bot
The morning report is already written
Management gets its numbers without asking anyone to build them. The platform generates a ten-tab Excel workbook and charts from the same data the dispatchers see, and the Telegram bot keeps drivers and the office in the loop.
Customer waiting vs operational stops, h
Fuel against distance, per truck
- Summary
- Issues
- Trips
- GPS analysis
- Customers
- Drivers
- Reconciliation
- AI reading
- Stop analysis
- Contracts
What the workbook answers
- Summary
- Trips, distance, fuel, waiting time and fees for the period on one sheet.
- Issues
- Customer waiting beyond free time and empty return legs, ready to filter.
- Stop analysis
- Every stop with its reason, zone, duration and fee.
- GPS analysis
- Fuel against distance and speed patterns for each truck.
- Customers, drivers
- The same numbers cut by customer and by driver.
- Reconciliation
- What matched, what did not, and which invoices needed a person.
Charts for management
The Telegram bot
Drivers send invoice photos where they already chat. The bot answers with the result, and the office gets a link to anything that needs review.
How it is built
Built to trust its own numbers
A platform that bills customers has to prove every figure. We designed this one so each fee, stop and match traces back to a GPS message, a photo or a finance record, and can be rebuilt when the rules change.
Sources
- Wialon GPS
- Tank fuel sensors
- CAN weight sensors
- Invoice photos via Telegram
- Customer contract terms
- Finance records
Platform
- 01 Ingest and normalise
- 02 Classify stops
- 03 Price waiting time
- 04 Read invoices with AI
- 05 Reconcile three ways
Results
- Real-time dashboard and map
- Alerts for dispatchers
- Waiting fees on trips
- Reconciled records
- Excel workbook and charts
- Bot replies to drivers
-
Raw data is never edited
GPS messages are stored as they arrive. Trips, stops and fees are derived from them, so a new rule rebuilds history instead of patching it.
-
Same input, same answer
Nightly processing is idempotent: running a day twice never duplicates a trip, a fee or a match.
-
Real time, with a fallback
Dashboards receive changes the moment they happen and fall back to polling if the push connection drops.
-
Serves its own data
The app reads from its own database, and a circuit breaker keeps it responsive when an outside feed is slow or unreachable.
-
Slow work runs in queues
AI reading runs in background workers with retries, so a burst of photos never slows the dashboard.
-
Access by role
Sign-in with role-based access for dispatchers, accountants, operators and management, each seeing the screens their work needs.
What comes next
The road continues with ATLAS BIP Logistics ERP
The fleet data platform shows where every truck is and what its time is worth. Our partnership with Sahil Transport continues with ATLAS BIP Logistics ERP, our logistics ERP that runs a carrier from the first order to the money in the bank.
Built for Sahil Transport
Fleet data platform
- GPS, fuel and weight in one place
- Stop classification
- Demurrage calculation
- AI invoice reading
- Three-way reconciliation
- Excel reports and a Telegram bot
Our product
ATLAS BIP Logistics ERP
- Orders and dispatch
- Driver app
- CMR and delivery acts
- E-invoices
- Receivables and bank reconciliation
- Approval workflows
Our role
What Atlas BIP did
-
Billing logic
We turned how a carrier earns from waiting time into rules a machine can apply: customer zones, trips, load changes and contract free time.
-
Telematics integration
We connected Wialon GPS with tank fuel sensors for about 180 trucks, and CAN weight sensors on the part of the fleet that carries them, with learned empty weights for net cargo.
-
Platform engineering
The real-time dashboard, stop classification, demurrage calculation, nightly processing and three-way reconciliation.
-
AI automation
Invoice photo intake through a Telegram bot, AI field reading with confidence scores, business checks and a human review lane.
-
Reporting and design
A dark operations interface in Azerbaijani that adapts to phones, plus the Excel workbook and charts for management.
Stack
Built on a stack made for streams
- Interface
-
- TypeScript
- React
- Tailwind CSS
- Backend
-
- Node.js
- Fastify
- WebSockets
- Data and jobs
-
- PostgreSQL
- Redis
- Job queues
- AI and integrations
-
- Vision LLM
- Wialon
- Telegram
- Excel
Questions and answers
What carriers ask us about this platform
How does the platform tell a customer wait from an ordinary stop?
With four checks on every stop: is the truck inside a customer’s zone, is that customer on this trip, did the weight sensor show loading or unloading, and how much free time does the contract allow. Only a stop that passes all four becomes billable waiting time.
Which telematics and sensors does it work with?
It is built on Wialon GPS with tank fuel sensors and CAN weight sensors. Other telematics platforms with an API connect the same way: positions, geofences and sensor readings flow in and attach to trips.
What happens when the AI cannot read an invoice?
Nothing is guessed. Every field carries a confidence score. An unsure read goes to a second AI model, and if it is still unclear the invoice waits in the review lane with the doubtful field highlighted for a person to confirm.
Does demurrage calculation require replacing our current systems?
No. A platform like this sits next to your telematics and accounting: it reads from them, keeps its own copy of the data and adds classification, fees, reconciliation and reports on top.
Does the work with Sahil Transport continue?
Yes. The partnership continues with ATLAS BIP Logistics ERP, our logistics ERP that takes a shipment from the order to the money in the bank.
Your project
Your system is next
Tell us how orders, money and documents move through your company today. We reply within 24 hours with questions and a concrete plan.
Names, plates and figures on screens are sample data.
Back to the start