Skip to content
Ritesh FirodiyaGet in touch

Work / Aakalan / Wiki / Concepts

upi-cannot-pay-a-number

Conceptcanonicalverified 2026-09-23

CONCEPT.UPI-CANNOT-PAY-A-NUMBER

Summary

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=INR and 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é