International FreightLaravel + ReactMulti-currency

Manify

A specialized business management system for international freight operations - handling invoicing with transport-specific parameters, multi-currency cash flow, and carrier performance analytics.

MultiCurrency invoicing
4-statePayment tracking
Full-stackLaravel 12 + React
Real-timeCash flow & margins
manify Dashboard
Manify dashboard showing revenue, margin, cash flow, top clients and sales status

Overview

Built for the specifics of freight billing

Manify is a business management system purpose-built for international freight and transportation companies. Generic ERP tools don't map to this domain well - a freight invoice isn't just line items and a total. It carries a transport reference, truck and trailer identifiers, a boat cost for the maritime leg, and a carrier commission that directly affect the margin.

The system handles multi-currency invoicing, links purchase costs to sales for real margin calculation, tracks payment aging across clients, and provides carrier-level performance analytics - the exact data a freight business needs to run profitably.

Objective

  • Manage invoices with freight-specific fields - transport reference, truck, trailer, boat cost, and carrier commission - directly on the billing document

  • Handle multi-currency billing and payments accurately, critical for cross-border shipments billed in EUR, MAD, or other currencies

  • Calculate real per-shipment margins: revenue minus taxes, purchase costs, boat costs, and commissions - not just revenue

  • Maintain clear cash flow visibility: what's paid, what's partial, what's overdue, and for how long

My Role

Architected and built end-to-end

Modular Backend Architecture

Designed 12 Laravel 12 domain modules - each with its own models, service layer, controllers, and API routes. Auth, Business, Client, Finance, Invoices, Purchases, Reports, Sales, Supplier, and more.

Domain Modelling

Modelled freight-specific entities: the Sale carries transport reference, truck, trailer, boat cost, and carrier - all contributing to a precise margin calculation per shipment.

React SPA Frontend

Fully decoupled React + TypeScript SPA built with Vite - TanStack Router for file-based routing, Zustand for shared lookup state, typed axios endpoint map throughout.

Analytics & Reporting

Built four report types: sales & profit (date-range), payment status with aging buckets, per-carrier performance (bateau costs + commissions), and per-client analytics.

Payment & Cash Flow Engine

Partial payments, void/refund flows, multi-currency, and payment aging from 0-30 to 90+ days - all tracked against invoice expiry dates set per client.

Tech Stack

Laravel 12PHP 8.2+ReactTypeScriptViteTanStack RouterLaravel SanctumMySQLREST APIZustandreact-i18nextSpatie MediaLibraryDomPDFYajra DataTablesTailwind CSSZodReact Hook Form

Core Features

Designed around how freight billing actually works

Invoice Management

  • Multi-status: draft, completed, cancelled
  • 4-state payment tracking: paid, partial, unpaid, refund
  • Multi-currency billing (EUR, MAD, and more)
  • Per-client deadline periods auto-computing expiry
  • Partial payments with running balance
  • PDF invoice generation on demand

Transport Parameters

  • Transport reference on every invoice
  • Truck (tracteur) and trailer (remorque) identifiers
  • Boat cost field for the maritime shipping leg
  • Carrier commission tracked per invoice
  • Linked carriers (ClientSuppliers) per client
  • Purchases linked to sales for margin calculation

Cash Flow & Collections

  • Payment aging: 0-30, 31-60, 61-90, 90+ days
  • Overdue invoices dashboard with due amounts
  • Multi-method: cash, bank transfer, cheque, card, credit
  • Void and refund payment corrections
  • Cash-in vs cash-out at a glance
  • Outstanding receivables and payables tracking

CRM & Analytics

  • Client profiles with deadline and country data
  • Supplier and carrier database
  • Per-carrier performance: costs, commissions, avg/shipment
  • Per-client analytics: spend, profit, payment history
  • Top clients by revenue with date-range filtering
  • Real margin per shipment after all transport costs
Atlas Import Co.

Atlas Import Co.

ICE 001234567890001

Active

41

Invoices

184K

Revenue

3

Overdue

Souss Export Ltd

ICE 002345678901002

28 invoices

Maghreb Transit SARL

ICE 003456789012003

15 invoices

All data is fully isolated per business

Multi-business

Multiple companies, one installation

Manify supports running multiple fully independent businesses under a single deployment. Each business has its own isolated dataset - switching context in the navbar instantly scopes every invoice, client, supplier, payment, and report to the selected company.

  • Full data isolation

    A global query scope on every model filters by business_id automatically - no manual scoping needed anywhere in the codebase.

  • Instant context switch

    The business switcher sends X-Business-ID on every API request. Switching businesses invalidates the router - all data refreshes without a page reload.

  • Per-business branding

    Each business configures its own logo, stamp, color theme, tax number, ICE, and RIB. PDFs and invoices are branded per company automatically.

  • Persistent selection

    The selected business is saved to localStorage. Users land in the right company context every time they return.

Screenshots

A look inside the app

manify · Invoices
Invoice list

Invoices

manify · New Invoice
Invoice creation form

New Invoice

manify · Reports
Reports and analytics

Reports

Architecture

Decoupled API + SPA, modular backend

The backend is a Laravel 12 API organized into 12 self-contained modules. The frontend is a fully decoupled React TypeScript SPA - it communicates entirely via REST, secured with Laravel Sanctum. Both layers can evolve independently.

Backend

  • 12 Laravel 12 domain modules
  • Service layer pattern - thin controllers
  • Laravel Sanctum API authentication
  • DomPDF for server-side invoice PDFs
  • Spatie MediaLibrary for attachments
  • Yajra DataTables for paginated lists

Frontend

  • React + TypeScript SPA with Vite
  • TanStack Router for file-based routing
  • Zustand stores for shared lookups
  • React Hook Form + Zod validation
  • react-i18next multilingual support
  • Centralized typed axios endpoint map

Key Takeaways

Niche > Generic

A specialized tool that models the actual domain - transport ref, truck, trailer, boat cost - is worth infinitely more than a generic tool that forces workarounds.

Margin is the real metric

Revenue alone is misleading in freight. Real profit = sale revenue − taxes − purchase costs − boat cost − commission. The system calculates this per shipment, automatically.

Multi-currency is a design decision, not a feature

International operations invoice in EUR, get paid in MAD, and pay carriers in mixed currencies. Treating currency as a first-class concern from day one prevents expensive rewrites later.

Decoupled frontends pay off

Building the React SPA as a fully separate consumer of the API meant faster UI iteration without touching the backend - and left the door open for a future mobile app.

Impact

Operational clarity for freight businesses

Accurate freight invoicing

Every invoice captures the full cost picture of a shipment - not just the service line, but boat fees, carrier commissions, and truck details.

True margin visibility

Per-shipment profit is calculated automatically by deducting all transport costs from revenue - owners know exactly where they stand.

Collection control

Payment aging reports show exactly which invoices are overdue and for how long - prioritizing collections becomes straightforward.

Carrier accountability

Transporter performance reports surface which carriers cost the most per shipment - enabling data-driven negotiation and routing decisions.

Work with me

Have a similar project in mind?

Whether it's a domain-specific business tool, a SaaS platform, or a system that needs to model complex real-world operations - I help you figure out the right approach before writing a line of code.