UPI & digital payments
======================

Person-to-person and person-to-merchant UPI payments: payer and payee banks, merchant categories, failures by reason, and the disputes raised afterwards. Most payments are small; a few large ones dominate value. Traffic spikes on salary days and festival weeks.

Category: Finance
Licence: CC0-1.0
Synthetic data generated by DataStride. Places and calendars are real; people, banks and merchants are fictional.
Build: 940aea8e3b2c8169

upi_banks (15 rows)
  bank_id                INTEGER        [key] Bank identifier.
  bank_name              VARCHAR(60)    Bank name (fictional).
  bank_type              VARCHAR(20)    Kind of bank.

upi_users (900 rows)
  user_id                INTEGER        [key] User identifier.
  full_name              VARCHAR(80)    Account holder (fictional).
  phone                  VARCHAR(20)    Registered mobile, masked.
  bank_id                INTEGER        -> upi_banks.bank_id Bank the UPI ID is linked to.
  city                   VARCHAR(40)    Home city.
  age_band               VARCHAR(10)    Age band.
  onboarded_on           DATE           When the user first linked UPI.

upi_merchants (300 rows)
  merchant_id            INTEGER        [key] Merchant identifier.
  merchant_name          VARCHAR(80)    Merchant name (fictional).
  category               VARCHAR(30)    Merchant category.
  city                   VARCHAR(40)    Where the merchant trades.
  is_small_merchant      INTEGER        1 for small merchants, which pay no MDR.

upi_transactions (5000 rows)
  txn_id                 INTEGER        [key] Transaction identifier.
  payer_id               INTEGER        -> upi_users.user_id Who paid.
  txn_type               VARCHAR(4)     Person-to-merchant or person-to-person.
  merchant_id            INTEGER        -> upi_merchants.merchant_id Merchant paid; null for P2P.
  payee_id               INTEGER        -> upi_users.user_id User paid; null for P2M.
  txn_date               DATE           Payment date.
  txn_time               TIMESTAMP      Payment time.
  amount                 DECIMAL(12,2)  Amount in INR. UPI caps most payments at 1,00,000.
  status                 VARCHAR(10)    Outcome.
  failure_reason         VARCHAR(40)    Why it failed; null unless FAILED.

upi_disputes (250 rows)
  dispute_id             INTEGER        [key] Dispute identifier.
  txn_id                 INTEGER        -> upi_transactions.txn_id Disputed transaction.
  raised_on              DATE           When the customer raised it.
  reason                 VARCHAR(40)    Complaint.
  resolution             VARCHAR(20)    Outcome so far.
  resolved_on            DATE           Resolution date; null while open.

Deliberate data-quality quirks (clean them before you aggregate):
  upi_transactions.status: mixed case
