Platforms and marketplaces
Systems collecting from customers and paying out to sellers, riders or agents.
- Collections
- Payouts
FinTech · Payment Systems Engineering
CodeWave designs and builds payment-oriented systems — collections, wallets, checkout and payout flows — where M-Pesa, Stripe, PayPal and partner APIs are wrapped in transaction workflows with statuses, ledgers, reconciliation and reporting.
Channels
Workflow
Ledger
01 · The problem
Almost anyone can make a payment succeed once in a demo. The cost lands in the cases that follow — and they all involve money.
A payment integration is a distributed system with an unreliable network in the middle and a customer who has already been debited. It has to be engineered for the day it goes wrong, because that day decides whether the business trusts its own numbers.
A provider retries a notification and the system records the payment again — unless it was built to recognise it.
The customer has paid, the system never hears about it, and support becomes the reconciliation process.
A request times out and nobody can say whether the money moved without checking the provider by hand.
A payment lands with no reliable link to an order, invoice or account.
The system, the provider and the finance team each have their own definition of "paid".
Because nothing was designed to be compared, comparing becomes a manual project.
02 · Who it is for
If money moving through your system is what the business depends on, the integration is not a feature at the end of the project.
Systems collecting from customers and paying out to sellers, riders or agents.
Businesses holding balances for their users and needing a ledger that balances.
Retail, service and subscription businesses taking payment through several channels.
Teams with a working system that now needs payment handled properly inside it.
03 · How a payment moves
The shape of a payment flow CodeWave builds. Each step is a recorded state, which is what makes the transaction answerable later.
The system creates the transaction and records what it is for before any money moves.
System
STK Push, checkout or a direct payment to the business Till or PayBill.
Customer
The provider confirms, declines or times out — and the response is treated as data, not truth.
Provider
Notifications are processed idempotently, so a repeat cannot create a second payment.
System
State is confirmed against the provider rather than assumed from the first message received.
System
The movement is written with its reference, so the balance has an explanation.
Ledger
What the system holds is compared with what the provider reports, on a defined cycle.
Finance
Settled, pending and failed transactions are reportable without exporting anything by hand.
Business
Transaction states the system distinguishes
"Paid" is not one state. Separating them is what lets a business answer, at any moment, whether a specific customer's money actually arrived.
04 · Channels
Every provider has its own behaviour, its own failure modes and its own go-live process. Knowing them in advance is most of the work.
A payment prompt on the customer's phone. The engineering matters in the gaps: the prompt the customer ignores, the one they approve after the request expired, the confirmation that arrives twice.
Customer-initiated payment to a business Till, which arrives without knowing what it was for. Matching it to an order or account is the part worth designing.
Account-referenced payments where the reference is entered by a human — so validation and matching have to tolerate what people actually type.
Card and international payments, with webhooks, disputes and refunds handled as part of the transaction lifecycle rather than out-of-band.
International collection where the customer expects it, integrated with the same status model as every other channel.
Where a business has its own arrangements, those APIs are integrated with the same discipline — recorded state, retries and reconciliation.
05 · How we engineer it
Which is to say: the parts that matter. These are the design decisions that separate an integration that works from one you can run a business on.
A notification processed twice must not create two payments. Handling is keyed so repeats are recognised, not replayed.
A request that times out leaves the transaction in a defined state with a way to resolve it — never in silence.
Payments move between recorded states, so "what happened to this transaction" has an answer with timestamps.
Transient provider failures are retried deliberately rather than abandoned or hammered.
Every transaction stores the provider's own reference, which is what makes reconciliation possible at all.
Movements are written as entries that balance, rather than as a number updated in place.
Credentials live in the deployment environment, not in code, and not on this page.
Requests are validated before anything is initiated, because the cheapest failure is the one that never started.
Payment flows are logged and monitored so a problem is noticed by the team rather than reported by a customer.
06 · Ledger & reconciliation
Systems that move money need to answer two questions at any moment: what is the balance, and which movements produced it.
CodeWave builds ledgers as entries rather than as a total that gets edited — so a balance can always be walked back to the transactions behind it, and what the system believes can be compared against what the provider reports.
Reconciliation · period ———
System vs providerMatched
Pending
Exceptions
07 · What we build
These are the shapes this work usually takes. Most engagements are one of them, or a combination that grew out of one.
Taking payment from customers reliably, through the channels they actually use, with every payment matched to what it was for.
User balances backed by a ledger, with movements that can be explained and audited.
Paying out to sellers, agents or staff, with approval, status tracking and a record of what was sent.
Recurring charges, renewals and failures handled as a lifecycle rather than as a monthly script.
APIs for your own clients or internal systems, and webhook handling that survives provider behaviour.
Transaction reporting that finance can use, built from the same records operations work with.
08 · Said plainly
Payments attract vague claims. Here is the boundary, stated once and clearly.
09 · Technology
Queues, caching, relational integrity and API design matter more here than framework preference — and the choice follows what the business already runs.
Provider credentials, endpoints and environment configuration belong to the client's deployment and are never published or shared between projects.
Clients
Application
Providers
Infrastructure
Architecture at a conceptual level
10 · Business benefits
No figures here either — but every item below is something a finance team can feel within a month.
Transactions have a defined state and a resolution path instead of an unanswered question.
Idempotent handling means a repeated callback cannot inflate what the business believes it received.
A specific payment can be traced end to end without opening a provider portal.
Comparing system and provider is a routine, not a monthly investigation.
Operations and finance read the same records rather than arguing about two exports.
Once the transaction model is right, a new provider is an integration rather than a rewrite.
11 · FAQ
Including the ones about what we are not — those matter most in this category.
Prefer the engineering story? Read the Wallet & Payment Platforms case study.
No. CodeWave is a software engineering company. We design and build the systems that initiate payments, handle provider callbacks, record transactions, keep ledgers and reconcile — integrating with providers such as Safaricom's M-Pesa, Stripe and PayPal. The money itself moves through those providers and the institutions behind them, under your own agreements with them.
M-Pesa through the Daraja API — STK Push, Till and PayBill flows — alongside Stripe and PayPal for card and international payments, and partner APIs where a business has its own arrangements. Which of them belongs in your system is a design decision, not a checklist.
The difference shows up in the cases nobody demonstrates: the callback that arrives twice, the one that never arrives, the customer who pays after the request expired, the network timeout that leaves a payment in an unknown state. Reliable integrations are built around those cases — idempotent handling, recorded state transitions, retries and a reconciliation path — not around the successful case.
Yes. Wallets, collections and payout flows are work CodeWave has built, with ledgers, transaction workflows and reporting behind them. What is appropriate for a given business depends on the regulatory and commercial arrangements it already has — which is part of the scoping conversation, not an afterthought.
That is a common engagement. We work with the system you have, design how payment state should live inside it, and integrate the provider without rebuilding what already works.
You do. The merchant accounts, Till or PayBill numbers, provider agreements and settlement arrangements are the client's. CodeWave builds the software that works with them and never takes custody of funds.
By designing for it from the start: every transaction carries its state and its provider reference, so what the system believes can be compared with what the provider reports. The exact reconciliation workflow is shaped around how the business closes its day, week or month.
More from CodeWave
Payment Verification & Business Operations
Know when the payment arrives.
Business Management
One system from the till to the back office.
Property Management
Every property, unit, tenant and payment in one place.
Start a project
The one with the callback nobody trusts, the reconciliation that takes three days, or the channel you have been putting off. That is the conversation we are useful in.