Design demo. Every screen here is a static mockup — nothing is connected to a payment system, and no control does anything. Names, balances, account numbers and references are invented for review. The rate shown (¥1 ≈ ₵1.76) is illustrative, not quoted.
Corridor 01 · 21 screens
Before a cedi can reach Guangzhou it has to be in a wallet that Bank of Ghana rules recognise, held by someone the Ghana Card says exists. These twenty-one screens cover that account: getting into it, reading it, filling it and emptying it.
Opening the account and proving who owns it. The hard problem is that Ghana Card verification is not instant and not always successful, so the wallet has to be usable at a lower tier while the card is still with a reviewer — without ever letting the holder discover the ceiling at the moment they hit it.
Ghana ↔ China · eCedi wallet
v0.9.0 · sandbox build
No phone? Dial *714*88#
The splash carries the USSD shortcode because a good share of first launches happen on a borrowed smartphone, on behalf of someone who will never install the app. Telling them at second zero that there is a feature-phone route saves a failed signup.
or dial *714*88# from any phone
One screen, not two. Returning and new users are separated by a secondary button rather than a tab strip, because the overwhelming majority of opens are returning sign-ins and tabs cost the majority a decision. The note pre-answers the question that otherwise stops registration: whether the card is needed right now.
We sent a 6-digit code by SMS to
+233 24 418 0972
The resend timer is a row with a label, not a dimmed link, so it reads as information rather than a broken control. The note exists because impatient double-requests are the single largest cause of failed verification, and users cannot know that the second code silently invalidates the first.
Your name must match your Ghana Card exactly.
Email is explicitly optional and labelled with what it is for, because asking for it unqualified makes people invent one. The purpose question is not analytics — it decides which corridor the dashboard puts first, so the wallet arrives already shaped to the person.
Stating up front which documents are refused prevents the most demoralising failure in onboarding: photographing a passport, waiting two days, and being rejected for the document type. The three captures are separate tiles so a partial submission is visibly partial rather than a single stalled button.
Most cards clear within four hours. Cards submitted after 18:00 are reviewed the next working day.
Review is a queue, so the screen names the stage it is stuck at and why — a blurred card back — rather than showing an indeterminate spinner. The bottom card answers the only question that actually matters while waiting: what the wallet can do right now, at the lower tier.
Each settings row carries its current value on the right, so the list doubles as a summary and most visits end without opening anything. The Ghana Card number is shown in full rather than masked because it is the first thing support asks for and it is not a secret.
Reading the account. The difficulty is that a corridor wallet almost never has one balance: escrow against a live trade, a pending withdrawal and a settled credit can all be true at the same moment. Every screen in this flow shows total and available separately, and says what the difference is made of.
Held against escrow TS-4471.
Total sits largest, but available and held sit directly beneath it and the sentence below names the escrow the hold belongs to. A single headline balance would be actively misleading on any day a trade is in flight, and the holder would only find out at the moment a withdrawal is refused.
The reference is the second line of each row, in monospace, because it is what people are scrolling to find when support asks for it. A returned withdrawal shows ₵0.00 rather than being hidden — the attempt is part of the record even though no money finally moved.
Family support · 26 Sep 2026, 14:02 GMT
Amount sent, fee and the delivered yuan figure stay on separate rows rather than collapsing into one total, because the recipient quotes the yuan and the sender remembers the cedi. Timestamps carry both time zones, so a sender in Accra and a family member in Guangzhou can describe the same moment to support.
| Date | Detail | Amount |
|---|---|---|
| 05 Sep | Salary credit | +4,412.00 |
| 11 Sep | Family support | −876.00 |
| 26 Sep | Top-up · MoMo | +2,000.00 |
Statements get read by landlords, visa officers and employers, so the period, opening and closing figures sit above the table where they can be seen without scrolling. The note about holds is there because a closing balance that does not equal the sum of the lines looks like an error to anyone checking it.
Getting cedis into the wallet from the two rails Ghanaians actually hold money on. The hard part is that neither rail confirms inside the app: MoMo hands control to a network PIN prompt on a different screen, and a bank transfer relies on the sender typing a reference correctly in a completely separate banking app.
₵12,080.50 available · ₵400.00 held
The two rails are compared on the only axes that decide the choice: how long it takes and who charges. Saying that the network charges its own MoMo fee, before the rail is picked, stops the complaint that arrives later when MTN deducts twelve cedis the wallet never mentioned.
Unlinked networks stay in the list rather than being hidden behind an add flow, so the wallet reads as supporting all three from the first look. The number on the linked account is partially masked but keeps the last four digits, which is how people recognise their own line.
Approve the MTN prompt on 024 ••• 0972 with your MoMo PIN, not here.
Prompt expires in 2:41
Control has left the app, so the screen says so plainly and tells the holder where the PIN goes. Both figures are shown because they differ: ₵2,012.00 leaves the MoMo wallet and ₵2,000.00 arrives. The USSD fallback and the warning against restarting exist because a missing prompt is common and a second attempt costs a second charge.
Only one bank is linked; the rest are marked “instructions only” so the difference in what happens next is visible before tapping. The overnight caveat is named here rather than in a help article, because a transfer that appears to vanish until morning is the top support call on this rail.
Valid 24 hours · single use.
The holder is about to leave for a separate banking app, so everything they must retype is on one screen in monospace, with the reference given its own copy control. The consequence of omitting the reference is stated in days, not as a vague warning, because that is what makes people bother.
from MTN MoMo 024 ••• 0972
Success ends on the pair of balances, not on the amount just added, because the reason for topping up was usually to be able to send something. The escrow hold is repeated here so the new available figure never looks like a rounding mistake against the total.
Taking cedis back out to MoMo or a bank account. Withdrawals are where held balance stops being a detail and becomes a refusal, and where a bank on the far side can reject a transfer hours after the wallet said it had been sent — so the status screen is designed around the return, not the success.
Total ₵12,480.50 · ₵400.00 held against escrow TS-4471.
Both accounts must be in the name Ama Boateng.
The withdrawable figure leads, and the total is demoted to the explanation beneath it — this is the one screen where available matters more than total. The name-match line is placed before the choice because a mismatch is the most common rejection and it is cheaper to catch it here.
Fee and net appear on the amount screen, before any confirmation, and the net leads the card because it is the number the holder will go looking for in their bank app. Whether a fee is deducted from the amount or added on top is ambiguous in most wallets, so the note says which in a full sentence.
Enter your 4-digit wallet PIN
Forgot it? Reset with your Ghana Card.
The recap repeats both figures and the reference above the PIN, so the last thing seen before committing is the transfer itself rather than a keypad. The finality note is honest about the only recovery path that exists — a rejection by the receiving bank — instead of implying support can reverse it.
Nothing was lost.
The failed state is the one worth designing, so it is the one shown. It names the cause, states in the first line whether money moved, shows the fee being refunded too, and offers the two things that actually resolve it — correct the name, or use the rail that will work. A bare “withdrawal failed” would leave the holder believing ₵3,000.00 is gone.