Logistics Module
The Logistics module is the core of ERP Tanzania, covering the full freight lifecycle from job creation to invoice settlement.
Key concepts
| Concept | Description |
|---|---|
| Customer | The company that has engaged you to move goods |
| Job | A freight engagement — one customer, one contract |
| Trip | A physical truck movement under a job. One job can have multiple trips |
| Route | A defined origin-to-destination corridor with checkpoints |
| Expense | A cost charged to a job or one of its trips (fuel, toll, allowance, etc.) |
| Invoice | A VAT-compliant invoice issued to the customer for the job |
| Quotation | A priced offer sent to a client before a job is confirmed |
Customer, vendor, job, trip, truck, driver and route fields are searchable — click the field and start typing. Where you see + New Customer or + New Vendor at the bottom of the list, you can create the record on the spot without leaving the form.
Jobs
A Job represents a contract with a customer to move goods. It groups all trips, expenses, and invoices for that engagement.
Status lifecycle: Open → In Transit → Completed → Closed
To create a job:
- Go to Jobs and click + New Contract
- Pick the Contracting Customer (or create one with + New Customer)
- Set the start date
- Click Create Parent Job — the job opens in Open status (the auto-generated Job ID is the only other field on this form)
Job status follows its trips. Dispatching the first trip moves an Open job to In Transit; once every trip on the job is Completed, the job becomes Completed automatically. Closed is the only status you set by hand — see Closing a job.
The job page
Opening a job shows:
- Contract Profile — the customer (click the name to open the customer's card; its back arrow returns you to this job) and the start date
- Linked Invoices — see Invoicing
- Linked Sales Orders — shown when a Sales Order has been delivered on one of this job's trips; click one to open it
- Dispatch History — every trip on the job, with its status, truck and driver, plus Manifest, Delivery Note, View Trip → and ✓ Complete actions. Click a trip to narrow the ledger and profit figures to that trip only
- Net Realized Profit — posted income minus approved costs, with any income or costs still pending shown underneath
- Consolidated Job Ledger — every invoice and expense on the job, newest first. Pending expenses can be approved or rejected right here by anyone with
expense.approve - Print Audit — a printable financial record of the job
Closing a job
Click 🏁 Secure & Close Ledger at the bottom of the job page, then click again to confirm. If the job has no invoice, has invoices still in Draft or awaiting approval, or has unpaid invoices, you're warned (with the outstanding amount) and can close anyway. Once closed, the job and its trip pages no longer offer Dispatch, Create Invoice or expense entry.
Trips
A Trip is a single truck movement under a job. Each trip tracks:
- Assigned truck, driver, and (optionally) trailer
- Route (with estimated days and checkpoints)
- Departure date and status (Open, In Transit, Completed)
- Outsourced fleet details (if using a subcontracted truck)
- Delivery confirmation (receiver name and date)
To dispatch a trip, click Dispatch Trip on a job (or + New Trip on the Trips page), choose Own Fleet or Outsourced, pick the truck, driver, trailer (optional — leave it on "No trailer" for a truck-only run) and route, then click Dispatch and Post Trip. The trip starts In Transit, and its detail page opens straight away.
Outsourced trips: Switch to Outsourced, pick the subcontractor vendor (or + New Subcontractor), and fill in their truck number, truck owner, driver name, license and passport details. The trailer number and driver phone are optional.
Units that can't be dispatched: A truck or trailer with an expired compliance document, or marked In Maintenance or Out of Service, is still listed but greyed out with the reason. A driver whose license has expired is greyed out the same way.
Vehicle status auto-sync: Dispatching a trip (own-fleet, not outsourced) automatically sets the assigned truck and trailer's status to In Transit; when the trip stops being In Transit (e.g. marked Completed), they revert to Available — see Fleet Management → Vehicle status for details.
The trip page
The trip page header shows the customer and job the trip belongs to, with Print Manifest, Print Delivery Note and Go to Parent Job buttons. It also has:
- Checkpoint Log — one line per checkpoint on the trip's route. It stays collapsed ("0 of 4 recorded ▾") until something is recorded; click it to open. Users with
trip.editcan record the date each checkpoint was passed and add a note (e.g. a delay reason). These dates feed the Corridor Report - Record Delivery — enter the receiver's name and receiving date, then ✓ Confirm Delivery. This also marks the trip Completed
- Allocated Trip Expenses and Record Trip Expense — log a cost (category, vendor, amount, notes) against this trip; it's saved as Pending until approved
The Trips page lists every trip with search (trip, job, route, driver), status, own-fleet/outsourced and date filters, the customer under each job reference, an inline status dropdown, and an 📊 Export CSV button.
Expenses
An expense can be charged to a whole job, to one trip, or to neither (a general expense). In the Expenses → New Expense form a new expense starts with no job or trip:
- Pick a job and its first trip is filled in — clear the trip ("No specific trip — charge to the job only") to make it a job-level cost
- Pick a trip and its job is filled in for you
- Leave both empty for a general business expense
Each expense also records the category (from your own list in Settings → Invoicing → Expense Categories), vendor, amount, currency, VAT, an EFD receipt photo, and its approval status (Pending → Approved / Rejected). You can also post an expense from the job page or the trip page. Only Approved expenses count toward a job's costs.
Users with expense.approve can approve or reject expenses from the Expenses view or straight from the job ledger.
Expenses in another currency
When a driver pays outside Tanzania, record the expense in the currency actually paid. The currency list on the Expense form, the job page's Record Expense box, the trip page's Record Trip Expense form and driver allowances offers TZS, USD, ZMW, CDF, MWK, RWF, BIF, KES, UGX, ZAR, MZN, plus any other currency you've added under Currency Management.
For any currency other than your base currency you must enter an exchange rate (how many TZS is 1 unit of that currency). It's filled in from your saved rate when there is one; change it to the rate the money was actually changed at. The rate is stored on the expense, so:
- the job and trip costs, the job's profit, reports and dashboards all convert that expense at its own rate, and don't move when the saved rate changes later
- approving it posts the converted TZS amount to the General Ledger
- the job ledger and trip list show the original amount (e.g. ZMW 2,000.00) with the TZS equivalent underneath (≈ TZS 210,000 @ 105)
Picking a currency other than TZS or USD switches VAT off, since a receipt from outside Tanzania carries no claimable Tanzanian VAT. The job page and trip page keep the last currency and rate you used, for the next expense on the same trip. A foreign-currency expense can't be paid from a POS till (the till holds TZS); tick Not paid from a till when you pick a store. To correct a rate later, Edit the expense. Expenses recorded before this had no stored rate and keep converting at the saved rate.
Driver allowances
If Settings → Company → Driver Allowances is switched on, the job page also has an Issue Driver Allowance / Posho section (for users with the allowance permission): pick the driver, type (Posho, Transport, Accommodation, Other), optional trip, currency, amount and notes, then 💰 Issue Allowance. It's recorded as an approved expense on the job, and 🖨️ Slip prints an allowance slip. If the route has a default posho amount, it's filled in for you. An allowance in another currency needs an exchange rate, the same as any expense.
With Accounting on, an allowance posts to the General Ledger straight away: debit the account mapped to its expense category in Accounting → Posting Setup, credit your Default Bank account. Posho and Other use the Allowance category, Transport uses Transport or Travel, and Accommodation uses Accommodation. Transport and Accommodation fall back to Allowance whenever their own category isn't mapped to an account. A category with no account still posts to the Default Expense Account. If the allowance can't be posted at all (no Default Bank account, or no expense account anywhere), it's still saved and a warning tells you what to set up.
Exporting to Excel
Click ⇩ Export to Excel to download the currently filtered/searched expenses list as a formatted workbook — date, expense type (Operational/General), category, description, vendor, job/trip reference, currency, net amount, VAT, amount, rate, amount in your base currency, status, and submitted by — with a totals row on the base-currency amount column, so expenses in different currencies add up correctly.
Invoicing
A job's income only ever comes from an invoice linked to it — there's no separate "record a payment" step. From a job (or, after selecting a trip in Dispatch History, for that trip) click Create Invoice:
- The invoice opens as a blank Draft, linked to that job (and trip, if generated from one)
- Add line items, apply the VAT rate/category per line, and set payment details and notes
- Move it out of Draft (Sent) when it's ready — this is also the moment it posts to the General Ledger (if Accounting is enabled) and fiscalizes (if TRA VFD/EFD → is on)
- Mark it Paid once settled
An invoice counts toward the job/trip's revenue the moment it leaves Draft — a Draft sitting on a job shows as pending income, not revenue yet. If your tenant has turned on Settings → Invoicing → Invoice Approval, leaving Draft additionally requires an invoice.approve holder to approve it first (see Invoicing → Invoice approval) — everyone else submits it for approval instead.
The job's Linked Invoices card shows Invoiced / Paid / Outstanding totals, and each invoice shows a Draft / Pending Approval / Rejected / Unpaid / Overdue / Paid badge, so you can see at a glance what's still owed before closing a job — closing with unpaid or pending invoices warns you but doesn't block it.
Invoices raised from a Sales Order that was delivered on one of the job's trips count toward the job too: they appear on the job's Linked Invoices card marked "from SO-…", and the order itself appears on the Linked Sales Orders card.
Older jobs may also show income entries recorded before invoices were required. These appear in the ledger as "Legacy entry — no invoice", are read-only, and still count toward the job's income (unless an invoice already covers them).
Invoices support:
- VAT-inclusive or exclusive mode (a job-generated invoice is in your tenant's base currency)
- Custom branding (logo, stamp, TIN, footer)
- Print / save as PDF
Job Ledger Entries
Job Ledger lists every posted revenue and cost on your jobs, one row per entry — like GL Entries, but per job. Find it under Accounting → Job Ledger when Accounting is enabled, otherwise under Finance → Job Ledger.
- Sale rows are invoices that have left Draft (plus any legacy income entries); Usage rows are approved expenses charged to a job — including fuel issued from the Diesel Yard and driver allowances
- Draft invoices, invoices awaiting approval and pending expenses aren't entries yet
- Filter by job, trip, type, document/description and date range; the Revenue, Cost and Net Profit totals follow the filter, so for one job they match the job page's Inflow, Outflow and Net Realized Profit
- Click a row for its details, then Open Invoice →, Open Expense → or Open Job →
- ⇩ Export to Excel downloads the filtered list
From a job page, click 📒 Job Ledger Entries → in the ledger header (or Trip Ledger Entries → with a trip selected) to open this page already filtered to that job, with a back button to the job.
Diesel Yard
If your trucks are fuelled from your own fuel stock, fuel dispensed from the Diesel Yard can be charged straight to a job and trip, and shows up on the job ledger and Job Ledger like any other approved expense. With Diesel Yard on, each trip in a job's Dispatch History also has a ⛽ Kibali button that prints a fuel authorization slip (Kibali Cha Mafuta). See Diesel Yard for the full guide.
Routes
Define your standard corridors once and reuse them across all trips (the menu entry is labelled Corridors by default):
- Set origin and destination
- Add intermediate checkpoints — these become the trip's Checkpoint Log
- Specify estimated days and distance (km)
- Optionally set the estimated fuel (litres) and a default driver posho amount for the corridor
Common Tanzania/corridor routes: Dar es Salaam – Lusaka, Dar – Lubumbashi, Dar – Beira, Tunduma – Lusaka, Namanga – Nairobi.
The Routes list has the same ⊞ / ≡ grid-and-table view toggle as Fleet and Drivers, a search box (matches on name, origin, or destination), and an ⇩ Export button for the currently filtered list — useful for reviewing all your corridors' distances and transit days at a glance instead of scrolling cards.
Permissions
| Permission | What it allows |
|---|---|
job.view | See the Jobs page, job details and the Job Ledger |
job.create | Shows the New Job quick action on the dashboard |
job.edit | Reserved for a future job-editing feature — there's currently no UI action it gates, so granting or revoking it has no visible effect |
job.delete | Delete jobs (soft delete) |
trip.view | See the Trips page |
trip.assign | Dispatch trips — assign trucks and drivers (either this or trip.create grants it) |
trip.edit | Record checkpoint dates and notes on a trip's Checkpoint Log |
trip.delete | Delete a trip that has no expenses recorded against it |
route.manage | See and manage the Routes / Corridors page |
invoice.create | Create invoices from a job or trip |
expense.approve | Approve or reject expense requests |