Skip to content
Book a technical review
Aerial night view of a city road interchange: sweeping orange-lit flyover curves and slip roads over near-black ground, dissolving into darkness at the edges

Putting a logistics fleet on ERPNext: vehicles, fuel, and maintenance in one system

Softwise built fleet and park management on top of ERPNext for a road-freight company in Tunis running a mixed truck and van fleet. GPS telematics, fuel card transactions, and workshop maintenance were pulled into the ERP the company already used for accounting, so each vehicle carries one running cost figure instead of being tracked across a telematics portal, a fuel supplier statement, and a workshop notebook. Preventive maintenance is scheduled from real odometer readings rather than from memory.

Context

The client and the problem

Anonymized by design: industry and city, not names. The shape of the problem is the point.

The client

A road-freight and distribution company in Tunis running a mixed fleet of trucks and delivery vans across domestic routes. Accounting already ran on ERPNext. Everything about the vehicles themselves did not: positions lived in the telematics provider's web portal, fuel in monthly supplier statements, maintenance in the workshop manager's own spreadsheet, and insurance and vignette renewal dates in a wall calendar.

The problem

Nobody could answer what a single truck cost to run. The data existed, in four places that never agreed and were reconciled by hand at month end, when it was already too late to act on. Preventive maintenance was scheduled from memory rather than from odometer readings, so servicing happened late and roadside breakdowns were treated as bad luck rather than as a missed interval.

The constraints

ERPNext stays the system of record. Accounting, suppliers, and customer invoicing already ran in ERPNext and the finance team had no appetite for a second system. Fleet data had to land inside the ERP, as ERP documents, not in a satellite tool with its own login and its own version of the truth.

Drivers will not use a complicated app. Drivers are on the road, often in low-signal areas, frequently wearing gloves. Anything requiring more than a photo and a number would simply not get filled in, and a fleet system nobody enters data into is a report that lies.

The telematics contract was not up for renegotiation. The GPS units were already installed under a running contract with a provider whose API is what it is. The integration had to work with the provider's existing polling API and its rate limits rather than assuming a webhook feed that was never on offer.

Build

What we built

Decisions, not adjectives. Each one had an alternative we rejected.

Vehicles as first-class ERP records

Each vehicle, trailer, and piece of yard equipment became an ERPNext asset record carrying its registration, acquisition cost, depreciation schedule, insurance and technical-inspection expiry, and current odometer. Cost lines from fuel, maintenance, and parts post against that record, so the running cost of a vehicle is a report in the ERP rather than an exercise in spreadsheet archaeology.

Telematics polled, not trusted blindly

A Node.js connector polls the telematics provider on a schedule and writes trip distance, engine hours, and odometer readings into ERPNext through a PostgreSQL queue with idempotency keys. Readings that jump implausibly, a common failure when a GPS unit reconnects after a dead zone, are flagged for review instead of silently corrupting the maintenance schedule they feed.

Fuel reconciled against distance actually driven

Fuel card transactions import and match to vehicle and driver by card number and timestamp. Litres are compared against the distance the telematics recorded for the same period, so a consumption figure that drifts away from a vehicle's own baseline surfaces as an exception, whether the cause is a mechanical fault or a fuelling that never reached the tank.

Maintenance scheduled from odometer, not memory

Preventive maintenance plans are defined per vehicle type in kilometres and engine hours. The odometer feed triggers a maintenance work order in ERPNext before the interval is passed, with parts drawn from ERP stock so a service consumes inventory and posts cost like any other operation. The workshop spreadsheet was retired rather than integrated.

A driver app that asks for almost nothing

Drivers confirm a trip, photograph a fuel receipt or delivery note, and report a defect from one screen. Submissions queue on the device and sync when signal returns, because the alternative on a domestic freight route is data that is simply never captured. A reported defect opens a workshop request against that vehicle immediately.

Expiry dates that chase people

Insurance, technical inspection, vignette, and driver licence expiry dates live on the ERP records and generate escalating notifications ahead of the date. An immobilised truck at a roadside check costs a day of revenue; the renewal that prevents it costs an email nobody had been sending.

ERPNext fleet management: telematics, fuel, and maintenance in one ERPThree external sources feed one ERP. GPS telematics units are polled on a schedule for trips, engine hours, and odometer readings; fuel card transactions import from the supplier; and drivers submit trip confirmations, receipt photos, and defect reports from a one-screen mobile app that queues offline. A Node.js connector writes everything into ERPNext through a PostgreSQL queue with idempotency keys, so a retried request cannot double-count a trip, and a plausibility check flags impossible odometer jumps for review instead of writing them through. Inside ERPNext each vehicle is an asset record carrying registration, depreciation, document expiry dates, and its current odometer. Odometer readings drive preventive maintenance work orders that draw parts from ERP stock, fuel litres are reconciled against distance actually driven, and document expiry dates raise renewal alerts. Cost per vehicle and cost per kilometre are standing ERP reports rather than a month-end reconciliation. Hover or tap a component to trace its connections.INSIDE THE ERP THAT ALREADY RAN THE ACCOUNTStrips · engine hours · odometerlitres · card · timestamptrip · receipt · defectenqueue writesdrain + retryodometer readingsREST writesaccepted readingsasset per vehicleodometer due?work order draws partsservices vehicledefect opens work ordercost lines postparts + labourdistance drivenfuel litresrenewal datesGPS telematicsexisting units · polling APIFuel cardssupplier transactionsDriver appone screen · queues offlineWorkshopmechanics · partsConnectorNode.js · one per sourcePostgreSQL queueidempotency keys · retriesPlausibility checkimpossible odometer jumps heldERPNextFrappe · system of recordVehicle asset recordregistration · odometer · depreciationPreventive maintenancekm + engine-hour intervalsERP stockparts consumed by work ordersCost per vehiclefuel + parts + depreciationFuel reconciliationlitres vs distance drivenDocument expiryinsurance · inspection · vignetteone running cost per vehicle instead of four sources reconciled by hand at month end
ERPNext fleet management topology for the Tunis road-freight company: GPS telematics, fuel card transactions, and a one-screen driver app all write into ERPNext through a Node.js connector and an idempotent PostgreSQL queue, with a plausibility check holding impossible odometer jumps. Inside the ERP each vehicle is an asset record whose odometer drives preventive maintenance work orders against ERP stock, so cost per vehicle and cost per kilometre are standing reports instead of a month-end reconciliation.
Approach

How the engagement ran

Delivery order matters as much as what was built. Each phase had to be safe to stop on.

  1. /001/

    Phase 1 — Vehicle register and one honest baseline

    Before any automation, every vehicle was entered as an ERP asset with its real acquisition data, current odometer, and document expiry dates. Reconciling that register against the four existing sources was itself the first deliverable: it was the first time the fleet's actual composition and document status were visible in one place.

  2. /002/

    Phase 2 — Telematics feed and fuel import

    The polling connector and the fuel-card import ran into the ERP while the manual month-end reconciliation continued in parallel. Both were compared for a full billing cycle, and the discrepancies found were fixed in the connector before anyone was asked to stop reconciling by hand.

  3. /003/

    Phase 3 — Preventive maintenance go-live

    Maintenance plans were defined per vehicle type and run in advisory mode first, generating proposed work orders that the workshop manager accepted or rejected. That feedback tuned the intervals before the schedule was allowed to create work orders on its own.

  4. /004/

    Phase 4 — Driver app and defect reporting

    The driver app shipped last, once the data behind it was trustworthy, and rolled out route by route. Defect reporting was the feature that earned adoption: drivers reported problems because reporting them visibly produced a workshop response.

Outcomes

Results and key facts

Qualitative outcomes and engagement shape, without invented numbers.

One running cost per vehicle

Fuel, maintenance, parts, and depreciation post against the same asset record, so cost per vehicle and cost per kilometre are standing ERP reports. The month-end reconciliation between the telematics portal, the fuel statement, and the workshop spreadsheet no longer happens, because the three sources now write to one place.

Servicing happens on the interval

Work orders are raised from odometer readings before the interval is passed rather than after a driver mentions a noise. Maintenance moved from reactive to scheduled, which is visible in the workshop's own planning: services now appear in the week they were predicted.

No more expired documents

Insurance, inspection, and vignette renewals are driven by notifications from the ERP record instead of by a wall calendar. The category of incident where a vehicle is stopped at a roadside check over an expired document is now a process failure with an owner, not an accepted cost of operating.

Fuel exceptions surface in days, not months

Consumption that drifts from a vehicle's own baseline raises an exception while the trips are recent enough to investigate. Whether the cause turns out to be a mechanical fault or a fuelling discrepancy, it is found within the week rather than inside a month-end total.

Engagement
Build, then ongoing support
Team
In-house Softwise engineers, no subcontractors
Stack
ERPNext (Frappe), Node.js connector, PostgreSQL queue, driver mobile app
Integrations
GPS telematics provider API, fuel card transaction import
Scope
Vehicle register, telematics feed, fuel reconciliation, preventive maintenance, document expiry alerts
Outcome
Four disconnected sources consolidated into ERPNext, maintenance moved from reactive to odometer-scheduled
FAQs

Questions about this erp · fleet management project.

The questions this project is usually asked about. Still stuck? Ask us directly.

Yes. ERPNext already models assets, maintenance, stock, and purchasing, which is most of what fleet management needs. What it does not do out of the box is ingest telematics and fuel card data, so the integration work is connecting those feeds to vehicle asset records and driving maintenance schedules from real odometer readings rather than manual entry.

Dedicated fleet software is good at vehicles and disconnected from money. If accounting already runs in an ERP, a separate fleet tool means vehicle costs live outside the system that reports company costs, and the two are reconciled by hand. Integrating into the ERP makes cost per vehicle a report instead of a monthly exercise. If a company has no ERP, dedicated fleet software is usually the better answer.

Through a connector that polls the telematics provider's API on a schedule and writes trips, engine hours, and odometer readings into the ERP via a queue with idempotency keys, so a retry after a timeout cannot double-count a trip. Readings that move implausibly, typically after a GPS unit reconnects following a dead zone, are flagged for review rather than written straight through.

Maintenance plans are defined per vehicle type in kilometres and engine hours. Each new odometer reading is checked against the vehicle's next due interval, and a work order is raised in the ERP before the interval is passed, drawing parts from ERP stock so the service posts cost like any other operation.

Only if it asks for very little. This one is one screen: confirm a trip, photograph a receipt or delivery note, report a defect. Submissions queue offline and sync when signal returns, which matters on domestic freight routes. Adoption came from defect reporting, because drivers could see that a reported problem produced a workshop response.

Yes. The same pattern covers trailers, forklifts, and yard equipment: anything that accrues usage, needs servicing on an interval, and carries cost. Equipment without a GPS unit uses engine hours or manual readings instead of a telematics feed, and the maintenance scheduling is unchanged.