UPI average ticket size from NPCI monthly data: a trend project
In this article (8 sections)
Related programme: the Data Analytics with Generative AI course (3–4 months; ₹90,000 (inclusive of GST) · EMI from ₹4,000/month).
The average UPI payment has been getting smaller as UPI spreads into everyday small purchases, and you can measure that yourself from NPCI's own monthly figures. This project builds a clean monthly series of volume, value and average ticket size from NPCI's UPI Product Statistics. It adds a growth decomposition and a short written explanation of what is and is not driving the trend. It is compact enough to finish in a weekend and rich enough to discuss for half an hour.
The source and its columns
Open NPCI's UPI Product Statistics. The page has tabs for Daily and Monthly Statistics, Uptime, Downtime/Incidents and IPO Mandate, plus a financial-year selector and a Download control. The monthly table has four columns:
- Month
- No. of Banks live on UPI
- Volume (In Mn.), transactions in millions
- Value (In Cr.), rupees in crore
A note on the page says that from August 2018 same-account debit and credit are excluded. Copy that note into your README, since it marks a definitional break in the series.
Why employers like this one
Fintech, bank, payment-aggregator and consulting teams all ask analysts to turn aggregate numbers into a story about customer behaviour. This project tests three things they care about: unit handling (crore and million in one ratio is where people slip), careful language about causation, and a clear chart. It also gives you something to say in an interview at any payments company in Noida or Gurugram without claiming insider knowledge.
The unit arithmetic, done once and tested
Value is in crore (1 crore = 1,00,00,000 = 10⁷ rupees) and volume is in millions (10⁶ transactions). So:
average ticket (Rs) = value_cr * 10^7 / (volume_mn * 10^6) = 10 * value_cr / volume_mnPut that factor of 10 in a named function with a test, not inline in a notebook cell.
Code on a synthetic series
Every number below is synthetic, made up for the exercise. The strings imitate how NPCI prints figures, with Indian digit grouping such as "1,31,787.27".
import pandas as pd
raw = pd.DataFrame({
"Month": ["Apr-25", "May-25", "Jun-25", "Jul-25", "Aug-25", "Sep-25"],
"No. of Banks live on UPI": ["640", "642", "645", "649", "651", "655"],
"Volume (In Mn.)": ["15,000.00", "15,600.50", "15,900.25", "16,700.00", "17,100.75", "17,400.10"],
"Value (In Cr.)": ["21,00,000.00", "21,60,000.00", "21,40,000.00", "22,50,000.00", "22,80,000.00", "22,90,000.00"],
})
def to_number(s: pd.Series) -> pd.Series:
"""Strip Indian-style thousands separators and convert to float."""
return pd.to_numeric(s.str.replace(",", "", regex=False), errors="raise")
def avg_ticket_rupees(value_cr: pd.Series, volume_mn: pd.Series) -> pd.Series:
return 10 * value_cr / volume_mn
df = pd.DataFrame({
"month": pd.to_datetime(raw["Month"], format="%b-%y"),
"banks": to_number(raw["No. of Banks live on UPI"]),
"volume_mn": to_number(raw["Volume (In Mn.)"]),
"value_cr": to_number(raw["Value (In Cr.)"]),
})
df["avg_ticket_rs"] = avg_ticket_rupees(df["value_cr"], df["volume_mn"]).round(0)
# Unit test: 1 crore over 1 million transactions is Rs 10 each
assert avg_ticket_rupees(pd.Series([1.0]), pd.Series([1.0])).iloc[0] == 10
# Month-on-month growth, decomposed: value growth ~= volume growth + ticket growth (in logs)
import numpy as np
logs = np.log(df[["value_cr", "volume_mn", "avg_ticket_rs"]]).diff()
logs.columns = ["value_growth", "volume_growth", "ticket_growth"]
print(pd.concat([df[["month", "avg_ticket_rs"]], logs.round(4)], axis=1))The log decomposition is the most useful idea here. Log value growth equals log volume growth plus log ticket-size growth, exactly (apart from the rounding of the ticket column). When value grows more slowly than volume, the gap is precisely the shrinking ticket. That is one clean sentence for your conclusion.
Cleaning issues you will actually meet
- Revisions. Recent months can be revised. Keep each download dated, and diff new downloads against old ones.
- Month labels. Parse them explicitly with a format string rather than trusting automatic parsing.
- Financial-year pages. The selector splits data by FY (April to March). Stitch the years and check for duplicate or missing months.
- Breaks in definition. The August 2018 note is one. Look for others in footnotes.
- Bank count is not a quality measure. More banks live on UPI does not mean more usage. Resist plotting it on the same axis as volume.
Analysis plan
- 1Build the full monthly series since the earliest month the page offers, with each download dated.
- 2Compute average ticket size and the log growth decomposition.
- 3Mark seasonal months. A festive October or a year-end March can shift both volume and value, so compare each month with the same month a year earlier.
- 4Bring in context from NPCI's ecosystem statistics. The P2P and P2M split shows whether the mix is moving toward merchant payments, and it is covered in the merchant category project.
- 5Write a three-paragraph explanation that separates what the data shows (smaller average ticket) from hypotheses (more small merchant payments) that need other evidence.
What the deliverable looks like
- Chart 1: monthly average ticket size in rupees. Start the axis at zero or state clearly that it does not.
- Chart 2: stacked bars of the log growth decomposition, with volume and ticket contributions summing to value growth.
- Table: year-on-year comparison for the same month across years.
- README:
- source URL and download date
- column definitions and units
- the August 2018 note
- the unit formula
- results
- hypotheses clearly labelled as such
Interview questions this attracts
- Walk me through the factor of 10.
- Why use logs for the decomposition?
- Average ticket fell. Does that mean people are poorer?
- How would you test the merchant-mix hypothesis with NPCI's other tables?
- What would you monitor if you ran this monthly at a payments company?
Unit discipline and clear causal language are skills we drill in the Data Analyst programme. For a view of where analyst work sits against data science, read data analytics vs data science.
Frequently asked questions
How do I calculate UPI average ticket size from NPCI data?
Divide the monthly value by the monthly volume after converting units. NPCI reports value in crore rupees and volume in million transactions. One crore is 10 million, so the average in rupees is value in crore divided by volume in million, multiplied by 10.
Does NPCI's UPI data include every UPI transaction?
The product statistics page carries a note that, from August 2018, same-account debit and credit transactions are excluded. Read the notes on the page when you download, because definitions can change and your series should record them.
Can I download NPCI's UPI numbers as a file?
Yes. The UPI Product Statistics page has Daily and Monthly tabs, a financial-year selector and a Download control. Save the file with the date you downloaded it, because NPCI can revise recent figures.
Pankit Kumar has 10 years in Data Science & AI, building and shipping production systems in regulated pharma and clinical environments. He is a freelance trainer at Boston Institute of Analytics, AnalytixLabs and Scaler, and has taught this material to thousands of working professionals.
This article is part of our Data Analytics with Generative AI programme — 3–4 months. The full analyst stack — Excel, SQL, Power BI and Python pipelines — then a generative-AI layer you can prove is right.
Explore Data Analytics with Generative AI