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.

VT VyaparGateway Team Payments & Compliance 3 min read
How UPI Intent Deep Linking Works on Android and iOS Browsers: Specs & Parameters guide
upi intent uri parameters upi scheme format android chrome upi intent ios safari fallback mobile checkout ux VyaparGateway

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 the upi intent 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:

KeyParameter NameFormat / ValidationDescription & Example
paPayee AddressAlphanumeric VPAbilling@hdfcbank
pnPayee NameMax 99 charsVyapar Store Online
trTransaction RefMax 35 charsMerchant unique order identifier (ORD_847192)
amAmountDecimal (2 places)1499.00 (Must be greater than 0)
cuCurrency CodeISO 4217Must be set to INR
mcMerchant Category4-digit MCC5411 (Grocery), 5812 (Dining), 5732 (Electronics)
tnTransaction NoteMax 50 charsOrder 847192 - Electronics
urlOrder Summary URLValid HTTPS URLLink 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:

<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.