The problem
Freight forwarding is paperwork and waiting. A parcel comes in through the airport or the port, goes through an agency, a warehouse, sometimes another agency inland, then reaches the customer. At every step: a document, an invoice, a debt running, a storage penalty. TransitSoft digitises the whole chain — air, sea and land — across multiple agencies.
The real challenge: consistency between agencies
Not just a back office. An unpacked parcel has to be redistributed to the right destination agency, invoicing follows each agency's currency and configuration, and debts flip automatically to OVERDUE once the due date passes.
Architecture — Turborepo monorepo
apps/api— NestJS + Prisma (PostgreSQL) + Socket.IO + BullMQapps/web— agency operations ·apps/ops-admin— configurationapps/web-desktop(workstation) ·apps/web-client(customer portal)apps/mobile+apps/tablet(field) ·apps/orchestrator(control plane)
Real time & jobs
Socket.IO for notifications and the built-in chat/support. BullMQ (Redis) for everything that runs on its own: daily storage penalty calculation, debt due-date checks, automatic flagging of unpaid invoices. PDF generation (invoices, waybills) and a QR code per parcel.
A constraint from the field
Agents are not always connected. Location data (country → region → city) ships as static JSON on the client: the forms keep working when the mobile network drops inside a warehouse.
Stack
NestJS · Prisma · PostgreSQL · Socket.IO · BullMQ · Expo · Turborepo
Full write-up: Digitising customs transit: lessons from TransitSoft.



