Payments
UPI QR codes explained
By OpenQR · updated 20 October 2026
7 min read · Updated 20 October 2026

UPI (Unified Payments Interface) went live in 2016 under the National Payments Corporation of India, and QR acceptance followed immediately because the payload is so small. The interoperable static code — one sticker, every app — is what pushed UPI past cards for small-value payments: a street vendor with a laminated printout accepts digital payment with no hardware and no fees on a standard personal UPI ID.
The payload: a link, not a message
The QR pattern encodes a URI of the form upi://pay?pa=shop@okhdfcbank&pn=Corner%20Store&am=25.50&cu=INR&tn=For%20lunch. The parameters:
| Parameter | Meaning | Required |
|---|---|---|
| pa | Payee UPI ID (virtual payment address) | Yes |
| pn | Payee name shown in the payer's app | Yes |
| am | Amount in rupees, dot decimals | No |
| cu | Currency, always INR | With am |
| tn | Transaction note shown in both histories | No |
| tr | Transaction reference for reconciliation | No |
Two details of the encoding matter to anyone generating these codes. Spaces encode as %20 — a generator using form encoding emits + instead, and some UPI apps then display a literal plus in the payee name. And the amount uses a dot decimal separator, so a value pasted with a comma must be converted, not passed through.
The UPI ID does the work
The payee address (pa) is a virtual payment address like name@okhdfcbank or shop@ybl — an alias that resolves to a bank account through the payer's PSP. The address is the whole identity: no account number, no IFSC code and no bank name appear in the QR code, which is why a printed code keeps working after the underlying account moves and why publishing one reveals nothing but the alias. A UPI ID without the @bank part does not resolve, which is the single most common reason a generated code fails.
Static stickers and dynamic bills
The code described above is static: the same link every scan, no expiry, nothing reported back. A dynamic UPI QR is minted per transaction by a payment service provider — the amount is set at the moment of sale, the code carries a one-time reference, and the PSP confirms payment to the till. That product requires a merchant relationship with a PSP; the static sticker requires nothing but a UPI ID, and most small sellers in India run entirely on it. The reconciliation method is honest and low-tech: the seller watches the UPI app's history, where every credit arrives with the payer's name and the note.
Why interoperability was the whole point
NPCI required every UPI app to read every UPI QR code from day one. A vendor prints one sticker and every customer's app works — no terminal rental, no card network fees, no lock-in to the PSP that printed it.
Where a static UPI QR code works best
- Street food carts and market stalls with fixed menu prices
- Shop counters and delivery packaging carrying a scan-any-app sticker
- Temple donation boxes, school fee slips and community collections
- Tutors, plumbers and freelancers paid by UPI ID
- Shared flats: one code on the fridge for bills
Build one at the free UPI QR code generator — UPI ID shape checked, %20 encoding done correctly, amount and note optional, everything assembled in your browser. For how the same problem is solved in Brazil and the eurozone, read what a PIX QR code is and payment QR codes compared.