One Engine, Many Surfaces: Why We Built for WhatsApp and Voice
The channel is not the product. WhatsApp is where Streemline started because that is where business in Ghana already happens, and voice is where we are going next because plenty of customers would rather call than type. But the thing that makes the system trustworthy — a deterministic core, human approval on consequential actions, every action written to the Record — lives underneath the channel entirely. If that layer is built right, a new channel is a new surface, not a new system. If it is built wrong, every channel is a separate liability.
This post explains the architecture decision and what it took to hold onto it.
Engine below, surfaces above
The SOUL Engine does not know it is on WhatsApp. Every inbound interaction, whatever the surface, is converted into the same internal shape: who is asking, what they want, what data and rules apply. From there the path is identical:
The surface layer above is thin: adapters that translate between a channel's native format and the internal one. WhatsApp is one adapter. Voice is another.
Why WhatsApp first
WhatsApp in Ghana is not one channel among several; it is where the customer already is, for buying, complaining, and confirming payment. Meta's own reporting has long put WhatsApp's global user base in the billions, and anyone operating in West Africa can see its saturation without needing a statistic. Starting anywhere else would have meant asking customers to change behavior, which is the one thing an operations product must never require.
Why voice second
Voice matters here for reasons that are easy to miss from a desk in another market:
Voice is also the harder discipline. A text conversation tolerates a second of latency; a call does not. That constraint pushed us to keep the deterministic core fast, which paid back on every surface.
The rule that makes it work: one Record
The non-negotiable in this architecture is that all surfaces write to the same audit trail. A customer who calls in the morning and messages on WhatsApp in the afternoon is one customer with one history, and a compliance officer reviewing an incident sees one sequence of actions regardless of where each step happened.
The alternative — per-channel logs stitched together after the fact — is how audit gaps happen. We learned to treat the Record as the spine and the channels as limbs.
A worked example: a utility
GridWatch, our utilities product, runs customer intake for power outage reports. Consider one incident from the customer's side.
A resident of a Tema suburb loses power at night. She sends a WhatsApp message: "Light is off at Community 8, since 9pm." The system logs the report, matches it against other reports from the same feeder area — a deterministic correlation, no model involved — and confirms receipt with a reference number. Her neighbor, who does not type, calls instead and says the same thing to the voice surface. Same engine, same incident record; the two reports strengthen the same signal.
When the utility's operations team restores the feeder, a restoration notice goes out — to the texter by WhatsApp, to the caller by voice callback, because the system answers on the surface each person used. Every report, correlation, and notice sits in one trail the utility can audit later.
Neither customer knew or cared which "channel strategy" was in play. Each used the surface natural to them and got the same treatment. That is the entire point.
What this means for you
If you are evaluating any multi-channel operations platform:
Build the engine once, make it accountable once, and let the surfaces multiply. The other order does not work.
FILED BY — Streemline Team · Product & Engineering
✓ ON THE RECORD