Case study · written version

Shappay

The long version: why an interoperable QR is public infrastructure rather than another silo, and what it cost to decide to hold balances.

Role
Product Designer & Engineer · Founder
Read time
~11 min
See it working
/work/shappay
The problem

Sending money should not require typing 10-digits all the time.

Most Nigerians hold multiple bank accounts across different banks. Every transfer means typing a 10-digit account number, choosing the right bank from a growing list, and hoping you got it right, multiplied across every account you own.

It is the single most error-prone moment in everyday payments and it scales terribly to merchants, who have no terminal and no way to get paid except by dictating account details out loud. The rails to fix this already exist. NIBSS NQR is Nigeria's national interoperable QR standard, built on the same EMVCo spec that powers India's UPI QR. The standard was there. The experience and the resolution engine beneath it was not.

The core bet

One scan or one ID replaces the entire ritual.

Shappay's central design decision: remove manual entry completely. Scan a QR or type a name@shappay address, and the resolution engine already knows who to pay and on which rail.

01 / DECISION

Static QR first

The MVP ships a static merchant QR where the payer enters the amount. The cheapest path to a working loop; print it once, accept money forever.

02 / DECISION

Two addressing modes

Every user gets a name@shappay virtual address; so P2P payments work by typing an ID, not only scanning. QR and VPA resolve through the same engine.

03 / DECISION

Wallet-first execution

Funding and checkout are decoupled. Banks are touched once, topping up via Mono not on every payment. Checkout clears against wallet balance.

The pivot

Mid-build, the architecture was wrong. So I changed it.

The original plan: scan a QR, resolve the merchant, fire a real-time transfer straight from the payer's linked bank. Validation proved that bet couldn't hold.

What testing revealed

Providers like Mono DirectPay handle account linking, authorization, and payment initiation, but not persistent, real-time orchestration across multiple banks. Every payment would have inherited bank uptime, latency, high fees, and redirects.

The re-architecture

Separate the two flows that were wrongly fused: funding ≠ checkout. Banks are touched when a user funds their wallet: not on every scan. Payments execute against wallet balance. For a high volume transaction startup, this architecture fits perfectly.

BEFORE · FRAGILE
Scan→Bank auth→External redirect→Settlement
AFTER · INSTANT
Scan→Resolve→Wallet debit→Settlement

The honest tradeoffs

Holding balances raises the bar; naming the costs is part of owning the decision.

↑ REGULATORY SURFACE

Storing value pulls in a sponsor-bank partnership and stronger compliance controls.

↑ USER TRUST

Users now trust Shappay with balances: raising the bar on security and withdrawals.

↑ LEDGER WORK

Internal balance tracking, ledger consistency, and failed-transfer recovery.

↑ FLOAT & SETTLEMENT

Liquidity movement, settlement timing, reversals, and reconciliation.

Systems

Three layers, one loop.

The pivot resolved into a clean separation of concerns. Being able to build each layer is what let me design the UX around its real constraints.

→ 01

Identity Layer

EMVCo / NQR payload generation and parsing, plus name@shappay VPA addressing: two ways to identify any destination.

→ 02

Resolution Layer

Merchant and account resolution, settlement-preference routing, and rail selection.

→ 03

Execution Layer

Wallet infrastructure, bank transfer rails, and settlement execution.

scan / VPA → resolve → wallet debit → settlement

Funding via Mono DirectPay. Wallet, ledger, and outbound payouts via Anchor.

Routing rules

The resolution engine outputs a routing decision on every transaction. Three cases, evaluated in order:

CASE A · FAST PATH

Shappay → Shappay

Destination has a Shappay wallet. Execute instant ledger transfer on Anchor: wallet to wallet. Highest success rate, lowest latency.

CASE B · PAYOUT PATH

Shappay → External bank

Destination is an external merchant. Debit customer wallet on Anchor, trigger async outbound payout to merchant's bank account.

CASE C · FALLBACK

Unsupported QR scheme

QR payload cannot be resolved. Surface manual bank transfer entry screen: always a path forward, never a dead end.

Why it matters
An interoperable QR is public infrastructure, it bridges the digital divide instead of building another silo.

Interoperable QR is a form of Digital Public Infrastructure; the same pattern that took India's UPI from zero to billions of transactions. The CDPI specification is already in discussion with 30+ central banks, Nigeria among them.

Shappay builds on NIBSS NQR as Nigeria's implementation and treats the design problem as: how do you make national-scale financial inclusion feel like scanning a square?

Roadmap

From a printed square to a payments platform.

NOW

Wallet-first MVP

IN BUILD

Link banks, fund wallet, pay by scanning a QR or typing name@shappay, settling to wallet or bank.

NEXT

Dynamic QR

ROADMAP

Amount embedded in the code for point-of-sale and one-tap checkout.

THEN

Merchant tools · POS · Invoice QR

ROADMAP

Payment links, invoice-bound codes, and a merchant dashboard with analytics.

LATERAL

AI powered QR Soundbox

ROADMAP

An AI powered QR Soundbox that reads out payment received, available in multiple Nigerian languages. Can also respond with transaction summary.

Reflection

What designing the engine taught me.

The temptation in fintech is to design the screens and treat the rails as someone else's problem. Shappay only works because I refused that split. Understanding the TLV format changed the product: static-first stopped being a compromise and became the obvious wedge.

The hardest decisions weren't visual; the most important was admitting the first architecture was wrong. Re-drawing the line between funding and checkout, choosing to hold a wallet, deciding where settlement lands: those are the calls that turned a fragile demo into something shippable.