Petrol Station, Fuel Depot & LPG Distribution ERP: Automated Wet-Stock Tank Reconciliation, Pump Meter Audits, and Corporate Fleet Cards

How multi-site petrol station operators, Oil Marketing Companies (OMCs), and LPG distributors stop underground tank wet-stock losses, automate pump attendant shift handovers, track LPG cylinder assets, and run closed-loop corporate fleet fuel cards.

Why High-Volume Petrol Stations and LPG Distributors Lose Margin on Thin Spreads

Retail petroleum (PMS Super, AGO Diesel, IK Kerosene) and Liquefied Petroleum Gas (LPG) operate on razor-thin regulated per-liter margins coupled with massive daily cash and mobile-money turnover. If you operate a network of 3 to 50+ service stations, a bulk fuel depot, or an LPG cylinder refilling and distribution business, losing just 0.6% of your throughput to un-detected wet-stock shrinkage, pump attendant cash/M-Pesa manipulation, or un-returned empty LPG steel cylinders can wipe out half of a station's monthly net profit.

When station managers reconcile 6:00 AM and 6:00 PM shift handovers using paper dip-sheets and calculator tapes, three expensive blind spots occur: 1. Wet-Stock vs. Meter Variance—where underground tank dip/ATG readings decline by 10,400 liters while nozzle totalizer meters only account for 10,120 liters sold (hiding tank calibration drift, thermal contraction, delivery short-landing, or underground pipe leaks); 2. Attendant Shift Drop Float—where attendants reuse a single corporate M-Pesa Till payment message to justify two different cash drops; and 3. Corporate Credit Abuse—where paper LPOs (Local Purchase Orders) from B2B fleet customers are inflated to siphon extra fuel into private jerrycans. At devManue Energy & Downstream ERP Engineering, we build custom Petrol Station Wet-Stock, LPG Cylinder Tracking, and Corporate Fleet Fuel-Card Platforms.

1. Core Forecourt, Wet-Stock, LPG & Fleet-Card Modules & Build Costs

Our architecture connects your station forecourt, lube bay, convenience mart, and bulk depot into a single real-time headquarters control tower:

Downstream Energy Module Forecourt, Depot & Finance Deliverables Timeline Estimated Cost (USD / KES)
1. Nozzle Meter Shift Handover & Drop Reconciliation Opening/closing mechanical & electronic pump totalizer capture, calibration return-to-tank (RTT) deduction, M-Pesa Till/PDQ/Cash safe-drop matching. 2 Weeks $2,400 / KES 310,000
2. Wet-Stock Tank Ledger & Thermal Volume Correction Tank strapping table lookup (mm dip → liters), Automatic Tank Gauge (ATG) & 20°C temperature-compensated Bridger delivery reconciliation, leak alerts. 2 Weeks $2,600 / KES 340,000
3. Closed-Loop Corporate Fleet Cards & QR e-Vouchers Prepaid/postpaid B2B corporate wallets, vehicle plate & odometer validation, driver SMS/PIN/NFC fueling authorization, automated monthly eTIMS statements. 2.5 Weeks $3,000 / KES 390,000
4. LPG Cylinder Exchange, Lube Bay & Mart POS 6kg/13kg/50kg full-vs-empty cylinder asset balance per cage/dealer, outright cylinder deposit vs. refill pricing, lube bay service & convenience store POS. 1.5 Weeks $2,000 / KES 260,000

2. Deterministic Shift Nozzle Reconciliation and Wet-Stock Variance Auditing

At every shift change, the forecourt supervisor records the closing electronic/mechanical totalizer reading for every nozzle and the physical dip/ATG reading for every underground tank. Our engine computes the exact Book Closing Stock (Opening Dip Volume + Offloaded Tanker Delivery Volume − Net Metered Sales after Return-to-Tank calibration tests) and compares it against the Physical Closing Tank Dip Volume.

If the cumulative wet-stock loss on any tank exceeds the industry-standard evaporation tolerance (e.g., 0.25% for AGO Diesel or 0.35% for PMS Super), the system immediately triggers an executive SMS/WhatsApp alert to headquarters before the next fuel tanker is offloaded:

# Production Petrol Station Shift Nozzle & Underground Tank Wet-Stock Audit Engine
from decimal import Decimal, ROUND_HALF_UP
from django.db import transaction
from .models import UndergroundTank, ShiftNozzleReading, TankWetStockAuditLog

@transaction.atomic
def close_shift_and_audit_wet_stock(
    tank_id: int,
    shift_id: int,
    opening_dip_liters: Decimal,
    delivered_liters_at_20c: Decimal,
    closing_dip_liters: Decimal,
    nozzle_readings: list[dict],
) -> TankWetStockAuditLog:
    """
    Reconciles pump nozzle totalizers against underground tank physical dips,
    isolating attendant cash obligations from physical wet-stock tank variance.
    """
    q2 = lambda v: v.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
    tank = UndergroundTank.objects.select_for_update().get(id=tank_id)

    total_metered_liters = Decimal("0.00")
    total_expected_revenue_kes = Decimal("0.00")

    for nr in nozzle_readings:
        gross_dispensed = Decimal(str(nr["closing_meter"])) - Decimal(str(nr["opening_meter"]))
        rtt_calibration = Decimal(str(nr.get("rtt_liters", "0.00")))
        net_sold_liters = max(Decimal("0.00"), gross_dispensed - rtt_calibration)
        pump_price = Decimal(str(nr["unit_price_kes"]))

        total_metered_liters += q2(net_sold_liters)
        total_expected_revenue_kes += q2(net_sold_liters * pump_price)

        ShiftNozzleReading.objects.create(
            shift_id=shift_id,
            tank=tank,
            nozzle_code=nr["nozzle_code"],
            opening_meter=nr["opening_meter"],
            closing_meter=nr["closing_meter"],
            rtt_liters=rtt_calibration,
            net_liters_sold=net_sold_liters,
            expected_revenue_kes=q2(net_sold_liters * pump_price),
        )

    # Book Stock = Opening Physical Dip + Tanker Offload - Net Metered Nozzle Sales
    book_closing_liters = opening_dip_liters + delivered_liters_at_20c - total_metered_liters
    wet_stock_variance_liters = closing_dip_liters - book_closing_liters

    throughput_base = max(total_metered_liters, Decimal("1.00"))
    variance_pct = q2((wet_stock_variance_liters / throughput_base) * Decimal("100.0"))
    max_loss_tolerance_pct = Decimal("-0.35") if tank.fuel_grade == "PMS" else Decimal("-0.25")
    is_breach = variance_pct < max_loss_tolerance_pct

    return TankWetStockAuditLog.objects.create(
        tank=tank,
        shift_id=shift_id,
        opening_dip_liters=opening_dip_liters,
        delivered_liters=delivered_liters_at_20c,
        metered_sales_liters=total_metered_liters,
        book_closing_liters=book_closing_liters,
        physical_closing_liters=closing_dip_liters,
        variance_liters=wet_stock_variance_liters,
        variance_pct=variance_pct,
        is_tolerance_breach=is_breach,
    )

3. Replacing Paper Fuel LPOs with Tamper-Proof Corporate Fleet Wallets

Corporate B2B fleet accounts (schools, logistics companies, factories, county vehicles) bring steady volume to your stations—but paper LPO booklets are rife with fraud. Our built-in Corporate Fleet Fueling Portal lets your B2B clients top up a prepaid wallet (or operate within an approved credit limit), register their vehicle plates and fuel-grade restrictions, and authorize fueling via a Driver One-Time QR/SMS Voucher or NFC Tag. The pump attendant enters the vehicle's current odometer reading and snaps a photo of the number plate, and the corporate client's fleet manager receives an instant WhatsApp/email receipt showing exact liters fueled and real-time kilometers-per-liter (km/L) efficiency!

Managing high-frequency telemetry and multi-branch POS streams? Size your ingestion workers with our Bulk Ingestion & Queue Planner or book a 30-Minute Energy & Forecourt ERP Discovery Call.

4. Frequently Asked Questions (FAQ)

Can the system integrate directly with electronic Forecourt Controllers (DOMS, Fusion, PTS-2) and KRA eTIMS?

Yes. For automated stations equipped with PTS-2, Wayne Fusion, or Gilbarco DOMS forecourt controllers and ATG tank probes, our local edge agent streams pump transactions and tank levels automatically and signs every fuel receipt through KRA eTIMS OSCU/VSCU in real time. For stations without electronic controllers, supervisors can enter shift totalizer and dip readings with photo proof on a rugged tablet.

How does the LPG module prevent delivery drivers or cage attendants from losing empty steel cylinders?

Every LPG transaction is tracked across two parallel ledgers: the Gas Contents Ledger (kg) and the Steel Cylinder Asset Ledger (6kg / 13kg / 50kg shells). A refill sale requires a 1-for-1 empty cylinder return of the same brand/valve type, while an outright cylinder sale automatically charges the refundable steel deposit fee.

What happens when EPRA or the energy regulator announces new monthly pump prices at midnight on the 14th?

You can schedule the new regional pump prices in advance from headquarters. At midnight, the system prompts a mandatory cut-off meter & dip snapshot across all branches, calculates your exact inventory revaluation gain or loss on stock in the ground, and activates the new prices seamlessly.

Architectural Continuity & Deep Dives

For related production architectures and system implementations, explore these companion guides:

// Custom Engineering • Project Scope & Architecture Roadmap

Planning a Custom Software Build, MVP, or Business Modernization?

Avoid agency markups, endless scoping delays, and technical debt. We partner with founders and enterprise leaders to deliver high-velocity, production-hardened web platforms with fixed-scope milestone guarantees.

All Insights
Chat on WhatsApp