← HCB case
Portfolio case · B2B fintech · Kazakhstan

Unified QR: one code,
every bank.

“My job wasn’t to draw a screen — it was to untangle the complexity so a busy merchant walks through it without thinking.”

Merchant onboarding → payment acceptance Role: Senior Product Designer, end-to-end discovery NDA-safe: demo amounts, no bank branding, no names
The stakeKazakhstan’s first interbank Unified QR — no local reference to copy.
The constraintHard compliance (KYB/KYC, limits) on a mandatory, deadline-driven feature.
The userSMB merchants who have a queue at the counter, not time for banking UX.
01
Why this was hard

“Show a QR” hides a regulated, multi-bank machine

The ask sounded like one screen. Underneath it: three legal merchant types with different verification law, several banks routed behind a single code, compliance checkpoints with transaction limits, multi-location retail, and four payment states each carrying merchant anxiety.

First in the country

No interbank QR existed in Kazakhstan. We decided to arrive first — which meant designing the pattern, not applying one.

Compliance is load-bearing

KYB/KYC and limits are not edge cases here — they are the flow. The design question is where they sit, not whether.

Mandatory feature

Merchants didn’t opt in — regulation pushed them in. A confusing flow wouldn’t lose a lead; it would flood support.

02
The complexity map — hero of this case

A tree, not a line

The whole flow at once, forks first. Six numbered forks (◆) is where the product thinking happened — each one is annotated below with the decision, the alternative I rejected, and what testing showed.

Merchant wants to accept payments
entry: app or branch
◆ FORK 1Merchant type
Sole proprietor (ИП)
simplified KYB · tax ID + bank data
Company (ООО)
full KYB · statutory docs, beneficiaries
Self-employed
KYC only · ID + liveness
◆ FORK 3Compliance checkpoint KYB/KYC + limits
Limited mode while checks run
accept up to a capped monthly volume before full approval
Bank A · Bank B · Bank C
interbank rails — several receiving banks can sit behind one code
◆ FORK 2Bank & account binding
◆ FORK 4Points of sale
Single location
default — zero questions asked
Multi-location
added later · QR per location
QR IS LIVE
merchant can accept from any bank’s customer
Customer scans & pays
any bank app
◆ FORK 5Payment states
Success
full-screen receipt, settlement time
Processing
explicit status, not a spinner
Declined
Refund
reverse path from receipt
◆ FORK 6Declined: what next?
Reason + next action
retry QR / offer another method
fork — a decision I owned (annotated below) flow node milestone ← scroll horizontally →
03
Every fork, accounted for

Decision · rejected alternative · evidence

Complexity is only valuable if you can show what you did with it. For each fork: what I chose, what I deliberately didn’t, and what testing or data showed.

1

Merchant type: ИП / ООО / self-employed

Decision

One entry point, branching after type selection. Each type sees only the fields its legal status requires; the flow adapts instead of the merchant.

Rejected

A single universal form covering all three types — “simpler to build”, one spec, one screen.

Test showed

In prototype tests the universal form stalled self-employed users on statutory-document fields they don’t legally have. The branched version passed without a single clarifying question.

2

Bank & account binding (the “unified” part)

Decision

Hide multi-bank routing behind one QR. The receiving bank is chosen once, in settings — never at the moment of payment. The counter shows one code, always.

Rejected

Exposing bank choice per transaction — technically “more transparent”, and the banks initially wanted their brand visible at pay time.

Test showed

Interviews at the counter: merchants refuse to “think about banks” with a queue in front of them. Per-payment choice produced hesitation, mis-taps, and a slower line — the exact failure mode for retail.

3

Compliance checkpoint: KYB/KYC + limits

Decision

Split verification into steps with checkpoints between them, and open a limited mode early: merchants accept payments under a capped limit while full checks run in the background.

Rejected

A full KYB gate before any access — everything up front in one heavy form. Safest on paper, and the default the compliance team started from.

Test showed

When compliance added three fields two weeks before launch, I modelled the funnel in three days: a projected −40% completion. The phased checkpoint plan was approved in a single meeting — argued with data, not taste.

4

Points of sale: one or many

Decision

Default to a single location; “add a location” lives in the dashboard, with a QR generated per location. Onboarding never asks about it.

Rejected

Asking “how many locations?” during onboarding for everyone — the classic “collect it while we have them” instinct.

Test showed

20+ discovery interviews: the overwhelming majority of SMBs start with one point of sale. The question up front was pure cognitive tax on the 90% to serve the 10% — who found “add location” later without help.

5

Payment states: success / processing / declined / refund

Decision

Promote confirmation to a full-screen receipt — amount, source bank, settlement time. Processing is an explicit named state, never an anonymous spinner.

Rejected

A toast notification over the transaction list — the standard, “lightweight” pattern every wallet uses.

Test showed

The discovery insight (below) reframed this: merchants re-checked history repeatedly to confirm money arrived. The full-screen receipt with settlement time removed the re-checking loop in follow-up tests.

6

Declined: dead end or next action?

Decision

Every decline carries a reason and a next action — retry the QR or switch method — phrased for the merchant, who is standing in front of a live customer.

Rejected

A bare “Payment declined” status. Honest, minimal — and useless at the counter.

Test showed

In usability sessions, declines without a next step ended in “I’d call support”. With reason + action, participants resolved the situation at the counter without leaving the screen.

04
The discovery insight that rewrote the flow

After 20+ merchant interviews, the core anxiety wasn’t the QR at all. It was trust: “will the money actually reach my account?”

We went in assuming the hard part was understanding the new payment method. It wasn’t. Merchants understood QR instantly — they didn’t trust where the money went afterwards. That single finding re-ordered the information architecture.

  • Confirmation moved to the front. Full-screen receipt with settlement time became a first-class screen, not a toast.
  • Settlement clarity over feature tours. “When and where money lands” outranks explaining interbank rails.
  • Speed of confirmation drove IA. Dashboard leads with today’s money-in, per location — not with settings or promos.
05
Two forks, one level deeper

Where the untangling actually happened

Fork 2 · bank binding

Several banks. One code. Zero questions at the counter.

“Unified” meant multiple receiving banks could sit behind one QR — an interbank first for the country. The tempting design was to surface that power: pick a bank per payment, show logos, celebrate the rails.

I inverted it: all bank logic collapses into a one-time binding decision in settings. The merchant’s mental model stays “my QR receives money”, and the routing complexity became a systems problem — where it belongs — worked through with the systems analyst, not pushed onto the counter.

Bank ABank BBank C ONE QR customer pays from any bank app
Fork 3 · compliance

Compliance as checkpoints, not a wall

Regulation was non-negotiable; its placement was designable. Instead of a single KYB wall before any value, verification became a stepped path with checkpoints — and a limited mode (capped monthly volume) opens after the first checkpoint, so merchants earn value while checks run.

The proof moment: three new mandatory fields landed two weeks before launch. Rather than argue taste, I spent three days modelling completion — projected −40% — and proposed phasing the fields across checkpoints. Approved in one meeting. Data, not status.

Step 1 · identity ✓ limited mode opens Step 2 · business docs full limits
06
Key screens · hi-fi

Five screens that carry the flow

UI copy in Russian — the market’s language. Amounts are demo values (NDA). Every color on these screens resolves from the same token set: background.* · foreground.* · border.* · radius.*

9:41●●●
Приём платежей
Кто принимает оплату?
От этого зависит, какие документы понадобятся
ИПИИН и реквизиты — проверим сами
ОООУставные документы и учредители
СамозанятыйТолько удостоверение личности
Понадобится ~4 минуты. Приём оплаты включится после первого шага.
Продолжить
1 · RegistrationOne entry point; the flow branches after this tap, not before.◆ Fork 1 — merchant type
9:41●●●
Проверка · шаг 2 из 4
Личность подтвержденаИИН · удостоверение
Реквизиты на проверкеобычно до 1 часа
3
Данные о деятельностивид бизнеса и адрес
4
Полные лимитыпосле завершения проверки
Доступно уже сейчас
Принимайте оплату с временным лимитом, пока идёт проверка. Лимит вырастет автоматически.
Продолжить позже
2 · Stepped verificationCompliance as visible checkpoints — with limited mode open before full approval.◆ Fork 3 — compliance & limits
9:41●●●
Принять оплату
Межбанк. QR
Рассрочка
Счёт
₸ 24 500
Работает для клиентов любого банка
Изменить сумму
3 · Accept paymentInstallments / interbank QR / invoice — with all bank routing hidden behind one code.◆ Fork 2 — one QR, any bank
9:41●●●
Оплата получена
₸ 24 500
Сегодня, 14:32
Зачисление на счёт··4210 · сегодня до 18:00
Банк покупателясторонний банк
Точка продажКофейня, ул. Абая
Комиссия₸ 122,50
Следующая оплата
4 · Confirmation / receiptThe trust screen: amount, settlement time and account — full-screen, first-class.◆ Fork 5 — payment states
9:41●●●
Мой бизнес
Поступления сегодня
₸ 186 300
2 точки продаж · 14 операций
Кофейня, Абая
₸ 124 800
Точка №2, ТРЦ
₸ 61 500
Последние операции
Оплата по QR14:32 · Кофейня
+24 500
успех
Оплата по QR14:07 · ТРЦ
+12 900
в обработке
Возврат13:40 · Кофейня
−12 000
возврат
5 · Acceptance dashboardLeads with today’s money-in per location — the answer to “did it arrive?” before anything else.◆ Fork 4 · Fork 5 — locations & states
07
Edge states — where maturity shows

Declined · multi-location · refund

9:41●●●
Оплата
Оплата не прошла
₸ 24 500
Недостаточно средств у покупателя
Деньги не списаны — покупатель может оплатить снова или выбрать другой способ.
Показать QR ещё раз
Другой способ оплаты
E1 · DeclinedReason + next action at the counter — no dead ends, no support calls.◆ Fork 6 — declined path
9:41●●●
Точки продаж
Кофейня, ул. Абая
QR №1 · активен
принимает
Показать QR точки →
Точка №2, ТРЦ «Мега»
QR №2 · активен
принимает
Показать QR точки →
+ Добавить точку продаж
У каждой точки — свой QR: выручка и статистика разделяются автоматически.
E2 · Multi-locationOne merchant, many counters — added from the dashboard, never asked at onboarding.◆ Fork 4 — points of sale
9:41●●●
Возврат
Сумма оплаты₸ 12 000 · QR, 13:12
Возврат₸ 12 000 · полный
Покупателю вернётсяна карту, до 3 дней
Возврат подтверждёнсегодня, 13:40
Банк покупателя обрабатываетобычно до 3 рабочих дней
Деньги вернутся покупателюпришлём уведомление
Чек возврата
E3 · RefundThe reverse path with the same trust logic: explicit timeline, no ambiguity about where money is.◆ Fork 5 — payment states
08
Outcome

What shipping first looked like

40K+
merchants per month accepting via the flow
98.5%
transaction success rate
4.92
Voice-of-Customer score

“The tree stayed complex — regulation guaranteed that. The merchant’s path through it became a straight line. That gap between the two is the design work.”