How I Automated UPI Reconciliation as a Freelancer (and Stopped Drowning in Bank Statements)

A practical, lightweight approach to reconcile UPI payments for freelancers in India—automate statements, match receipts, and save hours each month.

Written by: Aanya Mehra

A smartphone showing a payments screen next to a laptop on a wooden desk
Image credit: Nathan Dumlao / Unsplash

If you’re a freelancer in India, you know the feeling: a month ends, and your phone, bank SMSes and multiple bank statements have turned into a maze of half-remembered invoices and unexplained ₹200 transfers. I used to spend entire evenings matching UPI credits to invoices, hunting for screenshots, and wondering which client actually paid for March.

That changed when I built a tiny, pragmatic UPI reconciliation pipeline that does the boring matching for me. It doesn’t need bank APIs, costly subscriptions, or a degree in data engineering — just some scripting, a few consistent conventions, and a willingness to accept that automation will handle the easy cases and leave the odd edge-case for manual review.

What “UPI reconciliation” means here

Why not just use an app? There are plenty of accounting apps that claim to do reconciliation. They’re great if you need GST-ready ledgers, bank sync, and invoices in one place. For me, those were overkill: I bill 15–25 small projects a year, often via personal UPI handles, and I needed something cheap, auditable, and under my control. Plus, many apps still trip on UPI remitter names (they’re inconsistent) and require bank-level access I wasn’t comfortable granting.

What I built (high level)

  1. Export monthly bank statements (CSV) — most banks and fintech neo-banks let you download a CSV of transactions. If yours doesn’t, export the PDF and OCR it.
  2. Standardize incoming data — a short script normalizes columns (date, amount, credit/debit, description).
  3. Ingest invoice metadata — I keep a tiny YAML/CSV of issued invoices: invoice_id, expected_amount, client_name, UPI_id_used, due_date.
  4. Fuzzy match credits to invoices — a script matches by exact amount first, then by amount + partial remitter name, then by notes (I encourage clients to add invoice IDs in the UPI note).
  5. Output a reconciliation CSV with confidence flags (high/medium/low) and a short HTML report for quick review.

Concrete tools I use

How I nudged clients into making reconciliation easy The most effective trick: add an instruction in invoices and payment requests — “Please add invoice #INV-2026-07 in the UPI note.” About 60–70% comply. For recurring clients, I use fixed UPI remark templates and send a gentle template message. The automation handles the rest.

A typical monthly run

Real tradeoffs and downsides

Why this approach works for Indian freelancers

Tips to make it robust

If you want to try it Start by exporting last month’s bank CSV and building a two-column CSV of your invoices (invoice_id, amount). Write a tiny script that finds exact amount matches and marks them; the clarity of seeing matched vs unmatched immediately pays for the effort.

Wrapping up Automation doesn’t have to be flashy or expensive. For me, automating UPI reconciliation reclaimed hours of weekend time and removed the mental overhead of wondering whether a client had paid. It won’t fix every ambiguous remitter name or missing note, but it surfaces the real exceptions you should care about — and leaves the boring, repetitive matching to a script.

If you want, I can share a stripped-down example script and a sample CSV layout to get you started — tell me what bank you use and whether you store invoices in Google Sheets or locally.