>_ Analyst Engineering

Reading a camt.053: The Bank Statement an Analyst Can Reconcile

Written by Ahmed at Analyst Engineering, a Senior Technical Business Analyst with 10+ years in banking and payments delivery.

Cover showing the structure of a camt.053 bank statement, from balances through entries to transaction details.

Key takeaways

  • A camt.053 has three layers: balances that must reconcile, entries that are what the bank booked, and entry details that break a booked entry into the individual transactions inside it. Most reconciliation defects come from treating an entry as a transaction.
  • One entry can contain many transactions. A batched salary credit arrives as a single booked entry with hundreds of TxDtls underneath, so any matcher that reads entries only will find one payment where there were four hundred.
  • The balance types are the reconciliation contract: opening booked (OPBD) plus the sum of booked entries must equal closing booked (CLBD). If that arithmetic fails, stop and investigate before matching anything, because the statement itself is wrong.
  • Bank transaction codes (BkTxCd) classify what happened using a domain, family, and subfamily hierarchy. They are what let you separate a return from a credit from a charge without reading free text, and they are the field legacy MT940 users have no equivalent for.
  • Match on the references, in priority order: EndToEndId first because the debtor set it and it survives, then UETR, then the account servicer reference. Never match on amount and date, which is what every manual process defaults to and why partial payments break it.

A camt.053 has three layers: balances that must reconcile, entries that are what the bank booked, and transaction details that break a booked entry into the individual payments inside it. One entry can hold four hundred transactions. Match on EndToEndId first, then UETR, then the account servicer reference, and never on amount and date.

A treasury team migrates from MT940 to camt.053 and their auto-match rate drops. The new format is meant to be richer, and it is, and their matcher is finding fewer payments than before.

The cause is almost always the same: the matcher reads entries. The bank books batches. And a batch is one entry containing many transactions, so four hundred payments arrive looking like one.

This is the camt article in the field-by-field track of The ISO 20022 Reference, following remittance information, and it is the message an analyst reads more often than any other once a system is live.

What is in a camt.053, structurally?

Three nested layers, and understanding the nesting is most of the job.

BkToCstmrStmt
└── Stmt                        one statement, one account, one period
    ├── Acct                    the account identification
    ├── Bal (repeating)         typed balances: OPBD, CLBD, ITBD, PRCD...
    └── Ntry (repeating)        ENTRIES: what the bank booked
        ├── Amt, CdtDbtInd      amount and direction
        ├── BookgDt, ValDt      booking date and value date
        ├── BkTxCd              what kind of movement this is
        ├── AcctSvcrRef         the bank's own reference for this entry
        └── NtryDtls
            └── TxDtls (repeating)   TRANSACTIONS inside the entry
                ├── Refs              EndToEndId, UETR, InstrId, MndtId
                ├── Amt, AmtDtls      amounts, including FX detail
                ├── RltdPties         debtor, creditor, ultimate parties
                ├── RltdAgts          the agents involved
                ├── Chrgs             charges taken
                └── RmtInf            remittance information

The layer that matters: Ntry is what moved the balance. TxDtls is what the payment actually was. A single credit entry of 2,847,113.22 for a payroll run contains hundreds of TxDtls, one per employee, each with its own references and remittance.

Any reconciliation that stops at the entry level sees one item. This is the defect behind the dropped match rate, and it is invisible in testing if the test file was built from single payments.

The balances are a contract, so check them first

The Bal block repeats with a type code. The ones you meet:

CodeMeaning
OPBDOpening booked balance
CLBDClosing booked balance
ITBDInterim booked balance
PRCDPreviously closed booked balance
CLAV / OPAVClosing and opening available balance
FWAVForward available balance

Booked and available are different numbers and both are correct: available reflects what the customer can actually use, after holds and uncleared items.

The arithmetic that must hold on every statement:

OPBD + sum of booked entries (signed by CdtDbtInd) = CLBD

Run that check before any matching logic. If it fails, the statement is wrong or incompletely received, and every downstream match is now operating on bad data. Making this a hard gate rather than a warning is one of those small design decisions that saves a genuinely awful afternoon later, and it is the same principle as the entry and exit criteria in reconciliation design.

Also check PRCD against the previous statement’s CLBD. A gap means a statement was missed, which is a delivery problem no amount of matching will fix.

Bank transaction codes: the classification MT940 never had

BkTxCd tells you what a line is, structurally rather than narratively. It carries a domain, a family, and a subfamily, drawn from an ISO 20022 external code list, and banks may add a proprietary code alongside.

The domain says the broad area, such as payments or account management. The family narrows it, such as received credit transfers or issued credit transfers. The subfamily narrows further, distinguishing for example a settled credit transfer from a returned one.

This is what lets your cash application separate:

  • an incoming customer payment,
  • a return of a payment you sent,
  • a bank charge,
  • an interest posting,
  • a reversal,

without parsing free text. MT940 users did this with narrative pattern-matching per bank, which is why every treasury system carried a library of bank-specific rules. The structured code replaces that library.

Two practical cautions. Banks vary in how deep they populate the hierarchy, so build against domain and family and treat subfamily as a bonus. And the code list is external, like purpose codes, so it is configuration with an owner and a refresh cadence, not a hardcoded enumeration.

Matching: the reference priority that actually works

Inside TxDtls, Refs carries the identifiers. Use them in this order:

  1. EndToEndId. The debtor assigns it and schemes require it to be passed unchanged, so it is the most direct link back to the original instruction. If your organisation is the payer, this is the reference you control, and putting your own invoice or order identifier here is the single best thing you can do for your own reconciliation.
  2. UETR. Unique across the whole chain and designed to survive every hop. Excellent for investigation and tracing. See which identifier to trace on for why the others are traps.
  3. AcctSvcrRef. The bank’s own booking reference. Essential when you telephone the bank about a line. Not set by the payer, so it cannot link to your order.
  4. InstrId. Point to point only, rewritten at hops. Useful within one leg, useless across the chain.
  5. MndtId. For direct debits, the mandate reference.

Then remittance: RmtInf inside TxDtls carries the structured block or the free text, including any RF creditor reference. A valid RF reference is a direct lookup to an open invoice, which is exactly the automatic match discussed in remittance information.

Amount and date matching is a last resort. It is what every manual process defaults to and it breaks on partial payments, on batched settlements, on payments where a correspondent deducted charges, and on anything crossing a value date boundary. Use it as a tie-breaker inside a candidate set, never as the primary key.

camt.052, camt.053, camt.054: which to consume

All three, for different jobs.

MessageWhenContentTypical use
camt.052IntradayProvisional, may include pendingIntraday liquidity, early visibility
camt.053End of dayFinal, bookedAccounting reconciliation, the record
camt.054Event or batchIndividual debit or credit advicesReal-time cash application

The distinction that causes incidents: camt.052 is provisional. Items visible intraday can change or disappear by the end of day. Posting to the ledger from a camt.052 produces entries that the camt.053 then contradicts. Treasury may act on intraday information; accounting reconciles on the statement.

camt.054 is the one most underused. If your cash application waits for the end-of-day statement, your customers’ payments sit unapplied all day and your credit control chases people who have already paid. Consuming camt.054 moves cash application to near real time, and it is usually a smaller project than people expect.

What to specify and what to test

Specification:

  1. Which of the three messages you consume, and what each one is allowed to update. Provisional data must not post to the ledger.
  2. The balance reconciliation gate, and what happens when it fails.
  3. Statement sequence checking, so a missing statement is detected rather than silently skipped.
  4. The reference priority for matching, in order, with amount and date explicitly last.
  5. Entry versus transaction handling, stated explicitly, because this is the defect.
  6. Bank transaction code mapping as configuration, with an owner.
  7. What happens to an unmatched item: a queue with an owner and an ageing rule, not a log line.

Test conditions:

  • A batched entry containing many transaction details, asserting that each transaction is matched individually.
  • A statement whose balances do not reconcile, asserting the gate fires and nothing is matched.
  • A missing statement in the sequence, detected by PRCD mismatch.
  • A payment with a valid RF reference, asserting an automatic match to the right invoice.
  • A partial payment against an invoice, which must not match on amount.
  • A return arriving as a credit, classified correctly by its bank transaction code rather than treated as a new customer payment. This one is worth real attention: misreading a return as a payment credits a customer twice in your ledger.
  • FX detail present in AmtDtls, asserting the instructed and settled amounts are both captured, per amounts and FX.

The takeaway

Read a camt.053 in three layers. Balances are a contract: check OPBD plus booked entries equals CLBD before you match anything. Entries are what the bank booked and what moved the balance. Transaction details are the individual payments inside an entry, and reading entries alone is the defect that quietly destroys a migration’s match rate.

Match on EndToEndId first, then UETR, then the account servicer reference, and treat amount plus date as a tie-breaker rather than a key. Use bank transaction codes to classify instead of parsing narrative, and consume camt.054 if you want cash applied before the end of the day.

Next: cover payments and pacs.009 COV, where one payment travels as two messages and reconciliation gets genuinely interesting. The full map is on The ISO 20022 Reference.

Ahmed is a Senior Technical Business Analyst with 10+ years in banking and payments. He builds practical guides and tools for analysts at The Tech BA Toolkit.

Tags: ISO 20022, Payments, Banking, Reconciliation, Treasury

About the author

Analyst Engineering is written by Ahmed, a Senior Technical Business Analyst with 10+ years of banking and payments delivery experience: ISO 20022 and SWIFT messaging, payments API integration, Kafka event validation, and production support. Every article comes from real delivery work, and each one is reviewed and updated as tools and standards change.

Free account

Practice on the Labs, keep your progress

A free account, no password: an email link signs you in. It saves your steps and self-assessments on the Labs, shows your missions on a dashboard, unlocks the solutions, and, if you tick the box, sends you new missions and articles when they ship.

Your email is used to sign you in. Nothing else, unless you ask. Privacy.