Static UPI QR reconciliation: matching payments to orders
A printed UPI QR code at the counter, in an Instagram highlight or on a PDF price list is the cheapest way to get paid in India. It also creates a reconciliation headache: a pile of credits in your bank account and a separate list of orders, with nothing reliably connecting the two.
This guide covers why static QR payments are hard to reconcile, the manual methods that work at small scale, and how to move to per-order confirmation that happens automatically.
Static QR vs dynamic QR
A static QR encodes only your UPI ID (and perhaps your name). The customer scans it and types an amount. Every customer scans the same code.
A dynamic QR is generated for one payment. It encodes your UPI ID plus a specific amount and usually a reference, using the UPI intent format:
upi://pay?pa=yourshop@okhdfcbank&pn=Your%20Shop&am=349.07&cu=INR&tr=1042
Both send money straight to your bank account. The difference is how much information about the order comes along with the payment. With a static QR, almost none does.
Why static QR payments are hard to reconcile
When you look at a credit in your bank statement or alert, you typically see the amount, date and time, a UPI reference number (UTR), and sometimes the payer's name or UPI ID. What you usually don't see reliably:
- Your order number. Customers rarely type it in the note, and many alerts and statements don't show the note at all.
- A unique amount. If five customers each buy the ₹499 plan, you get five identical ₹499 credits.
- The right name. A parent pays for a student, a spouse pays from a joint account, or the payer's name is truncated.
The result is that reconciliation depends on guesswork around timing (“this ₹499 arrived at 4:12, and Riya messaged at 4:13”) and screenshots, which can be edited or reused.
Manual reconciliation that works at small scale
If you take a few dozen payments a day, a disciplined manual process is enough:
- Keep one order list with order ID, customer, amount, time and status.
- Ask for the UTR, not a screenshot. Every UPI app shows a 12-digit UPI reference after payment. It's the same number your bank records, so it can be checked exactly.
- Match against your bank, not the customer. Look up the UTR or amount in your bank's alerts or statement before marking anything paid.
- Reconcile daily. Download the day's statement and tick off each credit against an order. Anything left over on either side is a question to follow up.
- Use a separate account or UPI ID for business so personal transfers don't clutter the statement.
This works, but it is slow, it happens after the fact (the customer waits while you check), and it scales with your hours rather than your sales.
The unique-amount technique
The single most effective change is to stop charging everyone the same amount. Give each order a slightly different payable amount — ₹499.03 for one customer, ₹499.11 for the next — so that the amount itself tells you which order a credit belongs to.
This works with a static QR too: the customer types the exact amount you gave them. It works much better with a dynamic QR or UPI link, where the amount is pre-filled and the customer can't get it wrong.
Ground rules:
- Use only the paise. Adding 1–99 paise keeps the price effectively the same and gives you up to 99 distinct values per price.
- Expire unpaid orders. Release an order's paise value after 10–15 minutes so values can be reused.
- Never accept a near miss. If ₹499.10 arrives and the only open order is ₹499.11, don't assume. Check by hand.
- Store the UTR against the order once matched, so disputes can be settled with the bank's own reference.
From daily statements to per-order confirmation
Statements tell you about payments hours later. Your bank's credit alert emails tell you within moments. If you enable email alerts for credits (most banks let you switch them on in net banking), every UPI payment produces a message you can process as it happens.
Combine unique amounts with those alerts and the reconciliation happens order by order, as payments arrive:
- Customer places an order; they're shown a unique payable amount and a UPI QR.
- They pay; the money goes straight to your bank.
- Your bank emails its credit alert.
- The alert is verified as genuine, parsed and matched to the one order expecting that amount.
- The order is marked paid with its UTR, and your shop or app is notified.
That is what Milan Payments automates. It reads credit alerts from HDFC Bank, ICICI Bank and SBI, matches them to orders created from its dashboard, payment pages, invoices or API, and sends a signed webhook to your system. Credits that don't match anything are kept in a review list instead of being guessed at. For the technical detail, see how to auto-verify UPI payments.
Keep your static QR, add a dynamic one
You don't have to throw away the QR code on your counter. Many businesses use both:
- Static QR for walk-in customers and tips, reconciled daily.
- Per-order payment links or pages for anything you need to confirm before delivering — online orders, course seats, event tickets, invoices.
A payment page link (for example one per product or per event) behaves like a reusable QR for the customer, but generates a unique amount behind the scenes for each person who pays through it.
Reconciliation checklist
| Check | Why |
|---|---|
| Business payments go to one dedicated account or UPI ID | No personal transfers to filter out |
| Credit email alerts are switched on with your bank | Real-time evidence of each payment |
| Every order has a unique payable amount | Credits identify their order |
| Orders expire after a set window | Amount values are recycled safely |
| UTR is stored against each paid order | Disputes and refunds are traceable |
| Unmatched credits are reviewed daily | Nobody who paid is left waiting |
Summary
Static QR codes are simple to take payments with and hard to reconcile, because the credit that reaches your bank carries almost nothing about the order. Asking for UTRs and reconciling daily helps at small scale. Unique per-order amounts, combined with your bank's credit alerts, turn reconciliation into something that happens automatically as each payment lands.
Reconcile as payments land
Milan matches every UPI credit to its order automatically. ₹499/month flat, first month free.