Skip to content
Industry · Fleet management module

Fleet management software that sits next to your accounts, not in another tab

Your trackers know where the vans are. Your accounts know what fuel and repairs cost. Neither can tell you what each van costs per kilometre without a spreadsheet and a free afternoon. Fleet management software built inside ERPNext or Odoo joins those up. Describe your vehicles, cards and service rules, and erpfly writes the module.

ERPNext v16

Works with ERPNext v15 and v16, and Odoo 17, 18 and 19.

Features

What your fleet management module can do

Fuel card statements matched automatically

Upload the weekly CSV and each line lands on the right vehicle by card number. Lines that don't match wait in a short queue for someone to assign.

Odometers that make sense

A reading lower than the last one is rejected on entry, which keeps consumption figures and service reminders from going haywire.

Consumption outliers flagged

Each vehicle is compared with its own recent average, not the fleet's. A van suddenly using far more fuel than usual gets a flag and a ToDo.

Reminders before things lapse

Insurance, registration, inspections and distance-based services all raise reminders ahead of time, to the person who actually books them.

Cost per vehicle, per kilometre

Fuel, repairs, tyres, lease payments and depreciation roll up per vehicle, so the replace-or-keep conversation uses numbers.

The output

What actually gets generated

Real files in a real repository. Here’s the typical output when someone asks for fleet management.

ERPNext / Frappe app

  • Custom fields on Vehicle (fuel card number, service interval)
  • Fuel Card Import DocType with row matching
  • Extra validation on Vehicle Log (doc_events)
  • Scheduled insurance and service reminders in hooks.py
  • Cost per kilometre Script Report

Odoo addon

  • fleet.fuel.log model with odometer checks
  • fleet.vehicle inheritance with service interval and consumption fields
  • fleet.vehicle.odometer records written from each fill-up
  • ir.cron import from the telematics provider's API
  • List and graph views per vehicle (list views on Odoo 18+)
van_fleet/models/fleet_fuel_log.py
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError

class FleetFuelLog(models.Model):
    _name = "fleet.fuel.log"
    _description = "Fuel fill-up"
    _order = "date desc, id desc"

    vehicle_id = fields.Many2one("fleet.vehicle", required=True, ondelete="cascade")
    driver_id = fields.Many2one(related="vehicle_id.driver_id", store=True)
    date = fields.Date(required=True, default=fields.Date.context_today)
    liters = fields.Float(required=True)
    odometer = fields.Float(required=True)
    amount = fields.Monetary(currency_field="currency_id")
    currency_id = fields.Many2one(related="vehicle_id.company_id.currency_id")
    card_reference = fields.Char(index=True)

    @api.constrains("odometer", "vehicle_id", "date")
    def _check_odometer(self):
        Odometer = self.env["fleet.vehicle.odometer"]
        for log in self:
            last = Odometer.search([("vehicle_id", "=", log.vehicle_id.id), ("date", "<", log.date)],
                                   order="date desc, value desc", limit=1)
            if last and log.odometer < last.value:
                raise ValidationError(_("%(plate)s: %(new)s is below the last reading of %(old)s.",
                                        plate=log.vehicle_id.license_plate, new=log.odometer, old=last.value))

    @api.model_create_multi
    def create(self, vals_list):
        logs = super().create(vals_list)
        for log in logs:
            self.env["fleet.vehicle.odometer"].create(
                {"vehicle_id": log.vehicle_id.id, "date": log.date, "value": log.odometer})
        return logs
Trimmed excerpt. The full module includes tests, fixtures and a README.

How it works

From a paragraph to a pull request

The long version
  1. 01

    Describe it

    In your own words. Paste the spreadsheet or a photo of the paper form if that's easier.

  2. 02

    Answer a couple of questions

    It asks only what it can't work out from your setup, like who's allowed to override.

  3. 03

    Try it on a sandbox

    A copy of your site with the module installed. Break it, then ask for changes.

  4. 04

    Merge when it's right

    Code lands as a pull request with tests. Your developer, or ours, reviews it first.

What fleet management software is really for

Fleet management software gets sold on maps. Little van icons moving across a city look great in a demo. But the questions a finance director or operations manager actually asks are duller. Which vehicles cost too much to run? Is anyone’s fuel card being used for their own car? Which van is overdue for a service, and whose job was it to book it?

Those are ERP questions. The data sits in purchase invoices, fuel card statements and odometer readings. It only needs to meet in one place.

What’s already in ERPNext and Odoo

In ERPNext, the Vehicle DocType holds make, model, registration, insurance details and last odometer, and Delivery Trip uses it for routes. Vehicle Log, which now lives in the HRMS app, records odometer, fuel and service costs and can raise an Expense Claim for the driver. It’s a decent base that stops short of fuel cards, consumption checks and distance-based reminders.

In Odoo, the Fleet app is part of Community. It has fleet.vehicle, vehicle models, contracts with renewal alerts, services and fleet.vehicle.odometer. Odoo dropped its dedicated fuel log several versions back, so fill-ups usually end up recorded as services. That works, but it’s awkward to report on. The snippet on this page adds a proper fuel log model instead.

Neither platform tries to be a telematics system. We don’t think it should.

What erpfly writes goes in its own Frappe app or Odoo addon. Custom fields ship as fixtures or model inheritance, the import lives in its own DocType or model with a clear log of which rows matched, and reminders run as scheduled jobs rather than someone’s calendar. Nothing touches core files, so the standard Fleet or Vehicle screens keep working after an upgrade.

Worked example: 26 vehicles and a fuel card statement

A regional distributor runs 22 vans and 4 rigid trucks. Every van has a fuel card. The card provider emails a CSV each Monday with around 150 lines.

The office uploads it. Each line matches a vehicle by card number. Two lines don’t match, because a card was replaced last week, so those two wait for someone to assign them. That takes a minute.

Van 14 normally averages 11 litres per 100 km. Its latest fill was 60 litres after 400 km, which is 15 L/100 km. The flag threshold is 25% above its own 90 day average, so 13.75. It’s over. The fleet coordinator gets a ToDo with the last three fill-ups attached. Maybe a tyre is soft. Maybe the card went on a family trip. Either way, somebody looks this week, not at year end.

Meanwhile the scheduled job notices van 6 is at 44,100 km with its last service at 30,000. That’s 900 km short of the 15,000 km interval and inside the 1,000 km warning, so the coordinator gets a reminder to book the workshop. Truck 2’s insurance ends in 30 days and the renewal reminder goes out the same night.

At the end of the quarter the cost report does the arithmetic the coordinator used to do by hand. Van 14 covered 9,800 km. Fuel came to $2,100, repairs to $640 and lease payments to $1,350. That’s $4,090, or about 42 cents a kilometre. The fleet average is lower, and now there’s a reason to ask whether van 14 should be the next one replaced.

Things we’d talk you out of

Rebuilding the tracker inside your ERP, for a start. Live positions every 30 seconds will bloat your database and duplicate a product you already pay for. Pull daily totals and move on.

Route optimisation is its own discipline. If you need it, buy a routing tool and send the resulting trips into the ERP.

And if you have three company cars, you don’t need fleet software at all. A recurring calendar reminder and a folder of receipts will do.

Where fleet data flows next

Vehicles are assets first, so the purchase, depreciation and disposal side belongs in asset management. Driver fuel receipts and tolls that don’t go on a card end up in expense management. Companies running vans for deliveries should read our notes on logistics businesses, which cover delivery trips and proof of delivery.

Running Odoo and want the fuel log added to your current Fleet setup? See how we approach Odoo customization.

Guides and terms for fleet management

Fleet management module questions

Something missing? Email hello@erpfly.com and a person will answer.

Can it pull data from our GPS trackers?

If your tracker vendor has an API, yes. A scheduled job pulls daily odometer readings, engine hours or trip distances and writes them against each vehicle. We'd keep live maps and geofencing in the tracker's own app, since that's what it's built for.

Is fleet management part of Odoo Community?

Yes. The Fleet app, with vehicles, contracts, services and odometer readings, is in Community. We extend it rather than build a parallel vehicle model.

Where does fleet live in ERPNext now?

The Vehicle DocType is used across ERPNext, for example on Delivery Trip, while Vehicle Log moved to the HRMS app when HR was split out. If you don't run HRMS, we can put a smaller log DocType in your own app instead.

Can drivers log fuel and mileage from their phones?

Yes, through a short mobile-friendly form or the Odoo mobile app. If you have fuel cards, though, importing the statement beats asking drivers to type receipts at the pump.

We track the fleet in spreadsheets today. How hard is the move?

Not very. Vehicles, registration dates, insurance, lease contracts and last known odometer come across through an import script. Historic fuel data is optional, but three months of it gives the consumption flags a baseline from day one.

Will the module break when we upgrade?

It lives in its own app or addon and never edits core files. Fleet models don't change much between versions, and the included tests will point at anything that did.

Your next module is one paragraph away

Write it the way you’d explain it to a new hire. We’ll turn it into an app you can read, test and install.

ERPNext v16

Create your account

Free to start. No card needed.

By signing up you agree to our terms and privacy policy.