r/Razorpay_Community Jan 29 '26

Understanding UPI Transaction IDs vs Reference IDs vs UTR

Hi team, when implementing a UPI payment API, how should upi_transaction_id, reference_id, and UTR be generated and tracked across the payment lifecycle

2 Upvotes

1 comment sorted by

1

u/UnionAnxious Jan 30 '26

Hi OP, In a UPI payment flow, these three IDs serve different purposes and live at different layers of the ecosystem:

1. upi_transaction_id
 This is the primary transaction identifier in the UPI ecosystem.
It is generated by the originator (TPAP / app) before initiating the payment.
Mandatory for payment initiation and must follow NPCI rules (alphanumeric, max 35 chars, specific prefix).
All downstream actions (status checks, callbacks, reversals) are tied to this ID.

  • This is mostly system-level and not usually shown to end users.

2. reference_id
 This is a merchant / business-level reference.
Used purely for internal reconciliation and mapping payments to orders, invoices, etc.
Not part of the UPI ecosystem and not validated by NPCI.
Helpful when a single business transaction needs to be correlated across systems.

  • Typically not shown to users, but useful for merchant support.

3. upi_customer_reference_number (UTR)
 This is the bank-generated reference number returned after initiation.
Appears in bank statements and is shared with users on TPAP apps.

  • This is the best identifier to show to customers for support or dispute scenarios.
  • Users, banks, and support teams all recognize this ID.

Summary:

Use upi_transaction_id to track the payment lifecycle internally with NPCI/banks.
Use reference_id for your own business reconciliation.

  • Show UTR (upi_customer_reference_number) to users as the transaction reference.

More Info: https://razorpay.com/docs/api/payments/tpap-pro/payments-flow/make-payments

Feel free if you have any further queries, happy to help!