Insights · Automation
Reconciling Fonepay, eSewa and Khalti payments without a spreadsheet
The short version
You can reconcile Fonepay, eSewa and Khalti payments without a spreadsheet by letting software pull each provider's transactions, normalise them into one format, and match them to your orders on amount, time and reference. People then handle only the payments that don't match. The hard part isn't the matching logic. It's getting clean data out of each channel.
If you run a shop, a clinic, a school or an online store in Nepal, you probably know the evening routine. Log in to the Fonepay dashboard, download the day's list. Do the same in eSewa and Khalti. Open the bank statement. Paste everything into one sheet and start ticking rows against the order book. On a quiet day it takes half an hour. On a busy one it eats the evening, and the mismatches roll into tomorrow.
How fast are QR and wallet payments growing in Nepal?
Fast enough that the spreadsheet stops working for a lot of businesses at once. Nepal Rastra Bank's Financial Stability Report for FY 2024/25 puts QR-based payments at about Rs 958 billion for the year, up roughly 92% on the Rs 500 billion of the year before, a figure The Kathmandu Post also reported in April 2025. Five years earlier, in FY 2020/21, the figure was around Rs 20 billion. By transaction count, QR payments went from about 169 million to about 326 million in a single year.
The user base behind that is large. The same report counts 26.77 million wallet users and 27.74 million mobile banking customers by mid-July 2025. B360 reported that in March 2025 one payment provider processed more than a million merchant QR payments in a single day. For a merchant, all of this means one thing: more small payments, from more apps, landing in more places.
Why don't wallet payments match invoices on their own?
Because the payment and the order live in two different systems, and nothing forces them to share an ID. A customer scans a static QR, types an amount, maybe adds a remark, maybe not. Your order book knows the customer and the invoice. The provider's report knows a phone number or a masked name, an amount and a timestamp. Somebody has to connect the two. The usual troublemakers are familiar:
- Several reports in several formats. Fonepay, eSewa, Khalti and each bank export different columns, date formats and reference fields.
- Settlement timing. The money a customer paid today may reach your bank the same day or later, depending on the provider, your agreement and cut-off times, so the bank line and the sale sit on different dates.
- Fees netted off. NRB's NepalQR guidelines let acquirers charge merchants a merchant discount rate (MDR) and bar charging customers, so what settles can be less than what the customer paid.
- Wrong or partial amounts. A customer pays Rs 2,450 for a Rs 2,540 bill, or pays half now and half next week.
- Missing references. No invoice number in the remark, or a parent paying school fees from their own phone for a child with a different name.
- Refunds and reversals that show up days after the original sale.
None of these is rare. Each one is a row that won't tick off, and each one needs a person to phone someone or dig through a chat to resolve it.
What data can you actually get from Fonepay, eSewa and Khalti?
This is where most plans go wrong, so it is worth being precise. We checked each provider's public documentation. Khalti publishes the most: a payment lookup API and a merchant transaction list that returns amount, fee, state and refund status. eSewa's public ePay docs cover taking a payment and a status-check API that can report states such as COMPLETE, PENDING, PARTIAL_REFUND and AMBIGUOUS, but we found no public transaction-list or settlement endpoint. Fonepay offers dynamic QR codes that carry the amount and a reference per transaction, plus a merchant dashboard, but we could not find open public developer docs; integration details come through onboarding.
What each channel gives a reconciliation system
Based on public developer documentation. Your merchant agreement may give you more.
| Criterion | Fonepay | eSewa | Khalti | Bank account |
|---|---|---|---|---|
| Public developer docs | ✕specs via onboarding | ✓ | ✓ | ✕varies by bank |
| Check one payment's status by API | Via integrationdynamic QR / checkout | ✓status check | ✓lookup by pidx | ✕ |
| List all merchant transactions by API | Not publicdashboard | Not documentedportal export | ✓merchant-transaction list | Statement fileCSV / Excel / PDF |
| Fee shown per transaction | Not publiccheck dashboard | Not in status API | ✓fee_amount | Net credit only |
| Refund state visible | Not publiccheck dashboard | ✓FULL / PARTIAL_REFUND | ✓refunded field | As a debit line |
| Per-payment reference you control | ✓with dynamic QR | ✓transaction_uuid | ✓purchase_order_id | Customer's remark only |
The practical upshot: expect a mix of API calls and scheduled report exports, not one clean feed. Khalti developer docs (transaction list, ePayment lookup); eSewa developer portal (ePay, status check); Fonepay blog, Dynamic QR Code (Jul 2025); NRB NepalQR Standardization Framework and Guidelines (2021). As of 21 Aug 2026.
Where the API row says no, a scheduled export from the merchant portal does the same job, just less often.
The single most useful change is on the collection side, not the matching side. When you generate a per-order reference, through a dynamic QR, a checkout integration or a payment link, the payment arrives carrying your invoice number. Matching then becomes a lookup rather than a guess.
How does automated reconciliation work, step by step?
It's a pipeline, and each stage is ordinary software. First, collectors pull data from every channel: APIs where they exist, scheduled portal exports where they don't, and the bank statement. Second, a normaliser turns every row into the same shape: amount, fee, net, time, channel, payer and reference. Third, the matcher runs rules in order of confidence. Exact reference match first. Then amount plus a time window. Then fuzzy rules, such as a near-miss amount from a known payer. Fourth, whatever doesn't match lands in an exception queue for a person. Finally, confirmed matches post to your accounting software as receipts.
Automated payment reconciliation for a Nepali merchant
Collect from every channel, normalise, match in tiers, and send only the leftovers to a person.
Tap any component above for its role and the real tech.
- Wallet gateways (External, Khalti transaction list API, eSewa status check): Khalti's documented merchant transaction list returns amount, fee, state and refunds. eSewa's public status-check API confirms individual payments; the full day's list typically comes from a portal export.
- Fonepay QR (External, Dynamic QR + merchant dashboard export): Dynamic QR codes carry the amount and a per-transaction reference, which makes matching far easier than a static counter QR. Transaction history comes from the merchant dashboard or the integration agreed at onboarding.
- Bank statement (External, CSV / Excel statement, scheduled): The only proof that money actually settled. Wallet and QR settlements often arrive as net amounts after the merchant discount rate, sometimes on a different day from the sale.
- Orders and invoices (Data, POS, e-commerce or billing system): The other side of every match. If your POS can print a reference into the QR or payment link, most matches become exact lookups.
- Collectors (Service, Scheduled jobs, API clients, file watchers): One small connector per channel. Where there's an API it polls; where there's only a portal export it picks up a dropped file. Isolating each channel means a format change at one provider breaks one connector, not the whole run.
- Normaliser (Service, Common schema: amount, fee, net, time, channel, reference): Converts dates, strips phone numbers down to a comparable form, splits gross from fee, and tags each row with its channel. Every later step depends on this being boring and correct.
- Ledger store (Data, Postgres or SQLite with an audit log): Keeps every raw row, every normalised row and every match decision with who or what made it. An auditor, or you next month, can see why a payment was matched.
- Matching rules (Service, Exact reference, then amount + time window, then fuzzy): Runs rules from most to least certain. Exact reference first; then same amount within a time window from the same payer; then fuzzy candidates such as a small amount difference or a split payment, which are proposed, not auto-confirmed.
- Exception queue (Queue, Web screen with suggested matches): Unmatched and low-confidence items, each with the system's best guesses. A person confirms, splits or flags. Their decisions can become new rules.
- Accounts staff (External, Daily review): The person who used to tick every row now reviews a summary and clears the exceptions: wrong amounts, missing references, refunds.
- Accounting software (External, Receipt and fee journal posting): Confirmed matches post as receipts, with the provider fee booked separately, so the books show gross sales and fees rather than a mysterious net.
Tap a component to see what it does. The exception queue is where the remaining human work lives.
Two design choices matter more than the rest. Keep the raw data, so you can always rerun a day after fixing a rule. And never auto-confirm a fuzzy match. Propose it, let a person accept it, and log who did.
How much staff time does manual reconciliation really cost?
Less than it feels like per payment, and more than it looks like per month. A minute and a half per match sounds trivial. At 120 payments a day over 26 trading days, it's around 78 hours a month before anyone has chased a single mismatch. Add the daily downloads from each channel and you're close to a part-time job. The calculator below uses stated assumptions, not benchmarks. Change them to fit your business.
Reconciliation time & cost calculator
How many staff hours go into matching QR, wallet and bank payments to orders today, and how many are left once software does the matching.
e.g. Fonepay QR, eSewa, Khalti
Find it in the export, find the order, tick both off.
Wrong amount, missing remark, split or partial payment, refund.
Hours / month today
98 hrs
3,120 payments a month
Hours / month after
25 hrs
people handle exceptions only
Staff time freed
Rs 21,710 / month
Rs 2.6 lakh a year · 72 hours a month (74% of today’s work)
Estimate, not a quote. Defaults are NeuralYug working assumptions for a small Kathmandu retailer, not measured benchmarks: 26 trading days a month, 15 minutes a day per channel to download and clean its report by hand, 5 minutes for a person to resolve each exception, and 10 minutes a day to review the automated run. The Rs 300/hr default assumes an accounts assistant paid well above the Rs 19,550 monthly minimum wage, plus overheads. It excludes the build cost of the automation. Nothing is stored; all figures compute in your browser.
The number that moves the result most is the exception rate. If most of your customers pay with a reference you generated, exceptions stay low and automation pays quickly. If most pay to a static counter QR with no remark, even good software will send a lot to the queue. For how we think about payback on work like this, see how automation ROI actually works.
Should you fix collection or matching first?
Usually collection. A few changes cost little and cut exceptions before any software exists:
- Use dynamic QR or payment links that carry the invoice number, at least for larger bills and online orders.
- Print the order number on the bill and ask customers to put it in the remark when they use a static QR.
- Consolidate channels where you can. Every extra wallet or bank is another report to collect.
- Book provider fees as their own expense line instead of netting them silently.
- Agree a daily cut-off time, so today's sales and today's settlements are compared on the same basis.
Then automate the matching. Start with one channel and the bank statement, prove the match rate for a month, and add channels one at a time. This is the same pattern our fintech reconciliation automation blueprint follows for invoices and ledgers.
What's the bigger picture for Nepali merchants?
QR payments went from a novelty to the default in about five years, and the rails behind them, which we covered in Nepal's fintech at scale, now work well for customers. The merchant back office hasn't caught up. Taking payments is easy. Proving every payment belongs to a sale, net of fees, is still a spreadsheet job in most businesses we talk to. That gap will only widen as volumes keep rising.
Where does NeuralYug fit in?
We build this kind of pipeline: connectors for Nepali payment channels, matching rules tuned to your real exceptions, a simple review screen, and posting into the accounting tool you already use. We'd rather start with one channel and a month of your real data than promise a match rate up front. If your evenings go to ticking off wallet payments, talk to us or see what our Flow Automation service covers.
Sources
Frequently asked
What is payment reconciliation for a small business in Nepal?
It is the daily job of proving that every Fonepay, eSewa, Khalti, bank and card payment you received belongs to a real order or invoice, and that the money that settled into your bank matches it after fees and refunds. Most Nepali SMEs do it by exporting each provider's report into a spreadsheet and ticking rows off by hand, which scales badly as QR volume grows.
Do eSewa, Khalti and Fonepay have APIs for reconciliation?
Partly. Khalti's public developer docs include a payment lookup and a merchant transaction list API that returns amount, fee, state and refunds. eSewa's public ePay docs cover payment and a status-check API, but not a transaction-list or settlement-report endpoint. Fonepay's dynamic QR and merchant dashboard exist, but integration specs come through merchant onboarding rather than open public docs. Plan for a mix of API calls and report exports.
How much time can automated reconciliation save?
It depends on volume and how messy your payments are. The main saving is that people stop matching the clean payments and only handle exceptions: wrong amounts, missing references, split payments and refunds. For a shop taking about 120 digital payments a day across three channels, our calculator's working assumptions put manual matching near 100 hours a month and the automated version near 25. Plug in your own numbers.
Want this run on your numbers?
We'll do the same analysis on one of your workflows in the two-week Automation Sprint.
Related service · Flow Automation