developer
How UPI Intent Deep Linking Works on Android and iOS Browsers: Specs & Parameters
Master UPI intent deep linking on Android Chrome & iOS Safari. Complete technical guide on upi://pay URI parameters, app-specific schemes, and QR fallbacks.
Over 82% of all e-commerce checkouts in India take place on mobile devices. For Indian consumers, typing a 20-character Virtual Payment Address (VPA) into a payment form and waiting for a push notification (the legacy “UPI Collect” flow) creates massive conversion drop-offs.
UPI Intent eliminates that friction. With a single tap, the browser opens the customer’s preferred UPI app (Google Pay, PhonePe, Paytm, or BHIM) with the exact merchant name and order amount pre-populated.
Here is the deep technical specification of how UPI intent deep linking functions across Android and iOS mobile browsers.
The Mechanics of Mobile UPI Intent
Direct Answer: UPI Intent operates via mobile OS URI protocol handlers. When a mobile web browser navigates to a
upi://pay?...URL, the mobile operating system intercepts the custom scheme and queries its internal package manager to identify all installed applications registered to handle theupiintent filter, displaying the native app selector sheet to the user.
[ Mobile Browser Checkout Button ] ──► Clicks <a href="upi://pay?pa=...">
│
▼
[ Android OS / iOS Intent Intercept ]
│
▼
[ Native Bottom Sheet Launches: ]
├── [ Google Pay (Tez) ]
├── [ PhonePe ]
├── [ Paytm ]
└── [ BHIM ]
│
▼
[ User enters 4/6-digit PIN ] ──► Sub-second bank transfer complete!
Complete NPCI URI Parameter Reference
The following parameters must be strictly URL-encoded to ensure compliance with the NPCI UPI Linking Specification Version 1.6:
| Key | Parameter Name | Format / Validation | Description & Example |
|---|---|---|---|
pa | Payee Address | Alphanumeric VPA | billing@hdfcbank |
pn | Payee Name | Max 99 chars | Vyapar Store Online |
tr | Transaction Ref | Max 35 chars | Merchant unique order identifier (ORD_847192) |
am | Amount | Decimal (2 places) | 1499.00 (Must be greater than 0) |
cu | Currency Code | ISO 4217 | Must be set to INR |
mc | Merchant Category | 4-digit MCC | 5411 (Grocery), 5812 (Dining), 5732 (Electronics) |
tn | Transaction Note | Max 50 chars | Order 847192 - Electronics |
url | Order Summary URL | Valid HTTPS URL | Link to web order invoice page |
Android Chrome Intent Resolution
On Android devices, Google Chrome and Android WebViews support both generic URI links and explicit Android Intent syntax:
Method A: Generic URI (Recommended)
<a href="upi://pay?pa=merchant@bank&pn=Store&tr=ORD101&am=500.00&cu=INR">
Pay via Any UPI App
</a>
Method B: Explicit Android Intent Scheme
If you wish to force the Android package manager to open a specific application directly (e.g. PhonePe):
intent://pay?pa=merchant@bank&pn=Store&tr=ORD101&am=500.00&cu=INR#Intent;scheme=upi;package=com.phonepe.app;end
iOS Safari Challenges and Custom URL Schemes
Unlike Android, Apple’s iOS does not support open intent negotiation for generic upi:// schemes in WebKit. If a user on an iPhone taps upi://pay?... in Safari, iOS will display an error: “Safari cannot open the page because the address is invalid” unless an app with that specific scheme is installed.
To ensure 100% checkout completion on iOS:
1. App-Specific iOS URL Schemes:
- PhonePe:
phonepe://pay?... - Google Pay:
tez://upi/pay?... - Paytm:
paytmmp://pay?... - BHIM:
bhim://pay?... - CRED:
cred://upi/pay?...
2. The Universal QR Fallback:
If the user is on an iOS device or desktop browser, render the Dynamic QR code prominently on screen. The user can simply scan the screen with their iPhone camera or UPI app.
Building a Bulletproof Omnichannel Checkout Script
Here is the JavaScript detection pattern utilized by modern payment gateways:
function triggerUpiCheckout(upiData) {
const isAndroid = /Android/i.test(navigator.userAgent);
const isIOS = /iPhone|iPad|iPod/i.test(navigator.userAgent);
const baseUpiParams = `pa=${upiData.vpa}&pn=${encodeURIComponent(upiData.merchantName)}&tr=${upiData.orderId}&am=${upiData.amount}&cu=INR`;
if (isAndroid) {
// Android: Trigger generic intent sheet directly
window.location.href = `upi://pay?${baseUpiParams}`;
} else if (isIOS) {
// iOS: Open modal showing dedicated app icons or dynamic QR fallback
showIosAppPicker(baseUpiParams, upiData.qrCodeUrl);
} else {
// Desktop: Display Dynamic QR Code modal
showDesktopQrModal(upiData.qrCodeUrl);
}
}
With VyaparGateway, these multi-device fallback rules are handled automatically by our responsive hosted checkout pages.
Generate custom intent links right now using our Free UPI Intent Generator.
Direct answers
Frequently asked questions
- What is the difference between UPI Intent and UPI Collect?
- UPI Collect requires the customer to type their VPA and wait for a payment notification request in their app (taking 15–45 seconds). UPI Intent automatically invokes the installed UPI app directly on the user's smartphone with 1-tap PIN authentication.
- Why does the standard upi://pay URI fail on iOS Safari without app-specific schemes?
- iOS enforces strict app transport policies and does not maintain a unified intent resolver like Android. On iOS, Safari either requires app-specific custom schemes (e.g. phonepe://, paytmmp://) or an automatic fallback to an on-screen dynamic QR code.
- What are the mandatory URI parameters for an NPCI-compliant UPI Intent link?
- The mandatory parameters are pa (Payee VPA), pn (Payee Display Name), tr (Transaction Reference ID), am (Transaction Amount), and cu (Currency Code, set to INR).
Build your payment flow
Explore the API and browser-only merchant tools.
Create UPI checkout orders, verify signed events, or test the free calculators and generators without exposing credentials.