Guides / Static QR reconciliation

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:

  1. Keep one order list with order ID, customer, amount, time and status.
  2. 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.
  3. Match against your bank, not the customer. Look up the UTR or amount in your bank's alerts or statement before marking anything paid.
  4. 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.
  5. 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:

  1. Customer places an order; they're shown a unique payable amount and a UPI QR.
  2. They pay; the money goes straight to your bank.
  3. Your bank emails its credit alert.
  4. The alert is verified as genuine, parsed and matched to the one order expecting that amount.
  5. 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

CheckWhy
Business payments go to one dedicated account or UPI IDNo personal transfers to filter out
Credit email alerts are switched on with your bankReal-time evidence of each payment
Every order has a unique payable amountCredits identify their order
Orders expire after a set windowAmount values are recycled safely
UTR is stored against each paid orderDisputes and refunds are traceable
Unmatched credits are reviewed dailyNobody 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.