Operations ERP
The working side of the service. I designed and built the tools for orders, trucking, containers, documents, invoices, alerts and operational exceptions.
Importing a car from the United States to Nigeria involves far more than shipping. There is buying, trucking, port handling, documents, customs and delivery. I worked with My Car Importer to bring that process into one product for the team—and make it much easier for customers to follow.
The challenge
Much of the work lived across spreadsheets, documents and conversations. Staff had to keep track of vehicles, trucking jobs, containers and customer updates across different places. Small gaps in information created more calls, more follow-ups and more room for mistakes.
Customers experienced the same problem from the other side. Once they had paid, they still needed to ask where their car was, whether a document had arrived or what came next. My job was to make the process legible without pretending it was simple.
The product strategy
The working side of the service. I designed and built the tools for orders, trucking, containers, documents, invoices, alerts and operational exceptions.
The customer side. I built quoting, order requests, wallet funding, auction bids, documents and tracking around the same underlying order data.
How I built it
I built both products as responsive, multi-page web applications. Supabase handles authentication, Postgres, file storage and server-side functions; Vercel handles the static deployments. The browser stays focused on interaction while permissions, financial rules and integrations run behind it.
Experience architecture
Some customers need MCI to buy, truck and ship a car. Others only need one part of that service. I designed four order types so each job shows the stages, fields and actions that actually apply.
The flow changes with the service. Clearing and preparation only appear when they are part of the order.
Bid for Me
A customer or MCI can propose the maximum bid. The other party must accept before the bid goes live. At that point the system reserves 10% of the maximum—with a $1,000 minimum—from the customer’s wallet, so the same funds cannot back another bid.
If the wallet is short, the bid waits for funding until the auction starts or 24 hours after acceptance—whichever comes first. The deadline and every hold transition are enforced server-side.
Engineering choices
I chose static HTML, CSS and JavaScript over a framework. With two products to build and maintain alone, a zero-build frontend kept deployment fast and each screen easy to trace. Shared modules handled the repeated interface patterns.
Both products use a public browser client, so hiding an action in the interface was never enough. I used Postgres Row Level Security for access and server-side functions for sensitive writes. The wallet journal cannot be written to directly.
US trucking prices come from Central Dispatch market data; ocean shipping uses MCI’s own configurable rate card. I built separate Edge Functions for each, then brought both results into one quote flow for the customer.
Financial integrity
A customer can reserve funds for an auction bid and still have invoices to pay. I implemented available balance as wallet balance minus active holds, enforced inside the payment functions—not calculated only in the interface. Exchange rates are also saved with each funding event, so a past transaction never changes when today’s rate does.
Wallet
$24,800 availableOutcome
The work covered product strategy, interface design, data modelling, access control, third-party integrations, transactional email and UAT. The result is one service run through two connected products: enough operational depth for staff, and a much clearer experience for the customer.