Fast everywhere — no matter the device, network or number of concurrent users.
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
Speed is a feature, and on Kenyan networks it's a loyalty feature — a slow app gets deleted. We engineer performance deliberately instead of discovering it at launch: load and stress testing that shows where it breaks before traffic does, query and index optimization so the database doesn't become the wall, caching at the right layers instead of everywhere cheaply, and performance budgets that hold the line as features multiply. We measure Core Web Vitals and app start times, and we test on slow networks, not just the office Wi-Fi — because the customer who matters is the one on the flaky connection.
What a performance engineering build covers:
Performance is decided by the slowest path a user actually walks, not by the fastest one that looks good in a benchmark — and on patchy mobile networks that path is brutal. Measurable p99s and the worst case carry more weight than the average, so the discipline starts by finding the slowest endpoint and instrumenting it like a crime scene. Load testing happens before traffic arrives rather than after the first spike discovers the ceiling, and the budgets that hold the line live in CI alongside correctness. Speed only earns trust when it is a number that keeps being true in production.
What we do
How we do it
02 · The full discipline
A slow app is not a slow app; it is a product that got uninstalled, a checkout that got abandoned, an M-Pesa push that timed out with the customer staring at a spinner. Speed is not a polish pass you apply at the end; it is a budget you set at the start and a discipline you enforce as features ship. Users forgive many flaws — they do not forgive slowness.
We build performance engineering into every project we touch, and we run it as a live practice on our own payments platform. KodiiPay moves real money through M-Pesa on Safaricom's Daraja rails — STK Push, PayBill, C2B, B2B, B2C, Till — and it does that on prepaid Kenyan data bundles over networks that drop, flap and throttle. That is not a stress-test scenario we invented; it is the everyday reality the platform was designed for. We measure, profile, index, cache and load-test until the numbers hold, because a payment notification that arrives late — or a gateway callback that drags on any rail — is a customer who has already checked their M-Pesa statement and called support.
Below is how performance engineering is really done when your own product's reputation depends on it. Budgets, Core Web Vitals, profiling, database indexes, N+1 elimination, caching, CDN delivery, load testing and the monitoring that keeps it true in production — every layer is what we actually apply, and we bring the same machinery to every product we build for clients.
03
A product that is fast on office Wi-Fi but slow on the network your customers actually use is a product that is slow, full stop. In Kenya the network is the product's environment: prepaid data bundles, shared connections, 3G transitions, and phones that have been perfectly serviceable for years. We engineer for that reality from the first screen.
Speed is loyalty: a fast product gets the benefit of the doubt, a slow one loses it even when it is objectively better. We build speed in so the product keeps that benefit long after launch.
04
Every performance decision starts from one admission: people are impatient, and they are right to be. A form that takes eight seconds to respond reads as broken; a checkout that spins after the money left the wallet reads as lost money. The whole discipline of performance budgets exists because users will not explain their impatience — they just leave.
We do not ask users to be patient; we earn their patience by making the product fast. When a user never notices the performance, that is the performance working.
05
A budget is only useful if it is enforced. We set explicit numbers for core Web Vitals, app start time, bundle size and API latency, and the CI pipeline refuses builds that blow them. Features that would bankrupt the speed you shipped with are caught at review time, not discovered by users at launch.
Budgets make performance reviewable the way security and correctness are reviewable. Without a number, 'it feels fast enough' is a feeling; with a number, it is a fact that CI defends.
06
You cannot engineer what you do not measure, and you cannot measure performance from a single number. We instrument the metrics that map to real user experience — the ones that decide whether a person stays on the page, completes the payment or gives up.
The metrics are chosen to mean something about a human sitting with a phone, not to make a dashboard look green. If the number does not predict whether a user stays or leaves, we do not cheer it.
07
Behind almost every 'the app got slow' is a database. The database is where the product's truth lives, and if reading that truth is slow, no amount of frontend polish helps. We treat query performance as a first-class engineering concern, the same way we treat correctness.
The database either scales with you or it becomes the wall you hit at the worst time. We index, profile and sanity-check so the wall arrives only when you deliberately decided to move it.
08
The most common performance bug in the industry is also the quietest: a list screen that fetches the rows, then fetches related data for every row in a loop — one query for the list and one hundred for the details. It is invisible at ten rows and devastating at ten thousand.
N+1 is the reason 'it worked in the demo' and 'it crawled in production' can describe the same screen. We kill the pattern at review so it never shows up in the demo.
09
It is tempting to guess where the slowness is. Guessing wastes time and occasionally makes things worse. We profile first — in development, in staging and in production — and fix what the profiler proves, not what a hunch accuses.
Measure, then cut; never cut blind. The profiler decides, and when the profiler and the hunch disagree, the profiler wins.
10
Cached data is fast data — if it is the right data at the right layer, with invalidation that actually works. A cache without a working invalidation strategy is a bug factory; a cache with one is one of the biggest speed wins available.
Caching done right is nearly free speed; caching done wrong is wrong data shown proudly. We build the layer and the invalidation together, because one without the other is a liability.
11
Kenya's traffic, like the world's, crosses the internet in unpredictable ways. A CDN puts static and near-static content closer to the user, and the edge has uses well beyond images — it can terminate TLS, enforce rate limits and absorb the cost of many round-trips before the origin ever sees them.
The edge is a multiplier for the parts of the product that can be cached, and a firewall for the parts that must not be. We use it for both, deliberately.
12
An app that performs on fibre but stumbles on a prepaid 4G evening is an app that performs for the wrong audience. In Kenya the network is a first-class engineering input: bundles cost money, throughput fluctuates, towers congest, and a phone may sit on a 3G fallback for long stretches. We design for that reality, not against it.
The best optimization is the request you never send; the second best is the request you send once. Mobile-first performance is that discipline applied every day on the networks real users hold.
13
Images are the heavyweight of the modern web and the easiest win. A photo that is not resized, compressed and lazily loaded is a bill the customer pays on every visit. We build the asset pipeline so the right file arrives at the right size without anyone having to think about it.
Every kilobyte travels through a Kenyan data bundle before it reaches a customer. We respect the budget as if it were money — because to the user, it is.
14
Performance is not only about fast single requests; it is about many requests at once. What feels like 'the app slowed down' at 5pm may be a server that cannot multiplex, a connection pool that exhausts, or a query that holds a lock while forty others queue behind it.
Performance at one user is a demo; performance at a thousand concurrent users is engineering. We design the concurrency posture before the spike proves it necessary.
15
A system that is fast for hundreds but slow for millions was built to a number someone picked in a meeting. We design and measure for growth so performance holds as users multiply — and we are honest about which number will be the first wall, so it is never a surprise.
Scale is not a feature you buy; it is a property you design and prove. We build for the ceiling you intend to reach and keep the ladder approved before you need it.
16
The worst time to discover the ceiling is the moment traffic arrives. Load testing is how a system learns its own shape — how many users it serves at target latency, what breaks first, and exactly what the recovery looks like when it does.
A load test that passes is a floor, not a ceiling — but a load test that never ran is a leap of faith. We prefer the floor we measured.
17
Performance is a running property, not a launch-day certificate. Between launches, features land, data grows and the network shifts; only live monitoring tells you whether the number you shipped is still the number you are running.
Performance without monitoring is a promise nobody checks. We monitor so the promise stays true and a drift is a papercut with a timeline, not a mystery at month end.
18
Performance engineering is powerful and it has honest boundaries. We will tell you what it cannot do, because the discipline is worth more when it is honest about its own ceiling.
We will tell you honestly when your product does not need an elaborate cache hierarchy — and give you the smallest correct performance posture. And when it does need the real machinery, this is the real machinery.
The toolchain
The exact instrumentation, profilers, index tooling, caching layers and load harnesses we run — the same machinery we use on a live payments platform that must be fast on Kenyan networks.
01
The numbers that hold the line
02
Find the truth before the fix
03
The truth must be fast to read
04
Fast reads, honest invalidation
05
The payload is the bill
06
The ceiling is found on purpose
07
The promise stays true in production
Lifecycle
Performance is a standing discipline, not a launch-day polish. This is the lifecycle every product we performance-engineer passes through — including the one we run ourselves on a live payments platform.
01
Explicit numbers for LCP, INP, CLS, start time, bundle weight and API p95, written into the repo.
02
Measure the current truth in development and production; find the proven cost centers before fixing.
03
Index the hot paths, read the plans, kill the N+1s — the back end is where most ceilings live.
04
Images, bundles, compression and deferred loading — every kilobyte is a customer's data bundle.
05
Edge, HTTP and short-TTL caches placed deliberately, each with invalidation designed, not hoped.
06
Pools, locks, timeouts and async queues sized and proven so slow work cannot starve fast work.
07
Real user paths at realistic mix over throttled networks until the ceiling is a known number.
08
Verify pools reprime, queues drain and the tail recovers when load drops.
09
Hot paths and money endpoints watched as live percentile numbers with the money-path alerts.
10
Budgets become gates; a feature that bankrupts speed is rejected at review, not discovered by users.
11
As users, data and features grow, the numbers are re-derived deliberately rather than abandoned.
12
Performance is a standing practice — profile, index, cache, test, monitor — as long as the product runs.
Closing
Performance engineering is the difference between a product that feels alive and one that feels broken — and on prepaid Kenyan networks it is the difference between loyalty and uninstall. When we engineer performance, that includes:
Users forgive a lot — loading spinners, occasional errors, a feature that misses by a mile. They do not forgive slow. Everything above exists to make sure the product earns the forgiveness it gets.
We measure what we ship and we ship what we have measured. When speed matters — and it always does — your product gets the discipline that survived being live, not the one that survived a lab.
Previous capability
Quality Assurance
Next capability
Accessibility
The discipline above is what we run on our own products every day. If it would help on yours, our door is open.