Make everything talk — your systems, third parties, old tools and new platforms.
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
Software never lives alone. We build integrations that make your systems talk: third-party APIs connected with correct contracts, webhooks and event-driven sync so changes propagate immediately instead of in end-of-day batches, and legacy connectors that let the old tool keep running while modern logic happens elsewhere. Data mapping and transformation are explicit — fields land where the receiving system actually expects them — and retries, failure handling and reconciliation are built in so a flaky partner doesn't silently corrupt your records. Every integration is monitored like the production path it is.
What a integrations build covers:
Software never lives alone, and every integration is a promise about data moving between two systems built by different people under different assumptions. The seam is the answer: a deliberate adapter layer that keeps the partner's dialect out of the product, webhooks that push events the moment they happen, OAuth delegation that keeps credentials out of the database, and idempotent replay that makes at-least-once delivery harmless. Payment rails are the hardest classroom, and every one of them is treated as a first-class citizen — M-Pesa/Daraja lived as a home-market reality beside PayPal, Stripe, PayStack, cards, bank transfers and client-specific gateways, each boarded with the same verification, idempotency and reconciliation discipline. When a partner fails, retries or misbehaves, the money stays correct anyway.
What we do
How we do it
02 · The full discipline
Every system that does not talk to the others is a silo you pay to duplicate — data re-entered, orders re-keyed, balances re-typed, errors re-explained. Integration is how software stops being a collection of islands: third-party APIs connected to contract, webhooks pushing events the moment they happen, and legacy systems kept working while modern logic runs beside them.
We build the integration seam the way a live platform has to — because our own work integrates with the hardest partners of all. KodiiPay lives on Safaricom's Daraja rails — STK Push, PayBill, C2B, B2B, B2C, Till — plus banks, email, SMS, WhatsApp, push notifications and the device ecosystem, all connected by adapters, verified callbacks, retries and reconciliation. That is not a diagram; it is production code that has carried real money through a partner who occasionally fails, retries and misbehaves — and the money has stayed correct every time.
Below is how integrations are really engineered when a broken partner would be a financial incident, not a ticket. Contracts, webhooks, OAuth delegation, data mapping, the adapter seam, the M-Pesa and messaging rails, error handling, idempotency, reconciliation and the honest truth that bolted-on integration is a special kind of debt.
03
The moment a product is useful, it needs the world: a payment rail to take money, an email service to say thank you, a CRM to remember the customer, a warehouse system to know what is in stock, a bank to settle. Every one of those is an integration, and every integration is a promise about how data moves between two systems that were built by different people, for different purposes, under different assumptions.
A product is only ever as useful as the systems it can reach. We build the reach deliberately, to contract, with the failure behaviour designed before the celebration of success.
04
An API is a contract wearing a URL. The competent integration reads the contract first — endpoints, schemas, pagination, rate limits, idempotency keys, auth — and then proves the reading with real calls against a real environment. The amateur integration writes code against a guess and blames the partner when the guess was wrong.
The credible line between a sandbox and production is whether the code honours the contract's hard parts. We read the contract, prove it in the environment, and ship an integration that behaves correctly when the partner is neither happy nor fast.
05
A webhook is the partner calling you instead of you polling the partner. It is how money tells you it arrived, how an order tells you it shipped, how a form tells you it submitted. The win is immediacy and honesty; the cost is that inbound events are untrusted, unordered and sometimes delivered twice — which is exactly what the design accommodates.
The webhook is the difference between 'the money is here' and 'we will check at midnight'. We build the instant, honest event path — and the discipline that keeps redeliveries harmless.
06
Credential handling is the least glamorous and most important part of integration. A leaked key is an incident that usually outlives the fix; a shared password is a bomb with a delayed fuse. We delegate where the partner supports it, store what must be stored in a vault, rotate what can rotate, and treat secrets as a security control, not an operational detail.
Credentials are the keys to the integration, and keys get lost. We store them like the crown jewels, delegate instead of copying where the partner allows, and rehearse rotation so a change is a routine, not an outage.
07
The most important architectural decision in integrations is the seam: a thin, deliberate layer where the outside world's shape is translated into the product's own language. The rest of the codebase never needs to know whether 'the partner' is Safaricom, a bank, a postal API or a CSV importer — it talks to an adapter, and the adapter talks to the world.
The adapter is the reason 'we are switching payment rails' can be a two-week contract job instead of a system rebuild. We build the seam first, so the world can change behind it without the product noticing.
08
Integration is mostly translation: the partner's field names, formats, timezones and enums almost never match yours. The same customer is 'user_id' in one system, 'client_no' in another and 'CUSTOMER_REF' in a third. Getting the mapping right is where integrations succeed or quietly corrupt.
A mapping bug is a silent corruption bug: the integration succeeds, the data lands, and it lands wrong. We translate explicitly, normalise at the seam and test against real partner output, so 'landed wrong' is a test failure, not a month-end discovery.
09
Some integrations are request/response, but many are data movement: a nightly sync, a bulk load, a warehouse feed, a customer migration, a statement export. The discipline of moving data correctly is not glamorous, and its failures are the kind that surface weeks later as a quiet 'why is this number off?'
Data movement is where integrations earn their keep at scale — and where they leak if nobody checks the counts. We make every bulk move provable: idempotent reruns, logged transforms and a count it can defend.
10
There is no more instructive integration than the payment gateway, and no sterner partner in the Kenyan market than Safaricom's Daraja. Our own platform is the classroom. Every integration we build for clients inherits what we learned sending real money through it: the callbacks are claims, the network drops, the retries redeliver, and reconciliation with the statement is the only truth that settles the day.
Payment integration is the most exacting seam there is, and our classroom is a live platform. Whatever we integrate for you — payments or anything else — inherits the discipline that kept real money correct through a partner that fails, retries and misbehaves.
11
A product that can take money one way turns away everyone who prefers another, and a platform that knows only a single gateway is a feature away from re-platforming. The payment layer is built rail-agnostic: one adapter interface behind which every gateway boards as a first-class citizen — M-Pesa/Daraja lived as a home-market reality, beside PayPal, Stripe, PayStack, card processors, direct bank transfers and client-specific gateways. Each rail arrives with its own shape, and each is reduced to the same contract the domain already speaks.
A rail is a business decision rather than a technology invention, and the adapter layer is what makes switching, adding or dropping a gateway a conversation about money instead of a rewrite. Every gateway that boards inherits the verification, idempotency and reconciliation discipline — none of it unique to one rail, all of it mandatory for every rail.
12
Communication integrations are many and subtle: email with its deliverability physics, SMS with its concatenation and sender-ID rules, WhatsApp with its templates and business constraints, push with its token lifecycles. Each is a partner with quirks, and each is a promise about whether the right person hears the right thing at the right moment.
A notification that misses its person is a promise broken silently. We engineer each channel to its own quirks and connect them to one honest preference model, so the right message reaches the right person at the right moment — and we can prove it did.
13
Sometimes the integration is not a service but a device: a printer, a barcode scanner, a point-of-sale terminal, a camera, an IoT sensor. Device integrations live at the edge of the network where things break physically — cables, drivers, firmware, Bluetooth pairing — and the discipline is the same as for any partner, plus a layer of reality: the hardware is a partner with a body.
A device is a partner with a body and a temper. We engineer the edge so the physical world fails visibly, retries cleanly and reports honestly — and the money side, where a register and a payment meet, carries the same safety as any financial integration.
14
Every partner fails; the difference between a robust integration and a fragile one is what happens next. Timeouts are set, retries are scheduled with backoff, failures are classified, and work that can never succeed goes somewhere visible. The partner's failure is a design input, and the design answers it.
The reliable integration is not the one that never fails; it is the one whose failure is visible, bounded and recoverable. We design the failure behaviour the way the success is designed — because in production they share the same stage.
15
When two systems meet over a network, 'at least once' is a law, not a policy — a redelivered webhook, a retried request, a double-tapped confirm. The defence is idempotency: the receiving system remembers the reference and answers repeats with the recorded outcome instead of re-executing. This is the difference between a dropped notification and a double-charged customer.
The network will make your integration lie about whether something already happened; idempotency is how the system tells the truth anyway. We build remembering into the boundary so the retry is a friend and the duplicate is a no-op.
16
Integration sources of truth disagree, and somewhere a human has to know which one to trust. For money, the gateway's statement is the truth; for data, the source system is. Reconciliation is the standing practice of proving your records and the partner's agree — line by line where it matters, total by total where it scales.
The partner's records and yours will disagree one day; the question is whether you find it at reconcile time with an investigation, or at audit time with a surprise. We build the daily proof so the answer is already known when anyone asks.
17
An integration is a production path with a heartbeat of its own: the partner can be healthy while every call to it fails, and the servers can all be green while the data silently stops moving. Monitoring integrations means watching the boundary itself — call volume, latency, error rate, dead-letter depth and staleness — not just the boxes on either side.
Integration health is the least visible and most business-critical monitoring there is. We watch the boundary the way we watch the servers — with numbers, thresholds and a runbook — so the partner's silence is never mistaken for obedience.
18
An integration that moves money, orders or customer data is production infrastructure, not a utility script to be tried in isolation and forgotten. It deserves the same discipline as the core product: security, logging, error visibility, testing and a named owner. We refuse the framing that calls external calls 'someone else's problem'.
There is no integration that is 'just a call out' once it carries real business meaning. We treat every boundary as a production path with a heartbeat, a runbook and an owner — the same discipline the core product gets.
19
Integration is a special kind of debt when it is bolted on — a direct call to a partner's SDK from ten different screens, credentials living in three config files, a 'quick CSV' written in a week and authoritative ever since. We say plainly what bolted-on integration costs, because the fix is cheaper the earlier it is named.
We will tell you honestly where your existing integrations are carrying bolt-on debt and what it will cost to put a seam under them. And when we build integration from the start, we build the seam first — so the debt is never yours to accrue.
The toolchain
The contract readers, adapters, event machinery, credential vaults, messaging rails and reconciliation tools that make our integrations correct — the same machinery that keeps a live M-Pesa platform talking to the world.
01
Talk to the partner, to contract
02
The partner calls you
03
Keys like crown jewels
04
Translation, tested with real output
05
The hardest classroom of all
06
The right person, the right moment
07
The boundary has a heartbeat
Lifecycle
Every integration we build travels the same path, from the first reading of the partner's contract to the maintained production path it becomes. This is the lifecycle for every API, webhook, data flow and payment rail we connect.
01
Find where the product meets the outside world, and what the boundary needs to own.
02
Endpoints, schemas, rate limits, auth and failure shapes proven with real calls, not docs on faith.
03
A thin boundary translating the partner's dialect into the product's language, once.
04
Every field's source, destination, transformation and example written and reviewed.
05
OAuth where possible, vault-held secrets otherwise, narrow scopes and rotation rehearsed.
06
Timeouts, classified errors, backoff retries and dead letters — the partner's failure as a design input.
07
References on every mutating call and event, so replays and redeliveries are answered, never re-run.
08
Events delivered confirmed, verified and logged; the consumer idempotent by construction.
09
Daily match against the partner's truth, by reference, with drill-down to the discrepancy.
10
Call counts, latency, error rates, dead-letter depth and staleness watched with alert thresholds.
11
The contract, the mapping, the failure behaviour and the runbook written for whoever owns it next.
12
Version it, evolve it as the partner changes, and refactor it out of bolt-on debt over time.
Closing
Integrations are where your product meets the systems the world runs on — and where silos either close or quietly keep you paying to duplicate. When we design and build integrations, that includes:
The partner will change, fail, retry and misbehave. The seam, the idempotency and the reconciliation are how your side stays correct anyway — and the reason a bolted-on integration is a debt we name before it accrues.
We build the seam first and own the boundary forever — so every system you run talks to every system your world runs, correctly, all the time.
Previous capability
Accessibility
Next capability
Legacy System Modernization
The discipline above is what we run on our own products every day. If it would help on yours, our door is open.