Feature · Fuel & meter

Fuel and meter tracking that handles mixed fleets — diesel, gas, BEV, PHEV, reefer.

Capture every fill, every charging session, every reading. MPG and $/mile that pair correctly across multi-tank reefers. Anomaly detection that explains itself. Immutable audit trail that holds up under audit.

Multi-tank · multi-meter · multi-currency Charging sessions · Scope 2 CO₂ rollup Append-only · audit-safe
app.fleetservice365.com/fuel/dashboard
FUEL HISTORY · ALL ASSETS
Fleet fuel & charging · 30-day window
187 assets USD · GAL
Total spend
$184,720
▲ +3.2% Apr 2026 · 30d
Fleet MPG
7.84
▼ −0.4% gal-denom · ICE only
$ / mile
$0.512
▲ +1.8% across 187 assets
CO₂ · t
462.4
▼ −1.1% Scope 1 + 2 combined
Fuel-type mix · gal-equiv
Diesel 58%
Gasoline 22%
Electric · kWh 14%
CNG 6%
Daily spend · last 15 days
 day with flagged fill
Mar 28 Apr 11
Anomalies · explainable 2 of 1,847 fills
PRICE
$6.42/gal vs 90-day median $4.66/gal
FE-018421 · TRK-17
+38%
MPG
3.9 MPG vs 90-day median 6.4 MPG
FE-018407 · TRK-31
−39%
Silent assets 3
TRK-08 last fill · 32d ago
TRK-44 last fill · 21d ago
TRL-12 last fill · 47d ago
One domain, six fuel types gasoline · diesel · CNG · LPG · electric · hydrogen — per asset, per tank
Diesel gal · $/gal
Gasoline gal · $/gal
Electric kWh · $/kWh
CNG GGE · $/GGE
LPG gal · $/gal
Hydrogen kg · $/kg
What’s broken today

Fuel modules built for one tank, one meter, one fuel type don’t fit a real fleet.

01
MPG that lies.

A reefer tractor with two diesel tanks has its reefer fills counted against tractor MPG. Result: the rig “gets 4 MPG” and your fleet manager is permanently confused.

02
“Why is this entry flagged?”

Competitors flag outliers without explaining them. You waste 20 minutes a week figuring out which entry the system thinks is weird, and why.

03
Editable fuel entries.

When you can change historical fuel data, the audit trail is whatever the last edit says. Insurance carriers and accounting auditors don’t accept that.

What’s behind it Shipped today

Eight pieces. Each does one job, and admits what it doesn’t do.

Direct fuel-card ingestion (WEX, Comdata, Voyager) is roadmap. MPGe for CNG / LNG / Electric on the fleet KPI is v2 — gal-denominated MPG is what’s live today, and per-asset drill-down already shows MPGe. Everything below is in the product now.

Fuel entries
Asset, fuel_type, vendor, filled_at, quantity, unit_price. Multi-currency. Multi-fuel. Per-asset, per-tank.
gasoline · diesel · CNG · LPG · electric · H₂
Charging sessions
Separate domain. kWh delivered, started/ended, charger location, cost. Scope 2 CO₂ rolls up via the tenant's grid factor.
charging_session · kWh
First-class meters
Unlimited named meters per asset. Categories: odometer, engine_hours, aux_hours, energy_consumed, soc_percent, fuel_level_percent, custom.
7 categories · per asset
"Primary" + "fuel capable" flags
Each meter has a category, unit, a primary flag (one per category) and a fuel-capable flag (any number). Multi-tank assets stay coherent.
primary · fuel_capable
Fuel History Dashboard
7 KPI cards, donut breakdowns (fuel-type mix, vendor mix), spend / volume / fill-count timeseries, silent-asset panel.
/fuel/dashboard
Explainable anomalies
Every flagged row returns { value, comparedTo, deviation, explanation } — two transparent rules, no black box, no ML.
price · paired-MPG z-score
Immutable calc-bearing fields
quantity, unit_price, total_cost, primary_meter_reading. Edits create events, never overwrites. Voids preserve the row.
append-only · INSERT only
Silent-asset panel
Assets that haven't reported a fill or charge in N days. Catches the 4 trucks nobody noticed slipped out of the fuel program.
last_filled_at · gap_days
Deep dive · 01 Shipped

Multi-tank assets — MPG that’s actually correct.

A reefer tractor has three meters (odometer, engine hours, reefer unit hours) and two fuel-capable meters (odometer + reefer unit). Tractor fills track against the tractor meter chain. Reefer fills track against the reefer meter chain. Tractor MPG stays clean. Reefer gallons-per-hour stays clean. No spreadsheet required.

  • Each tank knows its meter. A fuel entry is bound to a specific meter_id, not “the asset.” A diesel fill at the truck stop goes onto the odometer chain; a reefer fill from the same pump goes onto the reefer-hours chain.
  • Tractor MPG · reefer GPH. Tractor distance ÷ tractor fuel = 7.43 mi/gal. Reefer hours ÷ reefer fuel = 0.68 gal/hr. Both are honest because the math never crosses chains.
  • Naive single-tank MPG. If you blender every fill against the tractor odometer (the Fleetio default) the rig posts a phantom ≈ 4.05 MPG. Fleet manager is now permanently confused.
  • Works the same way for excavators. Engine hours + aux hours + a hydraulic tank. The rule “one fuel-capable flag per consuming meter” is the whole model.
  • Per-asset rates roll up to fleet KPIs. ICE assets contribute MPG; EVs contribute kWh/mi; reefers contribute GPH. Per-asset drill-down shows MPGe where applicable.
ASSET · TRK-17 · REEFER TRACTOR
Three meters, two fuel-capable, zero MPG contamination
Pair-checked
Meters on this asset
Odometer
category · odometer · mi
PRIMARY FUEL-CAPABLE 82,417mi
Engine hours
category · engine_hours · hr
PRIMARY 4,182.6hr
Reefer unit hours
category · aux_hours · hr
FUEL-CAPABLE 2,914.2hr
Tractor chain tank A → odometer
Apr 11 38.4g $3.42 82,417mi
Apr 06 41.2g $3.39 82,134mi
Apr 02 39.8g $3.41 81,820mi
Tractor MPG 7.43 mi/gal
Reefer chain tank B → reefer hrs
Apr 11 12.7g $3.42 2,914.2hr
Apr 08 11.4g $3.40 2,896.8hr
Apr 04 13.2g $3.41 2,878.1hr
Reefer GPH 0.68 gal/hr
Naive MPG (one tank, all fills) ≈ 4.05 ← what Fleetio would show no spreadsheet · no workaround
ANOMALY API · /fuel/anomalies
Every flagged row returns its comparison
{ value, comparedTo, deviation, explanation }
● FLAGGED FE-018421 · TRK-17 Apr 11 · 09:18
PRICE · 90-day vendor median
value
$6.42 / gal
comparedTo
$4.66 / gal
deviation
+38%
explanation: $6.42/gal is 38% above the 90-day median at Shell.
● FLAGGED FE-018407 · TRK-31 Apr 10 · 16:02
MPG · paired z-score · 30-day
value
3.9 MPG
comparedTo
6.4 MPG · σ 0.84
deviation
z = −3.0
explanation: 3.9 MPG is 3.0 σ below TRK-31’s 30-day mean (likely missed fill or odo).
○ CLEAR FE-018388 · TRK-22 Apr 09 · 07:44
PRICE · 90-day vendor median
value
$3.91 / gal
comparedTo
$3.88 / gal
deviation
+0.8%
explanation: $3.91/gal is within 1% of the 90-day median at Pilot — not flagged.
Deep dive · 02 Shipped

Explainable anomaly scoring — auditors love it.

Two transparent rules — a price-vs-vendor-90-day-median rule, and a paired-MPG z-score rule. Every flagged row returns the comparison value, the deviation, and a human-readable explanation. No black box, no ML, no “trust us.”

  • Structured payload. Every anomaly returns the same shape: { value, comparedTo, deviation, explanation }. The UI shows it. Your reports show it. An auditor can read it.
  • Rule 1 · vendor price. Compare an entry’s unit_price against the 90-day median at the same vendor. A USD 6.42/gal fill at Shell, when the 90-day median at Shell is USD 4.66, is a real anomaly — not a “the model thinks so” anomaly.
  • Rule 2 · paired MPG. Z-score the asset’s computed MPG for this fill against its own 30-day mean and standard deviation. A 3 σ miss means a missed fill, a misread odometer, or a real fuel issue — all worth a human glance.
  • Two rules, no more. We deliberately did not ship a 12-factor “AI risk score.” Two rules you can explain over a phone call beat a model you can’t.
  • Clear results returned too. Entries that pass also carry the comparison they were measured against — so your accounting team can sanity-check the rules, not just the flags.
Deep dive · 03 Shipped

Immutable fuel audit history — reconciliation that doesn’t fight you.

Calculation-bearing fields — quantity, unit price, total cost, primary meter reading — are immutable. Edits create an audit event, not a silent overwrite. Voids preserve the row but exclude it from rollups. Reconciliation against vendor statements is fast because the data hasn’t moved.

  • Four immutable fields. quantity, unit_price, total_cost, primary_meter_reading. These are what every downstream number — MPG, $/mile, CO₂, vendor reconciliation — depends on, so they can’t be quietly rewritten.
  • Edits are events. A correction to a quantity inserts a row in fuel_entry_event with before / after, the actor, and a reason. The original value stays visible — auditors see what changed and why.
  • Voids preserve the row. Duplicate fills get voided, not deleted. The row stays for the audit trail; rollups skip it. Insurance carriers and accounting auditors get a record that doesn’t move.
  • Reconciliation in one pass. Pull a vendor statement, match against the immutable totals — there’s nothing for them to argue with, because the numbers haven’t shifted since the entry was created.
  • 2,000 monthly fills, no drama. A regional gas-station chain auditor reconciling 2,000 fills a month against vendor statements doesn’t have to chase down “but this entry was edited last Tuesday” — that case doesn’t exist here.
FUEL ENTRY · FE-018392
Edits are events, not overwrites
VOIDED
Immutable fields quantity unit_price total_cost primary_meter_reading
CREATED Auto · Pilot card webhook Apr 03 · 14:21
quantity 38.4 gal
unit_price $3.41 / gal
total_cost $130.94
primary_meter 81,820 mi
EDITED sarah.m · accounting Apr 05 · 09:42
Vendor receipt shows 38.94 gal — corrected.
quantity 38.4 gal 38.94 gal
total_cost $130.94 $132.79
VOIDED sarah.m · accounting Apr 09 · 11:08
Duplicate of FE-018388. Excluded from rollups; row preserved.
INSERT fuel_entry_event · NEVER UPDATE excluded from rollups · row preserved
Compare

Fleet Service 365 vs. Fleetio.

Where fuel and meter tracking diverges — and why the difference matters the first time you reconcile 2,000 fills against a vendor statement, or your fleet director asks why the reefer tractor is “doing 4 MPG.”

Capability Fleet Service 365 Fleetio
Multi-meter assets (reefer, excavator) Single primary meter
Multi-tank fuel tracking Workaround
Explainable anomaly detection {value, comparedTo, …} Flagged only
Immutable calculation-bearing fields Editable
Visible audit trail (edits + voids) Limited
Multi-currency native Single
Scope 1 + Scope 2 CO₂ rollup Add-on
Silent-asset panel
See full comparison → Comparison based on publicly listed Fleetio capabilities as of May 2026.
Use cases

Three fleets, one fuel domain.

Reefer logistics
Frosty Logistics’ 40 reefer tractors.
Tractor fills go on the tractor chain. Reefer fills go on the reefer chain. Tractor MPG stays clean; reefer GPH stays clean. No spreadsheet, no manual splitting, no “why is this rig 4 MPG?” thread.
Assets · 40 reefer tractors Tractor MPG · clean Reefer GPH · clean
Accounting · reconciliation
2,000 monthly fills against a vendor statement.
A regional gas-station chain auditor reconciles 2,000 fills against vendor statements every month. Immutable history means the data doesn’t move during reconciliation. Mismatches are real mismatches, not “someone edited Tuesday.”
Fills / month · ~2,000 Drift events · 0 Pass / fail · deterministic
Mixed BEV + ICE
A logistics fleet running mixed BEV + ICE.
Fleet-level KPI cards show the ICE-vs-EV CO₂ split. Per-asset rates show $/mile for ICE and cost/kWh for BEV. Scope 1 + Scope 2 roll up natively. No third-party sustainability platform required.
BEV · $/kWh · kWh/mi ICE · $/mi · MPG CO₂ · Scope 1 + 2
FAQ

Questions we hear a lot.

Does the system support fuel cards (WEX, Comdata, Voyager)?
Yes — and not yet. You can import fuel-card transactions today via CSV upload, the public API, or the import wizard, and the fields map directly to the fuel_entry schema. Direct webhook ingestion for WEX, Comdata, and Voyager is on the roadmap — when it ships, the underlying data model doesn’t change, so the import history you build today stays valid.
How does MPG work for vehicles with multiple meters?
Each asset can have unlimited meters with categories (odometer, engine_hours, aux_hours, energy_consumed, soc_percent, fuel_level_percent, custom). Each meter has a “primary” flag (one per category) and a “fuel capable” flag (any number). A fuel entry is bound to a specific meter_id, not the asset — so a reefer tractor’s tractor fills track tractor MPG against the odometer, and reefer fills track reefer GPH against the reefer-unit-hour meter. No cross-contamination.
Can I track EV charging sessions and fuel fills in the same view?
Yes. Charging is its own domain (kWh delivered, started/ended, charger location, cost) but it rolls up into the same Fuel History Dashboard alongside fuel fills. The fuel-type mix donut shows diesel, gasoline, electric (kWh), CNG, LPG, and hydrogen side-by-side. Per-asset drill-down shows $/mile for ICE and cost/kWh for BEV, with MPGe where applicable.
What happens when I edit a fuel entry — is there an audit trail?
The four calculation-bearing fields — quantity, unit_price, total_cost, primary_meter_reading — are immutable. An “edit” is actually an event inserted into fuel_entry_event with before / after values, the actor, and a reason. The original value stays visible. A void preserves the row (excluded from rollups) and is also recorded. Auditors see the full history; nothing is silently overwritten.
How does the anomaly detection decide what’s anomalous?
Two transparent rules. Rule 1 compares an entry’s unit_price against the 90-day median at the same vendor — anything that deviates significantly is flagged with the deviation and the comparison. Rule 2 is a paired-MPG z-score: the asset’s computed MPG for this fill against its own 30-day mean and σ — a 3 σ miss is flagged. Every flagged row returns { value, comparedTo, deviation, explanation } so the UI can show “$6.42/gal is 38% above the 90-day median at Shell.” No black box.
Does the system support multiple currencies?
Yes — multi-currency is native, not an add-on. Each fuel entry stores its unit_price in the currency it was paid in, alongside the tenant’s reporting currency. Vendor reconciliation happens in the source currency; fleet rollups happen in the reporting currency. FX is captured at the time of entry so historical numbers don’t drift when rates change.
Can my AI assistant ask “which truck is worst on MPG this quarter”?
Yes. The Fuel History API exposes per-asset MPG, $/mile, cost-per-kWh, gallons-per-hour, and the same KPI cards the dashboard renders — sliced by quarter, fuel type, or vendor. An assistant can ask “rank assets by MPG over Q1, ICE diesel only, exclude voided entries” and get a deterministic answer with the comparison values included.

Clean MPG. Honest anomalies. Audit-grade history.

14-day free trial. No credit card. A seeded reefer tractor with two tanks and three meters already in your trial tenant — see exactly what clean tractor MPG and reefer GPH look like, side by side.