·3 min read·← All posts
UPI NPCI Payments FinTech

The basics

UPI (Unified Payments Interface) is a real-time payment rail built on IMPS. A user authenticates with a UPI PIN; the payment moves between bank accounts in seconds. NPCI runs the central switch.

Integration: your service is a TPAP (third-party application provider) connected to a sponsoring PSP (payment service provider) bank. The PSP bank handles the NPCI connectivity; you handle the user experience.

The quirks

Collect requests aren’t push notifications. A “collect” is your request to the user’s app for them to authorise a payment. The user has 30 seconds to act (configurable, max 5 minutes). If they don’t, the request expires; your app gets a failure notification — sometimes immediately, sometimes minutes later. The lag is the spec, not the bug.

Status codes don’t always match the actual outcome. A RC=ZA (deemed approved) means NPCI thinks the payment succeeded; the destination bank might still reject it later. You can’t treat ZA as final until you see the consequent credit confirmation.

Refunds aren’t reversals. A “refund” via UPI is a new credit transaction from your bank to the user. It uses a different VPA (your business one) and a separate RRN. You can’t refund a UPI debit by sending the same transaction reversed.

The VPA (UPI ID) has rules. Some PSPs allow @upi, @paytm, @phonepe. Some don’t. The integration spec says alphanumeric + dot + hyphen; in practice some PSPs reject underscores. Always validate against your PSP’s accepted character set.

Per-day per-user limits vary by bank. ₹1 lakh is the spec ceiling; some banks default to ₹25K for new customers. Your app has to handle “amount exceeds daily limit” gracefully — show the user what their bank’s limit is if you can.

The webhook surface

Your service receives webhooks for:

The webhook delivery is at-least-once. Idempotent handlers are mandatory; the same notification can arrive 3-5 times for one transaction.

What broke first

For a P2P lending platform integration:

The reconciliation pattern

Every day:

  1. Fetch the NPCI settlement file (via the PSP).
  2. For each transaction: compare our local state to the file.
  3. Flag discrepancies for operator review.

Most discrepancies are timing (we showed PENDING; file shows SUCCESS). A few are real (we showed SUCCESS; file shows FAILED). The reconciliation is the only way to catch the few.

What I’d carry forward

For UPI specifically:

The spec is precise once you’ve read it three times. The integration partner’s specific quirks are what take the time. Build for the reconciliation case first; the happy path will figure itself out.

← Back to all posts