Skip to main content
6 min read J.P.

Web3 UX — Why Adoption Stalls and What We Do About It

A few weeks ago, I sat next to a test participant during a user test — let's call her Sabine, 34, project manager, technically proficient, uses online banking and various SaaS tools daily. The task: connect your wallet to our dApp and vote on a governance proposal. Sabine already had MetaMask installed. She clicked "Connect Wallet." Nothing happened. No pop-up, no hint, no error message. After ten seconds of silence, she asked: "Is this broken?"

It wasn't broken. MetaMask had opened its pop-up, but it had disappeared behind the browser window. A classic that every web3 developer knows — and that no normal user would ever figure out. Sabine needed my help to find the pop-up. After that, she was supposed to sign a transaction. The wallet showed her a series of hex values and asked for confirmation. She looked at me and said: "What exactly am I confirming here?"

Good question. And one that we as an industry need to answer if web3 is ever going to move beyond the niche.

The Wallet Problem

The wallet is the gateway to web3 — and simultaneously the biggest barrier to entry. For people accustomed to "Login with Google" or "Sign up with email," the concept of a browser extension that simultaneously serves as identity, payment method, and keychain is simply overwhelming. Add the seed phrase (12 or 24 words you must store securely but supposedly not in the cloud — then where?), network selection (Mainnet? Goerli? Polygon? Why do I need to know this?), and the fact that a wrong click can be irreversible.

In our experience, roughly 30% of first-time users fail at the wallet connection step. Not because they are unintelligent — but because the UX doesn't make it easy for them. This is not a user problem. This is a design problem.

Gas Fees: Invisible Costs, Incomprehensible Logic

Imagine you want to buy something online. You add the item to your cart, go to checkout — and there it says: "Shipping costs: between 0.50 euros and 47 euros, depending on how many other people are buying things right now." That is essentially the gas fee experience on Ethereum. And it gets worse: if the transaction fails (which absolutely happens), you still pay the gas fee. Try explaining that to someone accustomed to failed bank transfers being free.

Layer-2 solutions like Arbitrum and Optimism have drastically reduced gas costs — to a few cents per transaction. But the UX around gas fees is still confusing. Users need to understand that they require ETH on the correct network to pay for gas. They have to switch their wallet to the right network. And they must accept that the price of a transaction is variable — a concept that doesn't exist in web2.

Error Messages from Hell

My personal favorite among web3 UX disasters are the error messages. When a transaction fails, the user sees something like: Error: execution reverted: ERC20: transfer amount exceeds balance (0x08c379a0...). That is a technically correct error message. For a developer, it is even helpful. For Sabine, it is gibberish.

The problem is structural: smart contracts return error messages in a format meant for machines, not humans. The dApp layer could catch these errors and translate them into comprehensible messages — but that requires effort, and many projects don't invest it. The result: users face cryptic hex values and feel helpless.

The Missing Onboarding

Most web3 applications have no onboarding. They assume users already know what a wallet is, how gas fees work, what a token approval means, and why a transaction sometimes takes minutes. That is like a banking app assuming users understand how SWIFT transfers work.

In the web2 world, good onboarding has long been standard. New features are explained with tooltips, complex processes are broken into steps, and when something goes wrong, there are comprehensible error messages and clear next steps. In web3, users are often thrown into the deep end — and then we wonder why they don't swim.

What We Do About It

At Just Tech Solutions, we have developed a set of principles that guide our web3 frontends. They are not revolutionary — but they make a noticeable difference.

Wallet Abstraction Where Possible

Not every interaction requires a wallet connection. Read operations — displaying proposals, treasury balances, or voting results — work without a wallet. We show this information first and only request the wallet connection when it is actually needed (for example, to vote). This significantly lowers the barrier to entry.

Human Error Messages

We catch contract errors and translate them. ERC20: transfer amount exceeds balance becomes: "You don't have enough tokens for this transaction. Your current balance is X." execution reverted becomes: "The transaction could not be executed. Possible reason: [context-based explanation]." This requires extra development effort, but it is the difference between an application that frustrates users and one that helps them.

Progressive Disclosure

We show technical details only when users want to see them. The default view of a transaction shows: "You are voting Yes on Proposal #42: Increase Q3 budget." The details (contract address, function signature, parameters) are hidden behind an expandable section — visible for power users, invisible for everyone else.

Gas Fee Estimates in Local Currency

Nobody instinctively knows what 0.0003 ETH is. We display gas costs in local currency with a clear classification: "Estimated transaction cost: ~$0.12." This is a simple change that makes an enormous difference for comprehension.

The Structural Challenge

All of these measures help — but they treat symptoms, not the cause. The fundamental problem is that web3 layers a new technology stack on top of the internet and expects users to understand that layer. Web2 did not do this. Nobody needs to understand HTTP to visit a website. Nobody needs to know what TLS is to use online banking. The complexity is abstracted away.

Web3 needs to take the same path. The blockchain, the transactions, the gas fees — all of this should be invisible to end users. The good news: Account Abstraction (ERC-4337) and related standards are heading in exactly this direction. They enable wallets that behave like normal accounts: login with email, gas sponsoring by the application, automatic network selection. We are already experimenting with these technologies and are optimistic that they will fundamentally change the UX landscape in web3.

Conclusion

Sabine successfully completed the user test in the end — with my help. But she should have been able to do it alone. As long as web3 applications require a developer's assistance to accomplish basic tasks, we will not see broad adoption. The technology is ready. The UX is not. And that is a problem we as developers can solve — and must.