Work / Aakalan / Wiki / Concepts
upi-cannot-pay-a-number
Conceptcanonicalverified 2026-09-23
CONCEPT.UPI-CANNOT-PAY-A-NUMBERSummary
A UPI intent has exactly one payee field, pa, and it takes a VPA. There is no
public mapping from a phone number to one.
Why it matters
Resolving a number to a VPA is something only a PSP can do, from its own directory, after the payer has authenticated to it. An app that appears to "pay to a number" is opening its own directory, which a third party cannot. So when Aakalan holds a number but no VPA, the only honest options are to ask for one or to record a payment made elsewhere.
Implications
- settle-no-upi offers exactly those two, and nothing that pretends otherwise.
- It carries a field to WRITE THE ANSWER DOWN.
/users/{uid}is readable by its owner alone, so a friend's UPI ID never arrives in a snapshot — without somewhere to record it the screen asks a question it cannot keep the answer to and says "no UPI ID" forever. - The named-app deep links (
tez://,phonepe://,paytmmp://,bhim://) are alternate schemes onto the same spec. They still need a VPA. - The intent carries
cu=INRand Indian PSPs will not route anything else, so a non-INR balance gets the cash/bank path instead. 'any'is always used rather than a named app: the system chooser lists the apps actually installed, which beats a chip row that lets you pick one you do not have.
Related
Sources
- src/lib/upi.ts
- src/app/settle/[id].tsx
Every project of mine is written down like this.
Read the résumé