Visa Pay · Making cross-border QR payments feel local

Designing a UPI-like payment experience for Southeast Asia, backed by Visa's global rails.

Every Southeast Asian country runs its own QR payment standard. QRIS in Indonesia, PromptPay in Thailand, NETS in Singapore - none of them talk to each other. A traveler from Jakarta landing in Bangkok either carries cash or pays foreign transaction fees on their card.

We were asked to change that.

Role

Product Designer with Visa Team

Shipped

Live across Asia Pacific, Nov 2025

From the streets of Singapore to the shores of Shanghai, Asia Pacific is having a mobile revolution - fast, fearless, and transforming how millions pay every day.

Visit any city in the region and you will see consumers paying with their smartphones, be it scanning QR codes at a food stall, making an account-to-account (A2A) transfer to their friends, or tapping their smartphone on a payment terminal. With mobile wallet users accounting for nearly two in three people in Asia Pacific this year, such “non-card payments” create new choices and conveniences alongside card payments that together are accepted (almost) everywhere.

We say almost, because amidst this explosive growth, non-card payments are still largely limited to domestic use. Enter Visa Pay: it combines decades of Visa experience in digital payments and Visa’s global network to make non-card and wallet payments useful everywhere. With Visa Pay, consumers can use their mobile wallets wherever they go, and merchants enjoy unified digital acceptance with peace of mind.

4.6%

Average lift in authorization rate

350+

Acquirers & Processors

99.999%

Uptime with no planned downtime

Every country in Southeast Asia solved QR payments. Separately.

Indonesia built QRIS. Thailand has PromptPay. Singapore has NETS and PayNow. Malaysia has DuitNow. Each one works beautifully - inside its own border. Step across one and your wallet app is a very expensive camera.

We talked to people living in Singapore and Dubai about how they actually pay when they travel. Interoperability half-exists already. A Dana user in Indonesia can pay a Singapore NETS QR with a card. It's just clumsy, inconsistent, and nobody trusts it.

Visa's answer was to become the wire between all of them. Juspay built the SDK that makes it work. I designed the part a human being actually touches.

The strange part of the brief: this isn't an app. It's a set of screens that get dropped inside someone else's wallet, wearing their colors, running on infrastructure the user will never see and would not enjoy having explained to them.

You can't onboard someone into infrastructure. You can only onboard them into a moment.

Bolstering payment securityTruly global acceptanceReducing payment friction

Non-card payments face these three challenges

Nobody opens their wallet app expecting to meet a new card.

Here's what's actually happening under the hood: we take the money sitting in your home wallet, mint a virtual Visa card against it, tokenize that card to your device, and route a cross-border transaction through it.

Here's what the user thinks is happening: they're paying for noodles.

So we don't introduce the product at install. We introduce it when the phone crosses a border. You land in Singapore, and the app says welcome to Singapore - with Singapore on the screen, not a generic globe.

The best onboarding is the one that waits until the user has a reason to care.

Location aware trigger and self initiated trigger phone screens with an annotation card explaining the trigger hierarchy
Trigger points when user lands in another country

Should the user ever see the card we made for them?

We have to ask for your card number before the product has done anything for you.

Enrollment is the worst trade in the product. We want the most sensitive number a person owns, and in exchange they get a card they can't use until they're standing in another country.

So every screen here is doing one job: removing a reason to walk away.

Scan or type, because people fumble cameras in bad light. A whole bottom sheet explaining CVV, because our user is holding an unfamiliar card somewhere unfamiliar. Terms branded to the issuing bank, not to us, because whoever carries the risk should be legible. Face ID instead of an OTP, because waiting for a text is where people put the phone down.

Then the last frame asks a different question. Now that we've made a card - do we show it?

We didn't pick. showCard shipped as a config flag. Some partners want a Visa card visible in their wallet, some never will. Both are right.

When you have to ask before you can deliver, every screen is an argument for staying.

Eight step enrollment flow across two rows of four connected phone screens each
Adding existing payment method to the global program
Tap to Pay and Scan to Pay enrollment confirmation screens side by side
Enrollment for Scan and Tap to Pay

The QR can't tell you it won't work until you've already scanned it.

Here's the architecture, plainly: both the token and the scanned QR data have to travel downstream before Visa's systems can confirm whether that QR is even serviceable. Non-EMVCo code, unsupported acquirer, a connector Visa hasn't onboarded yet.

Manual trigger and QR trigger error screens shown side by side for a user not yet enrolled
When user has not enrolled for global program yet

The exchange rate always arrives after you've decided.

From the design review, verbatim: “What's the best we can do to bring transparency around FX charges? Some POS terminals let you choose source or target currency at swipe time - should we?” The answer that day was let me come back to it. It stayed open a long time.

Our own research had already sharpened the problem past “show a number.” People didn't want the converted amount. They wanted to know what they were actually going to lose - the live rate plus whatever their bank quietly adds on top. Nobody could promise that in real time.

So we split the difference, literally. The button says what you owe the merchant. A green strip directly above it says what it costs you, in your own money, with a way to dig in.

Three phone screens showing the Scan to Pay flow
Scan to Pay
Three phone screens showing the Tap to Pay flow
Tap to Pay

The last two seconds.

Every other screen here is private. The success screen isn't - it gets held up to a stranger across a counter who needs to believe it in a second, often without a shared language. That's why the Visa sensory moment is load-bearing, not decorative. It's the part that works without reading.

Underneath: processing, success, failure, and the hard one - we couldn't fetch the latest status. Unknown is worse than declined, and most products refuse to design it.

A confirmation screen has an audience of two. Design for the one who can't touch the phone.

Two receipt-style payment confirmation cards showing transaction and FX detail
Physical bill inspired payment details in success page

Shipping it ten more times

There's a second user in this project I nearly forgot: the wallet partner's design team. They're integrating a foreign payment flow into a brand they've spent years building. You can't hand them a fixed design. You also can't hand them a blank canvas, or the flow stops being recognizably safe and the trust breaks.

So the design work is deciding what's negotiable and what isn't. Color, type scale, spacing, icons, illustrations - theirs. Core layouts, gaps between components, mandatory CTAs, Visa branding visibility - locked.

And when a partner goes out of bounds, the SDK corrects instead of failing. It never errors at an integrator. It just quietly holds the line.

Between v1 and v2 we took customization away - nav icons went from open to locked. Every freedom you grant is a support ticket you own later.

A design system for one team is a style guide. For ten, it's a contract.

Phone screenshot annotated with design token callouts pointing to specific UI elements
No error. No failed build. The brand lands, the layout holds. Failing loudly at an integrator is a choice, we made the other one.
Constrained versus unconstrained partner customization comparison with phone screenshots
We documented our own failure mode to justify the constraint

It shipped...

In November 2024, Visa announced QR connector partnerships across Asia Pacific and named Juspay as the payments technology company providing the technical capability. A year later, at Singapore FinTech Festival 2025, Visa Scan to Pay went live across the region.

Collage of press and news coverage extracts about the Visa Pay launch
Extracts from the news

Arguing without evidence is the actual job.

No funnel, no test data, no way to A/B anything inside ten partner apps. Every call came down to research, reasoning, and being willing to say this is right in a room that could overrule me. I got some of it wrong. I'd still rather have made the call than waited for a number that was never coming.

$4.5 Trillion

Wallet Payments by 2026

2.6 Billion

Mobile Wallet users in Asia Pacific

99.999%

Uptime with no planned downtime

Photos from the Singapore FinTech Festival 2025 event
Singapore FinTech Festival 2025
Bengaluru, India--:--
You made it to the bottom. Respect.