When the text says ₹25 and the statement says ₹29.50
An Axis Bank charge notice arrives saying a charge of ₹25 has been applied, excluding GST. The statement, a day later, shows ₹29.50. Both are correct. Only one of them is the amount that left the account.
Why the two numbers differ
Banking and financial services in India are taxed at 18% GST, under service code 9971. A bank’s charge notice frequently quotes the charge before that tax is added, and says so — the words excl GST, + GST or plus applicable taxes sit right there in the message. The statement then posts the figure you were actually debited.
₹25 plus 18% is ₹29.50. The gap is ₹4.50, which is nothing, until you notice it applies to every fee your bank ever charges you and that fees are the line item people least expect to be wrong.
What we got wrong
Our importer read the first amount in the message and recorded ₹25. It did this consistently — 16 times in the inbox we measured — so a ledger built from bank messages showed a bank-charge total that was reliably 15% under the truth. Not random noise, which would average out. A bias, in one direction, forever.
We found it during a hand-labelled audit of our own import output, where it showed up alongside a card bug. The statement was what settled it: the message said ₹25, the line on the statement said ECS Txn Chrgs Incl GST 29.50, and the ledger agreed with neither.
The fix
Two changes, both narrower than they sound.
First, tax-inclusive reading. When a rupee amount is immediately followed by wording that says the tax is excluded, the importer now adds it. If the message states a rate, that rate is used. If it does not, 18% is applied, because that is the rate for the service code these charges fall under. The look-ahead is deliberately short — a few dozen characters — so a tax rate mentioned in an unrelated sentence later in the message cannot reach back and modify an amount it has nothing to do with.
Second, totals win over their parts. A message that itemises a charge and then states a total was giving the importer several candidate amounts with no way to choose. Now, when exactly one figure in a message is labelled as the total, the others are marked as components of it and are not eligible to become the transaction.
Sixteen messages changed amount. Nothing changed direction, category or account, which we confirmed by re-running the importer across all 9,109 messages and diffing every row against the previous run.
The part we cannot fix
If the GST rate on banking services changes, these messages will quietly become wrong again, in the same silent direction as before. The importer would keep applying 18% to a charge that is no longer taxed at 18%, and nothing in the message would contradict it.
There is no clever way around that. What there is, is the check that caught it the first time: reconciling the ledger against a real bank statement. That comparison is the only thing in this whole system that sees the truth rather than a description of it, and it is the reason we now run it deliberately rather than by accident.
If you are in India and you import bank messages
Two things are worth knowing regardless of what software you use.
Bank charge alerts and the statement will often disagree, and the statement is right. And the small, bank-initiated entries — fees, interest credits, anything under about ₹500 — are the ones least likely to generate a message at all. In the three statements we reconciled, all eight lines with no matching text message were of that kind. From 1 January 2027 the RBI’s alert mandate covers transactions above ₹500, so a ledger built only from texts will thin out at the bottom by design.
So if you are checking a ledger built from messages, check it against a statement at least once. Not because our import is worse than the alternative — because messages are a description of your account, and a statement is your account.
You can verify what the app does with those messages on your own phone, without trusting anything we have said here: the ways to check are here.