Finesse Capital
Digital wealth-management platform for Nigerian investors and advisors

Overview
Finesse Capital Nigeria Limited wanted its whole business running on one platform. Its clients range from individuals putting money aside each month to companies where several directors have to approve before anything moves. Until now that business has run on manual records and steps that do not connect. Funding an account, verifying a client's identity, recording an investment and having the advisor conversation all happen in different places, and the compliance picture gets assembled afterwards from whatever each of them left behind. The platform brings those together. A client opens and funds an account, invests, and works with an advisor in one place, while the firm handles approvals, pricing and settlement against the same records.
My role
Full-stack developer on a two-engineer team, working across both the frontend and the backend. I drove most of the build: the four role-based areas for investors, advisors, corporate accounts and administrators, the public marketing and onboarding site, the client-facing flows end to end, the wallet and ledger layer, identity verification and onboarding, the payment integration, and the permission system.
The problem
Finesse Capital's business ran on manual records and separate, disconnected steps. Money moved in one place, identity documents were checked in another, investments were recorded somewhere else, and the advisor conversation happened over the phone. For a client that means never being quite sure where they stand. For the firm it means the compliance trail has to be reconstructed after the fact. Corporate clients made it harder. A company account often needs several named signatories to approve before anything can proceed, and there was no system that could hold that rule, let alone enforce it. The brief we were given was ambitious. The product was meant to help clients make better and more tailored investment decisions through a proprietary socially responsible investing model, and to list verified private-market opportunities from both local and international companies. Building all of that before launching anything would have meant a long stretch with nothing in the client's hands.
The solution
We narrowed the first release without closing any doors. Local equities and private-market products went in first, with the structure for international opportunities provisioned but not switched on, and the socially responsible investing model treated as something to refine properly rather than ship half-finished. There are four ways into the platform. Individuals and companies open an account, pass identity checks, and fund a naira or dollar wallet. From there they invest in shares and funds listed on the Nigerian exchange, or across private-market products such as bonds, private debt and real estate. An advisor can propose a trade, but the client has to consent before it is executed. Administrators approve, price and settle, and every action is recorded. The money layer took the most care. Every movement of funds is written to a ledger with its own reference, so the same instruction arriving twice only counts once, and nothing is released until the record has been claimed in a single step. That is what prevents a double payout when two things happen at the same moment.
Key features
- Open an account as an individual or a company, upload your identity documents, and be categorised for risk and compliance without leaving the platform.
- Fund a naira or dollar wallet, and withdraw through a review step where a second person has to approve before any money leaves.
- Invest in shares and funds listed on the Nigerian exchange, directly provided by NGX.
- Invest across private-market products including bonds, money-market instruments, private debt and equity, funds and real estate, each tracking its own valuations and payout schedule.
- Work with an assigned advisor who can propose a trade you consent to before it is executed, keep notes on your relationship, and message each other inside the platform.
- Run a company account where several named signatories must approve, with the number of approvals configurable per account.
- For the firm: approve, price and settle from a back office where each type of administrator sees only what their role allows, with every action written to an audit log and notifications arriving as they happen.
Architecture & engineering
The application runs on Next.js with the App Router. Server components handle authentication, permissions and data access, and the client components stay thin. Sessions are issued by Auth.js, but the user's role is read back from the database on every request rather than trusted from the token, so a permission change takes effect immediately instead of waiting for a session to expire. Data sits in PostgreSQL behind Prisma, across over seventy models and over 150 API route handlers. Migrations are hand-written idempotent SQL rather than generated diffs, which is the safer choice on a database that will hold client funds and has no staging copy alongside it. The money path is designed defensively. Every ledger entry carries a unique reference, so a retried request or a duplicate payment webhook cannot post the same movement twice. Before funds are released, the record is claimed with a conditional update inside the transaction, which means that when two requests arrive together only one of them can proceed. Those two rules cover most of the ways money goes wrong under load. Equities routing sits behind a provider interface. That allowed the platform to be built and exercised against the broker's sandbox while the production arrangement was still being settled, and switching across does not touch the surrounding code. Notifications run over a self-hosted event stream with the database row as the source of truth rather than the connection, so nothing is lost if a client drops. The whole thing is deployed on a VPS rather than a serverless platform, which suits long-lived connections and keeps costs predictable.
The hardest problem
The hardest part was making the money path behave when more than one thing happens at once. A withdrawal being approved twice, a payment webhook arriving again after a retry, an equity order filling against a position that has just changed: each of those can quietly create money that should not exist. The approach was to make every release conditional. Before funds move, the code claims the record with an update that only succeeds if the status is still what it was when the request started. If two requests race, one claims it and the other finds nothing left to claim. Alongside that, every ledger entry carries its own reference, so a retry writes nothing new. Getting there took several QA passes over the codebase: running the test suite, linting, and probing the running application against the database. Those passes turned up real failures rather than theoretical ones. A withdrawal rejected by two administrators at the same moment released the held funds twice. An order that had just been cancelled could still have a fill settled against it. Both were fixed and covered before the code went anywhere near launch.
Results
The site is live and the platform is working today behind account sign-up, fully launched. What can be said is what it replaced. The firm formally ran on manual records and processes that do not connect to each other, and the platform covers all of that in one place with an audit trail behind every action. The clearest signal so far has come from the client side. The scope has grown well beyond the original brief, and I have gone on to build other projects for the same contractor.
Key learnings
Narrowing the first release was the decision that made the project deliverable. The original brief covered local and international private-market opportunities plus a proprietary investing model, and building all of it before launching anything would have meant a long stretch with nothing in the client's hands. Shipping local equities first, with the structure for the rest already in place, put a working product in front of them without painting us into a corner. The specification kept moving, particularly around how investment classes were offered to clients and whether dollar funding was in scope. Building the money layer generically, rather than around one currency or one product type, absorbed most of that churn without rework. On the engineering side, correctness under pressure matters more than feature count in anything that moves money. Two rules did most of the work: claim the record before releasing funds, and give every movement a reference so a repeat cannot be counted twice. The QA passes that found failures were worth considerably more than the ones that confirmed things worked.
Want to see it in action?
Explore the live product, or reach out to talk through the build.