MonGroupage — Freight Platform for West African Importers.
A freight groupage platform connecting small importers in West Africa to Chinese suppliers — from browsing a catalogue to tracking a shipment through customs to pickup, plus the back-office that runs it.
Problem
Small merchants and importers across West Africa (Gabon, Côte d'Ivoire, Cameroun, Bénin, Sénégal, Togo, Mali) who buy from Chinese suppliers had no structured way to consolidate a shipment, see where it actually was, or understand what they still owed. Everything ran informally over WhatsApp and word of mouth, tracked by hand at the pickup agency.
Payment was another mismatch: the tooling available assumed card rails, but the market pays with Mobile Money (MTN MoMo, Orange, Wave). Without a reliable way to match a payment to the right dossier and the right half of it (deposit vs balance), reconciliation stayed manual and error-prone.
Internally, operations had no single system either — supplier orders, container consolidation, warehouse receipts, and client accounts were managed across spreadsheets and chat threads, which made it hard to scale past a handful of agencies and easy to miss a mistake before it reached a client.
Approach
Domain model first. Before any screen was built, the vocabulary was fixed: a dossier (ImportRequest) is the client-facing unit, split into one SupplierOrder per Chinese supplier with its own line items, consolidated at the container (Cargo) level, released through a PickupAgency. Both the client portal and the operations back-office consume the exact same statuses from the same API — there is no separate client-facing copy of the state machine to keep in sync by hand.
Client portal (Next.js, mobile-first). Catalogue browsing → building a dossier (LCL groupage or transport-only) → a quote with a visible expiry countdown and a deposit/balance breakdown → Mobile Money payment → tracking through 11 distinct statuses, including partial shipments that split into multiple lots, with documents and notifications centralized per dossier.
Operations back-office (same Next.js codebase, a separate authenticated surface). Supplier and client account management, product catalogue curation, container consolidation with CBM/weight tracked per item, warehouse receipt tracking, and an audit log of every action taken on an account — the actual day-to-day tool the ops team runs the business from, not an admin afterthought.
A companion read-only mobile app (Expo/React Native) for ops staff — dashboard counts across the five stages of a dossier's life and per-queue list screens, each with a direct link back into the real web app to act on something. No mutations on mobile, on purpose: it's a status-checking tool for someone away from a laptop, not a parallel app to keep feature-complete.
Challenge — payment reconciliation without card rails: Mobile Money payments are matched to a dossier through a structured reference code (MG-XXXX-DEP / MG-XXXX-BAL) instead of a card token, so a manual operator statement can still be reconciled against the right dossier and the right half of the payment.
Challenge — quotes reaching clients on the channel they actually check: a quote (generated PDF, deposit/balance breakdown, expiry date) is sent automatically over both email and WhatsApp, because WhatsApp is where this market actually reads messages, not an inbox.
Challenge — keeping every client-facing promise honest: things like a partial warehouse-receipt count ("3/4 colis reçus") or a delay reason with a new ETA only work if operations has a concrete place to enter that information in the first place — which pushed several ops-side features to be built before, not after, the client portal screen that depends on them.
In hindsight: building the operations back-office alongside the client portal, instead of treating it as a later admin layer, turned out to matter more than expected. A platform promise to a client is only as real as the operations screen behind it that makes that promise possible to keep.