Alpha test, 16/10/2026: how auto-matching did

Suggestions and Suspense on the production server (app.ledgermap.in). Data: a read-only copy of the production database and its usage events, taken 17/10/2026.

The answer in short

0Who used it

3
user accounts (Kelvin Bhuva, Dhaval, Test)
4
parties with PDFs (of 670 parties, most from a bulk company import)
12
PDFs saved, 1,415 entries read
3
imports exported to Miracle (168 entries, ₹46.65 lakh)

All use was on 16/10/2026 between 17:32 and 20:17 IST, from the Windows app 0.3.0. ASMARK ENGINEERS (Kelvin) opened its review twice (56 entries) but saved nothing and did not export, so most numbers below come from the three exported imports.

1How it performed

Each bar is one exported import. A segment shows what happened to its entries in the end.

Show as a table

Step by step

At bank link
78 of 168
  • Saved as exact matches before review started.
  • 2 more came during review (GST UPI ID learned from one choice).
  • 34 different ledgers. Changed or removed: 0.
Suggestions step
27
  • 18 accepted as shown (17 with Ctrl+Shift+Enter).
  • 2 changed (both wrong suggestions).
  • 7 not saved: all went to Suspense.
Suspense step
63
  • 21 got a real ledger: 19 by the user, 2 by the server from a learned UPI ID.
  • 42 went to Suspense.
  • 14 of those 42 got a 72–97% suggestion during review (from the user's own choices), but stayed unsaved.
Export
50 to Suspense
  • The export page showed only "N to Suspense".
  • It did not say that 21 of them had a suggestion.

Entries nothing was known about at the start

These are the entries that went to the Suspense step when review started: no exact match, no suggestion and no Miracle history clue. In KESARI NANDAN ART that was 49 of 123 entries (40%, ₹7.65 lakh). The 33% in the bar above is a different number: it is how many entries were exported to Suspense in the end, from both steps.

Each of these entries was exported in one of two ways: with a real ledger, or to Suspense. The orange part splits the Suspense entries by what the app knew at export. During review, the user's own choices taught the app, so 13 of them had a suggestion by then (for example Cash Account for a SELF cheque), but the user never saved it. The gray part is what the app never knew anything about. It includes 1 entry where the user picked the Suspense ledger by hand; the result is the same.

KESARI NANDAN ART 49 unknown at the start
PITRUKRUPA SELECTION 10 unknown at the start
TEJANI GUMMING POINT 4 unknown at the start
ImportUnknown at startReal ledgerSuspense, suggestion by thenSuspense, nothing known
KESARI NANDAN ART49 (40%) · ₹7.65 lakh10 · ₹1.74 lakh13 · ₹4.50 lakh26 (21% of 123) · ₹1.41 lakh
PITRUKRUPA SELECTION10 (30%) · ₹5.42 lakh7 · ₹4.12 lakh1 · ₹30,0002 · ₹1,00,001
TEJANI GUMMING POINT4 (33%) · ₹82,3884 · ₹82,38800
All three63 (38%)211428 (17% of 168) · ₹2.41 lakh

What the 26 entries in KESARI NANDAN ART that nothing was known about are (all exported to Suspense):

So in KESARI NANDAN ART, of the 40 entries exported to Suspense, 26 were unknown to the app, and those were mostly small: 21% of entries but only 5.9% of the money (₹1.41 lakh of ₹23.88 lakh). At least 1 of the 26 (₹59,125) has a ledger in the books, and 3 more may have one. Of the other 14, 13 had a suggestion that was not saved (₹4.50 lakh), and 1 had a weak "same amount" clue from the books that the user turned down.

Time spent

ImportEntriesReview to exportNotes
KESARI NANDAN ART (Dhaval)12318 min 20 sSuggestions 1 min 55 s for 18. Suspense 7 min 14 s for 49 (11 resolved). Review 5 min 45 s.
PITRUKRUPA SELECTION (Test)335 min 55 sSuggestions 2 min 33 s for 5 (1 saved). Suspense 2 min 9 s for 10 (9 given a ledger, 2 of them the Suspense ledger "?").
TEJANI GUMMING POINT (Test)12about 5 min94 of the PDF's 106 entries were before Miracle's last entry for the bank, so they did not come in (as designed).

What worked well

2Bugs found

Confirmed means seen in the production data and traced in the code. Suspected means seen in the code only.

HighUnsaved suggestions go to Suspense without a warning

What happens
The Ledger box shows a suggestion, but it is not saved until the user presses Enter. At export, every entry without a saved choice goes to Suspense (frontend/src/lib/voucher-export.ts:182). The export page shows only "N to Suspense".
Evidence
21 of 50 Suspense entries (₹9.80 lakh) had a suggestion: 10 SELF cheques with Cash Account at 97%, JAY BHAGVATI at 95%, SHIV SAKTI ART at 97%, JAY ART at 97%, 3 ATM withdrawals with Cash at 69%, and others. Table below.
Fix
Before saving, the export says "21 entries going to Suspense have a suggestion" with Accept them, Show them and Export anyway.

HighCheque numbers stop learning from one choice

What happens
The payee pattern adds the numbers from the reference column (server/ledger_match.go:669, patternKey). A cheque's reference is its cheque number, so every cheque gets its own pattern. A choice for one cheque never becomes an exact match for the next one. It is only a 97% suggestion, which then waits for a key press (bug above).
Evidence
"SELF-CHQPAID- SARDARCHOWK" ×10: Cash Account was saved for 2, and the other 8 stayed open with key SELFCHQPAIDSARDARCHOWK 0000000000000160, …163 and so on. "CHQ PAID-…-JAYART" ×2: the same. Checked by running the production matcher on this data.
Fix
Leave cheque numbers (the reference of cheque rows) out of the pattern, as for transfer references. Keep the exact-match rules as they are.

MediumNew suggestions in the Suspense step are easy to miss

What happens
Steps are fixed at the start, by your rule. So when a save teaches the server, the new suggestions appear on rows in the Suspense step. That step has no accept-all (only the Suggestions step has it, statement-entries.tsx:689), and nothing points at the new suggestions.
Evidence
14 entries got a 72–97% suggestion in the Suspense step and stayed unsaved. Example: the user chose BIKE FUEL EXPENSES for a petrol pump UPI payment at 18:14:25 IST; 1 second later 2 more payments to the same pump had it at 97%; both went to Suspense.
Fix
Keep rows in their step. Add a line "5 entries in this step now have a suggestion" with Ctrl+Shift+Enter to accept them, and a mark on those rows.

MediumA tie looks sure

What happens
When 2 or 3 ledgers match in the same way, each gets the same confidence, and the first one is filled in with a green or yellow mark. The order between them is by name, not by meaning.
Evidence
HARIKRUPA TRADERS. (Sundry Debtors) and HARIKRUPA TRADERS (Sundry Creditors): 99% each. Trimurti Tools And Electricals / Trimurti Tools & Electricals: 99% each. BANK SERVICES CHARGES EXPENSES / BANK CHARGES EXPENSES: 91% each. On a term-loan statement, "Interest" got INTEREST ON TERM LOAN, INTEREST TO PARTNER and INTEREST ON LATE PAYMENT OF TDS at 80% each.
Fix
Break ties by direction and group (a receipt goes to the debtor, a payment to the creditor) and by the bank ledger (a term loan's interest goes to INTEREST ON TERM LOAN). If a tie stays, split the confidence, so it shows yellow or red.

MediumCash rules miss "SELF-CHQPAID" and rate ATM too low

What happens
The cash rule needs SELF with the word CHQ or PAID (server/ledger_signals.go:314). This bank prints "CHQPAID" as one word, so the rule does not see it. ATM withdrawals ("ATW-…") are found, but shown at 69% (yellow).
Evidence
14 SELF cheques (₹8.4 lakh) started with no suggestion from the server; only the Miracle history helped 4 of them. 3 ATM withdrawals at 69% were left unsaved and went to Suspense.
Fix
Read glued forms (CHQPAID, CHQPAIDSELF). Give ATM/ATW/NWD rows their own confidence row, measured in the replay; it should be above 90%.

LowThe filled-in suggestion is not always the most likely

Evidence
"ITD TAX REFUND … (the owner's name)": the box showed a person's ledger at 78%, while the third choice was 88%. All three were wrong: the user chose INCOME TAX TDS 2025-26. Recommendations are ordered by rule, not by confidence.
Fix
Read "ITDTAXREFUND" / "TAX REFUND" as the income-tax category. Order the list by confidence when the rules give different numbers.

LowA masked UPI ID is learned from its last letters

Evidence
"UPI-GSTPAYMENTS-*****************MENT@HDFCBANK" was learned as the UPI ID ment@hdfcbank and exact-matched once (to the right ledger). Any other masked ID that ends in "MENT@HDFCBANK" would match it too.
Fix
Do not learn a UPI ID that follows a run of * or X.

LowTracking counts single modifier keys

Evidence
ui.keys holds "Alt+Alt", "Ctrl+Control" and "Ctrl+Shift+Shift": a press of Alt or Ctrl alone. This is noise in the shortcut counts, not a matching bug.
Fix
Skip key events whose key is itself a modifier.
Suspected from the code, not seen in the data (5)

The 21 entries that went to Suspense with a suggestion

Entry (shortened)CountAmountSuggestion shownWhere
SELF cheque paid (cash withdrawal)10₹5,90,000Cash Account, 97%Suspense step, after the user saved one
Cheque deposit, JAY BHAGVATI DYEING…1₹1,60,000JAY BHAGVATI DAYING & PRINTING WORK, 95%Suggestions step
Transfer from SIDDHESHWAR COTTON PRINTS1₹1,00,000SIDDHESWAR COTTON PRINT, 61%Suggestions step
Cheque paid to JAYART1₹49,952JAY ART, 97%Suspense step, after the user saved 1
ATM withdrawal3₹40,000Cash Account, 69%Suggestions step
IMPS from SHIVSHAKTI ART1₹30,000SHIV SAKTI ART, 97%Suspense step, after the user saved 2
GST paid through BillDesk UPI2₹8,708GST Provisional A/c., 72%Suspense step, after the user saved 1
Petrol pump UPI2₹840BIKE FUEL EXPENSES, 97%Suspense step, after the user saved 2
Total21₹9,79,5007 in Suggestions, 14 in Suspense

3What can be done better

Users chose a real ledger by hand for 18 entries. The matcher could find 15 of them with better rules. The other 29 Suspense entries with nothing known are mostly small UPI payments to people with no ledger in the books; they may be right in Suspense.

Bank text (shortened)User choseWhy the matcher missed itRule to add
UPI GOODSANDSERVICESTAX…, UPI GST PAYMENTS (BillDesk), NEFT RESERVE BANK OF INDIA … GSTPMTGST Provisional A/c., GST A/C ×4The GST rule does not read these forms.GST category for GOODSANDSERVICESTAX, GST PAYMENTS, GSTPMT, RBI GST.
CHQ PAID … JAYART; IMPS … SHIVSHAKTI ART; CHQ PAID … OLYMPICDYESTUFF; … KISHANENTERPRISE; CHQ PAID … HAZIKRPATRADERSJAY ART, SHIV SAKTI ART, OLYMPIC DUE STUFF, KISHAN ENTRPRISE, HARIKRUPA TRADERS ×5Short glued names, and names that the bank or the books spell differently.Compare with spaces taken out, allow one or two letters off. Suggest only, never auto-save.
NEFT … UNION ASHVIN … (to the owner's own savings account)UNION BANK JETPUR S/A ×2Bank ledgers are never suggested, and choices of bank ledgers are not learned (ledger_match.go:589).Learn bank-ledger choices as suggestions when no contra pair exists.
SELF-CHQPAIDCash AccountGlued "CHQPAID" (bug above).Read glued forms.
CHQ DEPRET-FUNDS INSUFFICIENT (₹1,60,000, same day as the deposit)JAY BHAGVATI DAYING & PRINTING WORKNo rule for a bounced cheque.A return of the same amount within 3 days gets the ledger of the cheque it returns.
ITD TAX REFUND … (owner's name)INCOME TAX TDS 2025-26Found the owner's name instead.Income-tax category for TAX REFUND / ITDTAXREFUND.
NEFT … APARNA …Aparna EnterprisesOne-word names do not match.Suggest a ledger whose only distinctive word is the payee field.

Other things seen

4How the system can be improved

In order of value for the work. Gains are measured on the 168 exported entries; they are an estimate from one day.

  1. Export check for unsaved suggestions. Small change, app only.
    Up to 21 entries (12.5%) leave Suspense. Suspense: 30% → about 17%.
  2. No cheque numbers in the payee pattern. Server, matching. Run bun run matcheval before and after.
    One choice then auto-saves every same cheque payee: 11 entries here, and all later SELF cheques. Fewer key presses, and nothing left behind.
  3. "Now suggested" in the Suspense step, with Ctrl+Shift+Enter. Rows stay where they are.
    Covers the 14 entries that got a suggestion during review, also when the user does not export yet.
  4. New category rules: GST forms, glued cash, ATM confidence, tax refund, bounced cheque.
    About 7 hand choices become suggestions; ATM rows become green.
  5. Ties: break them by direction, group and bank ledger; split the confidence when they stay.
    Prevents wrong green choices between duplicate ledgers (debtor or creditor).
  6. Glued and misspelt names (suggest only).
    About 5 hand choices become suggestions.
  7. Own name and own banks: suggest bank ledgers; learn bank-ledger choices as suggestions.
    2 more here (the owner's own savings account), and fewer one-sided transfers.
  8. Keep measuring. The tracking events now give this funnel per import. Turn this page's queries into the first part of the admin view: exact / accepted / changed / left unsaved / Suspense, per server build. Add the production cases above to the replay corpus on this PC (.local/, never committed).

Items 1–3 deal with the same 21 entries in three ways, so they do not add up. With them, Suspense goes from 30% to about 17% of entries, and from ₹12.27 lakh to about ₹2.47 lakh. Items 4–7 mostly save the user's time: about 15 of the 18 hand choices would be suggested.

5How this was measured