CBS engineering · 2,679 words

TCS BaNCS vs Infosys Finacle vs Oracle FLEXCUBE: Why Bank Statement PDF Parsing Needs Balance Continuity

Indian bank PDFs are not “tables.” They are TCS BaNCS, Infosys Finacle and Oracle FLEXCUBE print streams. This guide explains why generic converters fail and why Layer-4 mathematical continuity is the quality gate.

Every Indian savings and current statement you underwrite was born in a core banking system. State Bank of India’s consumer print is the TCS BaNCS family. A large share of PSU and private banks print Infosys Finacle. HDFC and several private/SFB stacks show Oracle FLEXCUBE alignment. Temenos T24 appears on foreign banks’ India books. The PDF is a projection of that ledger, not a spreadsheet. Parsers that pretend otherwise will mis-read Balance, drop wraps, and hallucinate crores across a page break.

Law 1 — Rightmost token is running Balance

BaNCS, Finacle and FLEXCUBE rows typically emit date, narration fragments, then one or two amount tokens, then Balance. The last monetary token is Balance. Distance-to-header algorithms pick the wrong column when the bank swaps Debit/Credit or inserts value-date. FinAnalyser’s SmartTable populateAmounts implements rightmost-Balance. Amounts before that token are typed by continuity and Dr/Cr suffixes, not by which header is nearest.

Law 2 — Mathematical continuity at paise

The identity is Balance[n-1] + Credit[n] − Debit[n] == Balance[n], compared in paise (Δ < 0.05). When a page split eats a row, amateur tools invent a bridging amount so the identity “holds.” That invented amount becomes a fake salary or fake purchase. FinAnalyser prefers printed amount + type implied by continuity, re-anchors on printed Balance, and never mints mega gap amounts.

Worked continuity example

nDebitCreditBalanceCheck
0 (open)——1,00,000.00anchor
12,000.00—98,000.00100000−2000
2—15,000.001,13,000.0098000+15000
3 (bad parse)50,00,000.00—1,12,500.00FAIL — do not invent

TCS BaNCS — SBI and cousins

SBI YONO / e-Passbook layouts are the teaching case for rightmost Balance. Multi-column prints put Closing Balance in a place header-maps love and transaction Balance on the far right. Wrap blocks on e-Passbook must merge. Opening balance lines (“Opening Balance as on …”) are not transactions. If your Perfios alternative treats opening balance as a credit, FOIR is already wrong.

Infosys Finacle — Canara, PNB, Indian Bank, Union, CUB

Finacle wraps UPI/NEFT across rows. Zero-drop narration keeps refs in the description. PNB and Canara are the graveyard of regex scrapers that strip “UTR” and “Ref.” Indian Bank and Union OP-history PDFs confuse dual amount columns. CUB mPassbook mixes CA/SB/CCOD. One Finacle parser with layout variants plus Layer-4 is more honest than twenty brittle regexes.

Oracle FLEXCUBE — HDFC, Axis, IDFC FIRST, RBL

FLEXCUBE decimal alignment and ACH return charges break flat text extractors. HDFC netbanking PDFs need dedicated paths when they extract >50 transactions rather than a generic merge. Deposit-related charges must not classify as credits. Axis wraps Dr/Cr mid-page. Continuity sorts same-day rows into CBS execution order when timestamps are missing.

Temenos T24 and hybrid co-ops

StanChart and HSBC India T24 prints mix international conventions with Indian lakh grouping. Co-op banks (Saraswat, Cosmos, TJSB) are hybrid. IFSC routing + universal fallback still must obey rightmost Balance and Layer-4. If continuity fails, quality-flag the file — do not silently ship a pretty Excel.

Why continuity verification is mandatory for underwriting

  • FOIR on a hallucinated salary credit is negligent.
  • ABB on a kite-flown intra-day peak is negligent if you claimed EOD.
  • A lumped bounce count on a Finacle wrap is negligent.
  • 45 dedicated parsers still need the identity as a backstop — layouts drift by branch print setting.

45 dedicated Indian bank parsers, IFSC-aware detection, and a universal PDF fallback — not a claim of 180+ bespoke parsers.

Implementation notes (for tech + credit jointly)

Populate amounts from tokens before Balance. Merge wraps before typing Dr/Cr. Sort same-day using continuity when needed. Heal polarity by testing type reversal against the identity. Report residual breaks; do not hide them. Excel running balance should be the CBS column, with formulas the auditor can see — ExcelJS, not a Python sidecar on the live path (Law 7).

Vendor due-diligence checklist

  1. Ask them to explain rightmost Balance in one sentence.
  2. Give a Canara wrap PDF and a SBI e-Passbook.
  3. Ask whether they invent amounts on missing rows.
  4. Ask whether inward and NACH are separate counts.
  5. Ask whether Excel is generated in-house without a Python live path.

Monetary tokens, Indian grouping, and false money

Indian PDFs emit lakhs with commas, crudes with spaces, trailing minus, Dr/Cr suffixes, and IMPS/UTR digits that look like amounts. A parser that treats every digit run as money will ingest year fragments and INF ids. Money-sanity gates (magnitude vs prior balance, not counting tokens alone) are how ICICI detailed statements must be ranked. Continuity then types the surviving tokens. This is why “we extract more rows than the other guy” is a bad KPI. More rows with false money is a worse extract.

Same-day ordering without timestamps is another CBS problem. Ten UPI legs print with one date. The running Balance column still encodes execution order. Sorting by narration is wrong. Sorting with continuity (Law 1+2) reconstructs intra-day sequence. Forensic sheets that scream “structuring” because you sorted alphabetically are self-own goals.

Scanned PDFs and the continuity backstop

OCR will misread commas as periods and 8 as 0. Layer-4 is the alarm. If identity breaks, flag the page; do not ship a confident ABB. Native CBS PDFs should be the SLA. Scans are a fallback with quality flags. Any vendor who claims scanned and native are equal without a break report is selling courage.

Why the live Excel path is TypeScript

Institutional reports generate with ExcelJS in-process. Python xlsxwriter on the live path is a split brain: different rounding, different sheet order, untestable in the same CI as the parser. Camelot/Python may exist as PDF fallback, not as the workbook generator. Credit managers do not care about your language wars; they care that Summary and All Txns foot. One generator, one test suite, one identity.

Page breaks, headers, and the ghost row

Every CBS print repeats headers, watermarks, and ‘Page n of m’. Amateur parsers turn those into transactions or into gaps they then fill with invented amounts. Detect header noise. Merge wraps that straddle the footer. If a row has a date and no amount but the next row has amounts and no date, it is one transaction. Continuity validates the merge. If you cannot merge safely, flag — do not guess a ₹49 lakh debit because two numbers sat on a torn line.

BaNCS e-Passbook and Finacle e-statements differ in how they repeat running Balance on wrap-only lines. Sometimes the wrap line has no money tokens. That is narration, not a zero-amount txn. Law 3 says keep the text. Law 2 says do not mint money. Both laws fire on the same page break. That is the whole craft.

Dr/Cr suffixes, trailing minus, and Indian commas

Tokens like 1,25,000.00Dr and 125000- and (1,25,000.00) all appear. parseMoney must handle them before continuity sees NaN. False NaNs cascade into openingBal=0/closingBal=NaN on recon sheets — a known class of bug. The CBS identity cannot run on NaN. Clean tokens, then identity, then Excel formulas that SUM the cleaned columns. That pipeline is why ExcelJS live path and parser tests belong in one repo.

RFP language you can paste

“Vendor shall treat the rightmost monetary token on a transaction row as running Balance. Vendor shall not select Balance by Euclidean or column-index distance to a header. Vendor shall enforce Balance[n-1]+Credit[n]−Debit[n]=Balance[n] at paise and shall not invent amounts to satisfy the identity. Vendor shall merge wrapped narration without dropping UPI/NEFT references. Vendor shall not merge inward cheque, outward cheque, ECS, NACH, e-Mandate and Autopay counts.” If they cannot initial that paragraph, they cannot parse Indian CBS PDFs for underwriting.

Anatomy of a CBS print stream: what the PDF actually contains

A bank statement PDF is a projection of a core-banking ledger through a print template. TCS BaNCS (SBI family), Infosys Finacle (a large PSU and private set), Oracle FLEXCUBE (HDFC and several private/SFB stacks) and Temenos T24 (foreign banks’ India books) do not share a table schema. They share an economic identity: every posted transaction changes running Balance by Credit minus Debit. The print template then wraps narration, repeats headers, inserts value-date, suffixes Dr/Cr, and sometimes reprints Balance on a wrap-only line. Generic “PDF table extractors” assume HTML-like columns. Indian CBS prints are not HTML. They are token streams. Law 1 says the last monetary token on a transaction row is Balance. Law 2 says the identity must hold at paise. Law 3 says wrap text is still the transaction. If a vendor cannot initial those three sentences, they cannot parse Indian statements for underwriting — regardless of how many bank logos sit on their homepage.

Opening-balance banners are the first ghost. “Opening Balance as on 01-04-2025 1,24,330.50” is an anchor, not a credit. Header rows “Date Particulars Withdrawals Deposits Balance” are noise. “Page 7 of 42” is noise. Watermarks and Hindi/English bilingual labels are noise. Amateur tools turn noise into transactions or into gaps they then fill with invented amounts. Detect header noise. Merge wraps that straddle the footer. If a row has a date and no amount but the next row has amounts and no date, it is one transaction. Continuity validates the merge. If you cannot merge safely, flag the page — do not guess a ₹49 lakh debit because two numbers sat on a torn line. That invented crore will appear on your forensic sheet as structuring. You will investigate a ghost you minted.

Value date versus transaction date

Finacle and BaNCS often print both. Underwriting cashflow and bounce lookbacks should use the date the bank used for the running Balance identity — the posted date that makes Law 2 hold — not the value-date the borrower prefers for “when the cheque was given.” ABB on installment dates must use EOD balances from the posted ledger. If you mix value-date for credits and txn-date for debits, intra-day identity breaks and you will “heal” polarity until the sheet looks pretty and the PDF does not. Pretty and wrong is how Bajaj scrutiny starts a fight.

Lab notes by CBS family — what actually breaks in production

SBI BaNCS e-Passbook: rightmost Balance versus a Closing Balance header that sits closer to the narration. Multi-column YONO prints. Wrap-only lines with no money tokens. Opening balance as a fake credit. Canara / PNB / Indian Bank / Union Finacle: UPI/NEFT wraps that regex “ref strippers” destroy; dual amount columns; OP-history page banners. CUB mPassbook: CA/SB/CCOD product mix on one customer. HDFC FLEXCUBE netbanking: decimal alignment, ACH return charges that look like credits if narration-type is naive, and a dedicated parser path that should win when it extracts a dense ledger rather than a generic merge. Axis: Dr/Cr shift mid-page. ICICI Finacle detailed statements: 2-token amount+balance rows where IMPS ids and year fragments look like money — money-sanity gates must rank strategies, not row count. Saraswat / Cosmos / TJSB hybrids: national-titan header maps fail; universal fallback plus continuity is the honest sentence.

CBS family map — logos do not parse PDFs; identities do

CBS familyTeaching banksFirst-order parse failureControl
TCS BaNCSSBI, associatesHeader Close vs rightmost BalanceLaw 1 token rule
Infosys FinacleCanara, PNB, Indian Bank, CUBWrap drop; dual amountsLaw 3 merge + Law 2
Oracle FLEXCUBEHDFC, Axis, IDFC FIRST, RBLDecimal drift; ACH charge polarityDedicated path + continuity
Temenos T24StanChart, HSBC IndiaIntl grouping vs Indian lakhsparseMoney + identity
Hybrid co-opSaraswat, Cosmos, TJSB, SVCUnknown headersIFSC + fallback + flag

Same-day legs without timestamps

Ten UPI legs can print with one date. Alphabetical sort by narration is how you invent structuring. The running Balance column still encodes execution order. Reconstruct intra-day sequence with continuity, then type amounts. Forensic “smurfing” alerts that fire because you sorted A–Z are self-own goals. Credit officers will not forgive a false SAR theatre you created in Excel.

How to test a parser like a credit shop, not like a demo

Hostile fixtures beat slideware. Keep a Canara wrap, an SBI e-Passbook, an HDFC netbanking password PDF, an ICICI detailed statement, a CUB CCOD, and a Mumbai co-op. For each: (1) opening and closing match the PDF; (2) identity residual is reported, never hidden; (3) known wrap still contains the UPI/NEFT ref; (4) inward cheque, outward cheque, ECS, NACH, e-Mandate and Autopay are unmerged; (5) commercial “Enterprises” title is Current unless the PDF says Savings Account; (6) Excel is ExcelJS with formulas on running Balance, not a Python sidecar. Time the minutes from drop to pack. That scorecard is the only POC that matters when someone says they are a Perfios alternative.

  1. Ask the vendor to explain rightmost Balance in one sentence.
  2. Give Canara wrap + SBI e-Passbook + HDFC ACH-charge file on the same afternoon.
  3. Ask whether they invent amounts on missing rows (the correct answer is no).
  4. Ask whether inward and NACH are separate counts.
  5. Ask whether live Excel is TypeScript/ExcelJS with no Python on the report path.
  6. Ask what happens when Layer-4 breaks — flag, or silent pretty sheet?

FinAnalyser’s live path is the last of those answers: tokens, then identity, then ExcelJS. Inventing amounts is a bug. More extracted rows with false money is a worse extract than fewer true rows. Row-count KPIs are how ICICI detailed statements get ranked wrong. Magnitude versus prior balance is the sanity gate. Then continuity types the survivors. That pipeline is why parser tests and Excel tests belong in one repo.

FAQs

What is the rightmost Balance rule?

On a CBS transaction row, running Balance is the last monetary token. Amounts sit before it. Never pick Balance by distance to the header (Law 1).

What is Layer-4 continuity?

Balance[n-1] + Credit[n] − Debit[n] == Balance[n] at paise. Do not invent mega amounts from missing-row gaps (Law 2).

Why do Canara and PNB break scrapers?

Finacle wrapped narrations. Regex that strips “refs” drops UPI identities. Zero-drop merge is mandatory (Law 3).

Why HDFC decimals misalign?

FLEXCUBE-style amount alignment and ACH return-charge lines. Continuity plus dedicated netbanking paths beat header maps.

Does FinAnalyser use AI to guess amounts?

No. Amounts are tokens; continuity repairs polarity. Inventing amounts is a bug, not a feature.

Why is “more rows extracted” a bad parser KPI?

ICICI detailed statements and Finacle wraps produce digit runs that are not money (IMPS ids, years). Counting rows rewards false money. Rank strategies with money-sanity versus prior balance, then continuity. Fewer true rows beat more invented crores.

Can OCR replace native CBS PDFs for underwriting?

No as an SLA. OCR misreads commas and digits. Layer-4 becomes an alarm, not a healer of courage. Native exports are the standard. Scans are a flagged fallback. Vendors who claim equality without a break report are selling courage.

Why must live Excel be TypeScript/ExcelJS?

Institutional running-balance formulas must match the CBS column the auditor can see. Python xlsxwriter on the live path is a second implementation that will drift. Camelot/Python may exist as PDF fallback, not as the report generator (Law 7).

Related guides

Drop your PDF Statement — Free 3-Page Instant Analysis

Upload PDF