UPI payment reconciliation service that never double-pays
Build a reconciliation service that matches UPI callbacks against bank settlement files and pays each merchant once, even when the same event arrives three times.
Industry project · for Setu Pay, a Bengaluru payments startup settling UPI collections for 300 small merchants
Setu Pay collects UPI payments for about 300 small merchants and pays them out the next morning. The money moves in three steps: a customer pays, the bank sends a webhook callback, and a settlement file arrives the next day. The three do not always agree.
Last month a retry storm sent the same payment callback four times, and a merchant was credited ₹48,000 for one ₹12,000 sale. The finance team caught it by hand after the merchant complained. The founder wants that gap closed before the festival season, when daily volume jumps from 9,000 to about 40,000 transactions.
Your job is a reconciliation service that: - takes UPI callbacks on a webhook and stores each one exactly once, keyed by the bank reference, so a repeat callback changes nothing; - loads the next-day settlement file (a CSV the bank sends) and matches each settled payment to a stored callback; - produces a daily payout list and an exceptions list for anything that does not match, with the reason.
You will generate a realistic callback stream and settlement file yourself, because real payment data cannot leave the bank. Done looks like a service with an idempotent webhook, a matching job, a payout report and an exceptions report, plus tests that fire the same callback many times and prove the balance is correct. Finance will sign off when a day of 40,000 transactions reconciles with zero double payouts and every mismatch has a named reason.
GitHub repo with the service and tests + sample callback generator + settlement CSV + payout and exceptions reports + README
Stack: Node.js, TypeScript, PostgreSQL, Express or Fastify, Jest or Vitest
- No double payouts30
A full day of callbacks with duplicates reconciles so each payment is counted once and merchant balances are exactly right.
- Idempotent webhook25
The same callback sent many times leaves the database and the balance unchanged after the first, proven by a test.
- Matching and exceptions25
Every settled line is matched or flagged with a clear reason, and the exceptions report lists each unmatched item.
- Engineering quality20
Clean service, config in environment variables, tests that pass, and a README that runs it in under ten minutes.
Pass 60% · Merit 75% · Distinction 90%
Engineering Students
Diploma, B.Tech, B.E., BCA, MCA, or M.Tech students seeking practical experience.
Aspiring Developers
Developers who want to build proof-of-work capstone projects for tech resumes.
Job Seekers
Graduates looking for AI-evaluated code review & verified industry credentials.