Tests that protect money and trust — because with payments, a small regression costs cash.
Before you read: Written from live engineering practice — the money-moving, million-user work our team runs on our own products, set down so anyone building something can learn from it.
01 · What it is
Quality assurance on a money product isn't a nice-to-have; a regression in the payment path costs customers cash and trust in real time. We build automated unit, integration and end-to-end tests that run on every release, manual QA for the human touches automation can't judge, and edge-case and boundary testing that finds the bug your users would have found first. Payment and reconciliation scenarios are tested as scenarios — double-submission, retries, partial failures, exact rounding — and regression suites exist precisely to ensure what we already fixed never comes back. Bugs are triaged with clear severity so the scary ones never wait behind the cosmetic ones.
What a quality assurance build covers:
A QA engineer sees a release differently: not as the features that shipped, but as a set of claims — about the fee, the balance, the retry, the callback — each of which must be provably true. We build that wall from the inside, starting with the flows that can lose money or trust and moving outward to the cosmetic, because a severity-ranked queue is the only queue a payments product survives with. On a platform that pays through many rails at once, that discipline repeats on every one of them: the same callback, idempotency and reconciliation checks that guard an M-Pesa/Daraja flow at home are reapplied to PayPal, Stripe, PayStack, cards and bank transfers. Money does not get an easier standard because it travelled a different wire.
What we do
How we do it
02 · The full discipline
Most teams discover quality after the fact — a bug in production, a customer who notices before you do, a release that has to be reverted at the worst hour. Quality assurance is the discipline that moves those discoveries earlier: proving the system behaves before it meets real users, and being able to say exactly what was tested, what passed and what was deliberately deferred.
We build QA into every money product we ship — and we run it every day on KodiiPay, a live payments platform where a regression means real cash and real trust in real time. Automated unit, integration and end-to-end suites gate every release; payment scenarios are tested as scenarios — retries, double-submission, rounding, network drops; skilled humans cover the moments automation cannot judge; and bugs are triaged by severity, not volume, so the money-critical fix never waits behind a typo.
Below is how we actually do QA — the pyramid, the environments, the bug lifecycle, the coverage reality and the honest economics of test automation — because on a product that moves money, 'it works on my machine' is not a quality plan.
03
Testing is not a stage the product passes through before launch; it is a wall between the team's confidence and the customers' wallets. We treat QA as a standing function that starts at requirements and ends after the fix has survived production.
On our platform the wall is literal: a money path that fails its suites cannot ship, and no urgency argues around it.
04
We test in layers because each layer catches a different class of screw-up, and the pyramid shape makes the suite fast, cheap and dependable — many small unit tests, fewer integration tests, a precious few end-to-end journeys and a thin, deliberate layer of human judgement on top.
The pyramid is why our suite is fast enough to run on every commit and strong enough to block a release — speed and protection are the same thing when a suite must gate everything.
05
Unit tests prove the smallest units behave: a fee function returns the right amount, a validator rejects a malformed phone, a state machine refuses an illegal transition. They run in milliseconds, they run on every commit, and they make the base of the pyramid solid.
Unit tests are how a fee change is safe to ship on a Friday — and how the team knows it before the build, not after the complaint.
06
Products break at the seams — where the app meets the API, the API meets the database, the database meets the gateway. Integration tests prove the seams hold: the request, the query, the constraint and the response behave together.
Integration is where 'the screen worked in isolation' stops being enough — because in production nothing is isolated.
07
The end-to-end layer drives the full product as a user would: open the app, walk the flow, reach the outcome. It is the most expensive layer, so we choose the journeys that carry the most risk and protect them like wiring.
An e2e journey is the only test that knows what a user feels — and on a money product, feeling is part of correctness.
08
Money logic fails in scenarios, not in units: a double callback, a retried push, a rounding split, an insufficient balance at the worst moment. We test payments as the situations they really are, not as happy-path functions.
Our own payment suite rewinds these scenarios every release, on M-Pesa/Daraja as the lived home-market rail and on every card, PayPal, Stripe, PayStack and bank rail we touch — because each once cost us a real lesson, and each is now a permanent gate.
09
The most expensive bug is the one you already fixed that came back. Regression suites carry the entire history of the product's hard-won lessons and re-run them on every change, so nothing the team conquered gets quietly resurrected.
Regression is why the product can keep getting faster and newer without forgetting the million small truths it already learned.
10
User acceptance testing is where the owner agrees the product does what they asked. Because we write acceptance criteria into every feature, UAT is a structured walkthrough of proven behaviours, not a demo day of vague impressions.
A signed-off UAT is the moment trust becomes contractual — which is why we make it impossible to fake.
11
Scripted tests prove what we predicted; exploratory testing hunts what we failed to predict. A skilled tester walking the product without a script — trying the weird path, the old device, the double tap — finds the bugs the automation never imagined.
Automation tells us what we built behaves as designed; exploration tells us what we forgot to design — we run both, always.
12
A product that excludes users not only fails people; it fails audits, reputations and sometimes the law. We test accessibility as a quality gate, automatically in the build and manually on the assistive paths that matter.
Accessibility is not a niche audit in our QA; it is one of the standing walls every release walks through.
13
Performance problems are release problems: the platform is slower than it was, the launch day melts the database, the rent rush exhausts the pool. We test performance before the traffic arrives — load, stress, endurance and the budget — so speed is proven, not discovered.
On a platform where rent day is the load test, we compress the test to a Thursday afternoon instead of discovering it in production.
14
Tests run in an environment that lies about production produce tests that lie. We maintain environments that reflect the real stack — the real database shape, the real provider integrations, the real version drift — so a passing test means something true.
A test that passes only in an environment that shares nothing with production is a test that passes for a holiday — the wall needs an environment it can believe in.
15
Kenyan users hold an enormous range of phones on a range of networks, and the difference between a cheap Android and a flagship is not cosmetic. We test across a deliberate matrix — entry-level, mid, high-end; Android and iOS; the browsers that matter — so the product survives the market's full hardware.
A product that only smiles on a flagship has not been tested in Kenya; our matrix is built around who actually holds the phone.
16
A bug is not a fact until it is triaged, and it is not resolved until it has been verified and survived production. We run a disciplined lifecycle so the word 'fixed' means something the whole team can trust.
A mature bug lifecycle is why 'fixed' on our builds is a word you can build a weekend on.
17
A backlog sorted by shout-count buries the scary bug under the cosmetic one. We triage by real severity and risk — payment-critical fixes never wait behind typos, and the cosmetic backlog is never confused with the dangerous one.
We would rather ship with three cosmetic blemishes than one financial wound deferred — the severity discipline says that out loud.
18
Automation only protects a product if it can stop a bad release. Our test suites are wired into CI as a genuine gate: the build fails, the deploy stops, the notification lands, and the release cannot pass until the suites are green.
A gate that can be argued around is a gate that will be argued around exactly once, on the worst bug of the year.
19
Automation catches the logic; skilled humans catch the feel. A careful manual pass catches the awkward wording, the unreadable row on a small screen, the moment a flow feels wrong even though every assertion passed — the judgements a machine cannot run.
Machines are honest about logic; humans are honest about feeling — QA on a product worth shipping is always both.
20
QA is not just a bug-catcher; it is the reference a business holds up to prove its product is real — to partners, to regulators, to auditors and to itself. We treat test evidence as a deliverable, written so the truth is inspectable long after the sprint.
A company that can point to its suite and its reports is a company that can survive an audit; that is the level we build to.
21
Coverage percent is the most lied-about number in software, because it measures lines executed, not risk covered. We report coverage honestly — what it means, what it does not, and where the real gaps live — so the number improves decisions instead of decorating a dashboard.
An honest coverage report is the difference between a team that knows its exposure and a team that is surprised by it.
22
We do not sell automation as free lunch. Automated tests cost time to write, time to maintain and time to run; they pay back when they catch a production bug, gate a bad release or let a change ship on a Friday in confidence. We are honest about the economics because a team that mismanages them abandons the whole idea, and everything is lost.
Automation is an investment with a return curve; we build it where the curve is steepest and refuse it where it is fantasy.
23
The cheapest bug is the one never created. We push quality upstream — reviews, specification, static analysis and the discipline of writing tests as you code — so the suite is the backstop for a team that was trying to be correct all along.
Detection protects the release; prevention protects the team's time, the budget and the customers' mornings.
The toolchain
The machinery of proof — from the smallest unit test to the load sim and the evidence report. Every layer exists because a live money product made it necessary.
01
The smallest truths, proven fast
02
Proving the seams hold
03
The journey, with real threads
04
Tested before the traffic
05
The second standing wall
06
A wall it can believe in
07
What was tested is written down
Lifecycle
Testing is not a release ritual; it is a standing loop that starts before requirements and keeps running after the fix has survived production.
01
What 'done' must prove per feature and per release, written before the build.
02
The flows that can lose money, trust or data, and the priority for protection.
03
The pyramid sized to the risk: units, integrations, journeys, human passes.
04
Production-like staging, honest stubs, seeded fixtures, pinned versions.
05
Automated tests developed beside the code, not after it.
06
Fast layers run in CI on every push and block a red build.
07
The precious journeys and the payment scenarios tested as scenarios.
08
Exploratory, accessibility and feel passes on the flows automation cannot judge.
09
The owner walks the checklist; every pass and fail is captured.
10
The full wall, the severity triage and the deliberate deferrals with reasons.
11
Crash, error and latency signals confirm the fix held after release.
12
Honest coverage, trend and prevention reviews feed the next cycle.
Closing
Quality assurance on a product that moves money is not a nice-to-have — it is the wall between the team's confidence and the customers' wallets. Our QA practice includes:
QA is not the department that finds the team's mistakes; it is the function that makes the product safe to believe in — and on a money product, belief is the whole business.
We test because 'it works on my machine' is not a quality plan — and because we have run a live platform long enough to know exactly where the walls belong.
Previous capability
Product Design Systems
Next capability
Performance Engineering
The discipline above is what we run on our own products every day. If it would help on yours, our door is open.