Case study · Onez.io
One wallet. 15+ brands.
How I turned a crypto wallet into a white-label platform. Each new client got a fully working app in its own brand in 2 to 4 weeks, without forking the product.
White-label
Web3
Wallet
Product strategy
Design system
Role
Senior Product Designer with product ownership
Clients
NoBanka, Qadirah, Binary, Vaultex, Afrex, Sdefi + 9 more under NDA
Launch
2 to 4 weeks per client
Team
5 people
Period
2023 to 2024

One structure, every client’s brand.

The problem
Every new client wanted “their” wallet
A white-label wallet serves two audiences with opposite needs. If every client request became a custom screen, we would end up maintaining 15 slightly different wallets. Every fix and every feature would cost 15 times more, and quality would drift where it matters most: in transactions.
The client
A fintech, an exchange or a DeFi project that wants a wallet in its own brand, with its own assets, networks and payment partners.
The end user
Someone trusting the app with real money. They don’t care whose logo is on top, but sending, receiving and recovery must be clear and predictable.
The question I set for the team
How do we let each client feel the product is theirs, while keeping one wallet underneath that we improve once and ship to everyone?
The strategy
Three layers, one product
I split the product into three layers and agreed with the business on one rule: clients can change the top two layers, never the core. Every client request became a simple question: is this a brand change, a configuration change, or a real product change?
Brand layer
How it looks
Logo, colour palette, light or dark theme, fonts, icon style, promo banners
Set per client
Configuration layer
What it does
Starter, Advanced or Ultimate package, then a toggle per feature: staking, NFTs, buy and sell, widgets
Switched on per client
Shared core
How it works
Send, receive, swap, history, contacts, recovery and security, one component library
Same for every brand
A fix in the core ships to all 15+ wallets at once.
For configuration I designed three packages: Starter for newcomers to crypto, Advanced with NFTs and staking, and Ultimate for power users. On top of the package every feature has its own toggle, so a client switches a module on or off without a single new screen. Every screen had to stay complete with any combination.

Key design decisions
Five decisions behind one product for fifteen brands
01
The brand lives on the surface, the logic stays the same
Each client could bring its colours, a light or dark theme, its fonts and icons, and even its own token or promo banner on the home screen. I explored the balance card and home in many variants until one structure worked for every brand, from clean white to neon dark.
Clients got a wallet that looks like their own. Users got send, receive and recovery screens that behave the same in every wallet, so branding never gets in the way when they check an address or a fee.

02
A home screen built from modules
Clients didn’t sell the same services. Some needed staking, others NFTs or WalletConnect. Instead of a home screen per client, I designed a stack of widgets: balance, contacts, pay with QR, services, favourite wallets, price chart, activity and news.
Each client turns on the modules that match its business and the layout still holds. The same structure gave users a “Customize widgets” option, so one decision served both audiences.

03
A send flow that covers every state, once
Sending crypto is where users lose money, so this is where I went deepest. The recipient field is one component with 17 documented states, from a pasted or two-line address to recognised and unrecognised addresses, memo, gas and network fee.
Four ways to pick a recipient sit in one control: manual address, human-readable address, saved contact or your own wallet. A zero fee balance state warns users who hold a token but not the coin needed to pay the fee, one of the most common reasons a transfer fails. Because it all lives in the core, every client got the same safety net.

04
Selling through providers, configured per client
Cash-out depends on licences and regions, so the wallet doesn’t sell crypto itself. I designed selling as a provider choice: the user sees the amount and its estimated fiat value, then picks a partner such as Ramp or MoonPay. The provider list is part of the configuration layer, so each client shows only the partners available to it.

05
Crypto basics, taught on the home screen
Many clients brought users who were new to crypto. I added story-style covers to the home screen, each explaining one topic: first launch, recovery phrase, private keys, exchange, buying crypto, WalletConnect, staking, NFTs, spam filter and watch-only wallets. Clients reused them as they are, which removed a whole category of onboarding requests.

Beyond mobile
Same core, every surface
The rules that kept 15 brands consistent also kept three surfaces consistent. Desktop reuses the mobile flows and components, and the website sells the same white-label promise to businesses.
Mobile app
iOS and Android, 300+ screens in the shared core.
Desktop app
The same flows and components, adapted to a wide window.
Website
The storefront that pitched each product to businesses: “Get your own brand wallet”.
Onez Wallet · Mobile app
Core flows every brand shipped
Six flows from 300+ screens. Everything here lives in the shared core: clients changed the colours and switched modules, never these flows.
Onboarding
From first launch to a backed-up wallet in six steps.

Home and packages
One modular home. Clients pick Starter, Advanced or Ultimate, users customise the rest.

Send
Every state covered once, in the core, for every brand.

Buy and exchange
Providers and rates are configured per client, the flow stays the same.

Web3
Modules a client switches on: WalletConnect, NFTs and Ordinals.

Security
The part no client can change: PIN, auto-lock, recovery.

Onez Wallet · Desktop app
The same core, on a bigger screen
Every desktop flow reuses the mobile logic and components, adapted to a wide window. One rule set, two platforms, every client brand.

Start and restore
Create or restore a wallet in a few steps, protected by a PIN from the first screen.

Home and wallet
The same modular home and asset list as mobile, laid out for a wide window.

Send
Favourite contacts, human-readable addresses and QR, the same rules as on mobile.

Buy and exchange
Providers and rates come from the client configuration.

Staking and NFTs
Modules a client can switch on for its users.

Connect and secure
WalletConnect for dApps, settings and security in the shared core.

My role
Owning the product, not just the screens
Holding both roles meant I didn’t hand designs to someone else to defend. I decided what went into the product and then designed it. We were a team of five: me, a frontend developer, a software engineer, a project manager and a business developer who brought in the clients.
Client request triage
Every request was sorted into brand, configuration or core. Most turned out to be configuration, which kept the core clean.
Release planning
Core improvements grouped into regular releases, each shipped to every client wallet at once.
Design system
One master component library behind every brand, so a new client meant new tokens, not new screens.
Engineering hand-off
Every flow came with its full set of states, so developers never guessed edge cases per brand.
Outcome
What it delivered
15+
client brands launched, none of them a fork
2 to 4
weeks from a signed client to a working wallet
3
packages plus a toggle per feature
1
shared core across mobile, desktop and web
What I learned
White-label design is a product architecture problem first and a visual problem second. The most valuable thing I designed wasn’t a screen, it was the line between what a client can change and what stays the same. Once that line was clear, saying no to clients got easier, because the answer was a principle, not an opinion.