| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Fleet (fleet) • Inventory (stock) • Invoicing (account) • Project (project) • Website (website) |
| Community Apps Dependencies | Show |
| Lines of code | 17615 |
| Technical Name |
grev_od_freight_manager |
| License | OPL-1 |
| Website | https://grevlin.com |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Fleet (fleet) • Inventory (stock) • Invoicing (account) • Project (project) • Website (website) |
| Community Apps Dependencies | Show |
| Lines of code | 17615 |
| Technical Name |
grev_od_freight_manager |
| License | OPL-1 |
| Website | https://grevlin.com |
|
🚚 LOAD-BOARD MANAGEMENT SUITE
Load-Board Management Suite — Multi-tenant Freight DispatchA production-grade freight load-board platform for Odoo 19. Run carriers, cooperatives, fleet owners and brokerages on one dispatch board with live GPS maps, portals, dual mobile REST API and optional SaaS billing.
|
|
▶ WATCH IT IN ACTION
See the Load-Board Suite liveA guided tour of dispatch, live GPS tracking, driver portal and shipper tracking — end‑to‑end in Odoo 19.
|
|
|
|
|
|
|
|
|
|
💬
Need Help?Our team is ready to help you onboard tenants, configure rate cards, wire up GPS devices and roll the driver & shipper apps into production.
🎉 30 days free support included
|
Grevlin Freight Manager — Docs
Multi-tenant freight dispatch and load-board platform for Odoo 19.
Overview
grev_od_freight_manager ships a complete freight operation in one Odoo application: tenants (carriers, coops, fleet owners, brokers), drivers, vehicles, sub-carriers, multi-stop loads, lane-based rate cards, an OWL dispatch dashboard, four portals (driver / loader / broker / tenant), a two-flavour REST API, optional SaaS billing, and live GPS via the companion grev_od_asset_tracking module.
Installation
Dependencies
- Odoo 19 Enterprise (the base, mail, portal, website, sale, account, stock, project, fleet, bus, uom modules)
- grev_od_map_view — embedded OSRM map widget on the load form
- grev_od_asset_tracking — live GPS, geofences, journeys
- grev_od_scale_reader — optional onboard scale capture
Install the module on a clean Odoo 19 database:
python odoo-bin -d <db_name> -i grev_od_freight_manager --stop-after-init
Update after pulling changes:
python odoo-bin -d <db_name> -u grev_od_freight_manager --stop-after-init
Configuration
Tenancy
Each freight tenant maps to one res.company with multi-company record rules enforcing data isolation. Create a grev.freight.tenant from Freight ▸ Configuration ▸ Tenants and add managers via manager_user_ids.
SaaS mode (optional)
For multi-customer hosting, set the system parameter:
grev_freight.saas_mode = True
This activates the grev.freight.subscription model, the monthly billing cron, and per-tenant usage logging. Plans are configured in Freight ▸ Configuration ▸ Plans.
Security groups
- group_freight_driver_user (portal) — drivers
- group_freight_shipper_user (portal) — shippers + dock-side loaders
- group_freight_broker_user (portal) — sub-carrier dispatchers
- group_freight_dispatcher (internal) — operations
- group_freight_tenant_manager (internal) — implies dispatcher
- group_freight_platform_admin (internal) — cross-tenant SaaS ops
Usage
Backend dispatch
Open Freight ▸ Dashboard for the live OWL dashboard. Loads progress through the state machine draft → posted → pending_approval → booked → assigned → at_pickup → in_transit → at_delivery → delivered.
Cancel / dispute states are reachable from any non-terminal state.
Driver proposals (load board)
When a load is in posted, drivers see it on their portal Available tab and can submit a proposal (default rate or counter-rate plus an optional note). On the first proposal, the load auto-advances to pending_approval. The tenant manager reviews pending proposals on the tenant portal home or the Driver Proposals backend menu, then:
- Accept — driver/vehicle/agreed_rate are written to the load, state goes to booked, all competing pending proposals are auto-rejected.
- Reject — proposal goes to rejected. If no pending proposals remain, the load reverts to posted.
Drivers may withdraw their own pending proposals; the same no-pending-proposals → posted rule applies.
Per-stop driver actions
On each load stop in the driver portal:
- pending → en_route — En route button (also bumps load to in_transit if still earlier).
- en_route → arrived — bubbles at_pickup / at_delivery on the parent load depending on stop_type.
- arrived → completed — closes the load when the last delivery stop is completed (calls action_deliver so invoices and asset cleanup run).
- pending → skipped — only on auxiliary stops (waypoint, rest, fuel, customs).
Dock-side loader confirmations
On the loader portal, a stop's responsible partner (shipper for pickup, consignee for delivery) sees an inline confirmation form:
- Confirm pickup ready — records weight_loaded_kg and signer name, posts an audit message on the load (driver still controls the arrival transition).
- Confirm goods received — records weight_unloaded_kg, signed_by, optional signature; if the load is already in-transit/at-delivery, marks the stop completed.
Portals
All four portals share a single Loadboard-inspired shell rendered at the website-layout level (no breadcrumb, flush against the navbar). Logging in lands every freight user on their dedicated workspace via the /my dispatcher.
| Portal | URL | Audience |
|---|---|---|
| Driver | /freight/driver | Drivers (portal-only). Active loads, available offers, proposals, delivered history, per-stop actions. |
| Loader | /freight/loader | Cargo owners (shippers) + dock-side warehouse staff (portal-only). Post loads, watch market, confirm pickup / receive. |
| Broker | /freight/broker | External sub-carrier dispatchers (portal-only). Pending offers, accept / decline, status updates. |
| Tenant | /freight/tenant | Internal tenant managers. Per-tenant KPIs, pending driver proposals, subscription self-service. |
Backwards-compatibility
The legacy /freight/shipper/* URLs are preserved as 301-style redirects to /freight/loader/* so any bookmarks or quoted links still work.
Public tracking
A tokenised tracking URL is generated for each load (access_token). Share it with the consignee:
/freight/loader/load/<load_id>/track/<token>
The recipient sees the load summary, stops timeline and last GPS position without authenticating.
Financial flow
Each delivered load is settled through a configurable commission split:
- Loader posts the load with an agreed rate (or a counter-rate from a driver proposal); fuel surcharge and accessorials are itemised.
- Auto-invoicing on dispatch (action_assign) creates:
- AR to the shipper for total_revenue
- AP to the assigned driver for driver_payout (internal mode), or to the sub-carrier for carrier_net_payout (brokered mode)
- AP to the platform partner for platform_commission_amount (SaaS mode only)
- Commission base is commissionable_amount: base freight plus commissionable accessorials. Fuel surcharge and any accessorial marked commissionable=False (toll, lumper, etc.) are pass-through — added on top of the driver/carrier take-home, untouched by any cut.
Commission rates
Three percentages are defined on the plan (template) and can be overridden on each subscription:
| Field | Meaning |
|---|---|
| platform_commission_pct | SaaS-platform cut. Applied to commissionable_amount and posted as an AP bill to the platform partner. |
| tenant_commission_pct | Tenant gross-profit cut on internal dispatch loads. |
| broker_commission_pct | Tenant brokerage margin on the spread between the shipper rate and the carrier rate for brokered loads. |
Rates are snapshotted on every load at booking time — future plan or subscription changes never modify historical loads. Force a refresh (e.g. after a manual subscription edit) by calling load._refresh_commission_rates().
Driver take-home
For internal dispatch:
driver_payout = commissionable_amount
- platform_commission_amount
- tenant_commission_amount
+ non_commissionable_amount # fuel, tolls, lumpers
The driver portal shows a projected take-home on every available offer and a full breakdown card on each assigned load.
Pass-through accessorials
Each grev.freight.accessorial template carries a commissionable boolean (default True). Tolls, fuel surcharge and lumper fees ship with commissionable=False so the dispatcher's first save already behaves correctly. The flag can be overridden per line on a load from the Pricing tab.
REST API v1
The module ships an Uber-style two-flavour API at /api/freight/v1/*. See doc/integration/rest_api_v1.md for the full reference.
Auth uses bearer tokens via grev.freight.api.key. Each key has a scope (driver / shipper / dispatcher / carrier) that the decorator enforces by switching the request env to the key's user, so record rules apply just like in the portals.
Tokens are generated with secrets.token_urlsafe(32), surfaced once on create / rotate, and stored only as SHA-256 hashes.
Reporting
Read-only PostgreSQL views aggregating delivered loads:
- Trip P&L — grev.freight.trip.pnl.report
- Load report, Stop report, Alert report, Quote report
- Driver scorecard, Carrier scorecard, Lane report
- Subscription report, Usage report (SaaS only)
All views ship pivot, graph and list modes and are scoped by company.
Demo data
Installing with demo data seeds a complete dispatch scenario plus four ready-to-use logins:
| Login | Password | Role |
|---|---|---|
| driver | demo | Marcus Holloway — driver portal, has an in-transit load and 30-day delivered history. |
| loader | demo | Olivia Stern (Northwind dock) — loader portal with an assigned-load dock task. |
| broker | demo | Eli Brennan (SwiftLink) — broker portal with one assigned hazmat load and one posted offer to accept/decline. |
| tenant | demo | Priya Anand — tenant manager (internal) with a pending driver proposal awaiting decision. |
Architecture
Models (per prefix)
- Tenancy / SaaS: grev.freight.tenant, grev.freight.plan, grev.freight.subscription, grev.freight.usage.log
- Parties: grev.freight.driver(.skill), grev.freight.carrier
- Vehicles: fleet.vehicle (extended), grev.freight.vehicle (external)
- Catalogue: grev.freight.zone, grev.freight.accessorial, grev.freight.rate.card
- Loads: grev.freight.load(.stop|.accessorial|.proposal), grev.freight.assignment, grev.freight.route.plan, grev.freight.quote, grev.freight.dispatch.message, grev.freight.alert
- API / reports: grev.freight.api.key plus the read-only views listed above.
Multi-company isolation
Every model with a tenant carries company_id + _check_company_auto + a record rule. Platform admins bypass via a [(1, '=', 1)] rule restricted to group_freight_platform_admin.
Asset-tracking integration
Live GPS is delegated to grev_od_asset_tracking through pure _inherit:
- fleet.vehicle.freight_tracked_asset_id → grev.tracked.asset
- grev.freight.load.stop.geofence_id → grev.geofence
- Geofence events auto-mark stops arrived and cascade load state
- bus.bus broadcasts to (db, 'freight.dispatch', tenant_id) for live dashboard refresh.
Support
- Email: odoo@grevlin.com
- X / Twitter: @GrevlinGlobal
- Issue tracker: contact us before opening a public ticket
- Free support: 30 days from first install
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module