Recently, I went on a trip to India with my family. Back in India, my relatives live in a small town of around 100k people. However, all shops and street vendors there accepted this thing called UPI, which stands for universal payments infrastructure.
On a UX level, it works like Zelle. But on an infra level, it’s basically Zelle on steroids. UPI is a national, open real-time payments network run as shared infrastructure, while Zelle is a closed, bank-owned P2P feature layered on top of legacy U.S. banking rails
UPI supports universal QR payments, merchants, and third-party apps at a national scale, while Zelle is mainly a peer-to-peer feature inside bank apps and doesn’t even work half the time.
I took some time out to research the infra behind this, and it’s fascinating. This post shares my findings.
Introduction
UPI is basically a money API operated by the National Payments Corporation of India (NPCI), which operates as the central routing and orchestration layer for all UPI transactions.
The routing looks like:
- You scan a code on a UPI app
- PSP bank apps provide connectivity to the network
- Issuer bank debits the payer
- Acquirer bank credits the reciever
- NPCI routes messages and enforce rules
Let’s break each of these layers down.
Apps
Most common apps I’ve seen are Google Pay, PhonePe, BHIM, and Paytm. These apps just contain UI and some client logic, and prompt you to enter the transaction amount and your pin before they pass it off to the UPI rails.
PSP bank
PSP stands for payment service provider. This is the bank that “sponsors” the app’s connectivity to UPI. If the Google Pay app is the frontend, then this is the backend.
Issuer bank
This is the bank where your account lives. This bank debits the amount from your account.
Acquirer Bank
This is the merchant bank. This is bank credits the reciever.
NPCI
This is the meat and bones of the whole operation. This is the network brain that routes requests between the PSP/issuer/acquirer and applies protocol-level rules across the network.
The key identifer here is your virtual payment address (VPA), which maps your bank account to your UPI profile.
How it scales
UPI uses a hub-and-spoke model. Every app and bank integrates once into the core network operated by NPCI, instead of integrating with every bank.
Secondly, the apps don’t move the money. All UPI apps are intentionally very thin, and all stateful money movement happens at banks. That means less surface area for something to break, because banks already run horizontally scalable core systems and can handle the traffic.
Thirdly, NPCI doesn’t debit or credit accounts. It just routes transactions, applies protocol-level rules, and coordinates responses. The actual execution happens in parallel at thousands of banks. UPI is explicitly designed so that the NPCI is the orchestration layer; Zelle for example relies on loosely coordinated bilateral bank behavior, which doesn’t scale for shit.