Freight Forwarder: Running Containers and Trucks with Drayage + TMS
Quoting, dispatch, container tracking, terminal appointments and billing — the forwarder workflow from order to invoice.

A freight forwarder lives between terminals, truckers, and customers — and every container is a clock ticking toward free-time expiry. This guide sets up the full Drayage + TMS loop: quoting and orders, dispatch, container tracking with terminal appointments, and billing. Follow it in order and your first import box will go from vessel to customer without a demurrage surprise.
Taking orders and quoting#
Every Drayage order starts with four decisions. Pick the move type: import (pick up a loaded box), export (return a loaded box), empty_return (return an empty), or chassis_repo (reposition a chassis). Each order gets a DRY serial number and must be tied to a shipper (merchant_id) — no ownerless orders. Keep your address book tidy: drayage_locations covers terminals, warehouses, customer sites, and others, so dispatchers stop retyping the same addresses. Quotations get their own QT serial numbers — total = base fee + surcharges — and move through draft → sent → accepted / expired; only accepted quotes turn into orders, so the “we agreed on what?” argument never happens.
Dispatching trucks and chassis#
The dispatch board shows live orders alongside drivers and chassis. When you assign, the system validates that the driver is available and the chassis is available — double-booking a chassis is how containers get stuck at the terminal gate. Keep an eye on each chassis’s maintenance_due_date as well: a chassis that breaks down on the road costs far more than a scheduled service.

Tracking boxes and booking terminal appointments#
Each container_no is unique within your tenant, so one box is always one record. Tracking follows the real lifecycle: on_vessel → at_terminal → out_for_delivery → at_customer → empty_returned. Watch the LFD (last free day) closely: when 2 days or fewer remain, the box is flagged at risk of detention; past LFD, fees accumulate at the per_diem_rate. Book terminal appointments early and track them as scheduled / completed / cancelled / missed — a missed appointment usually means a lost free day. Drivers update status from the mobile app with GPS riding along automatically, and when an import order completes, marking delivery_to_warehouse triggers the WMS to generate an inbound receipt — no one retypes the container number.
Billing and collections#
Close the loop with Drayage invoicing plus aging and collections: every invoice carries a collection_status, so overdue accounts surface before they become write-offs. Because quotes, orders, tracking events, and appointments all live in one system, the invoice matches the work that actually happened — including any detention or per-diem charges.