Reference🏦 Bank reconciliationAdvanced⏱ 17 min read

📨 Swift MT and the MT940 statement

The MT message family, the MT940 tag by tag, field :61: broken down, and what the ISO 20022 migration means

The MT family: payment and cash reporting messages

MT (Message Type) messages are the legacy format of Swift's FIN network. They are structured text messages built from tags (:20:, :61:, and so on) and grouped into categories: 1 = customer payments, 2 = financial institution transfers, 9 = cash management. Category 9 is the one that matters for reconciliation, because it carries account statements.

Message formatCategoryRoleISO 20022 equivalent
MT1011Transfer order sent by a customer (often relayed between banks as a request for transfer)pain.001
MT1031Interbank customer credit transfer (the message that “carries” the payment)pacs.008
MT9009Confirmation of a single debitcamt.054
MT9109Confirmation of a single creditcamt.054
MT9409End-of-day customer account statementcamt.053
MT9429Intraday statement (entries since the last report; tags :13D:, :90D:/:90C:)camt.052
MT9509Interbank account statement (nostro accounts, no :86: customer details)camt.053
MT messages relevant to payment operations

An “MT940” that a company receives has not necessarily traveled over Swift. The format became the lingua franca of electronic statements, and most banks deliver it as a file over EBICS, SFTP, or FileAct. The file then lacks the FIN network header blocks, but the tags read exactly the same way.

11 000+
institutions connected to the Swift network in more than 200 countries
Swift
Nov. 2025
end of MT/MX coexistence for categories 1 and 2 (CBPR+)
16
maximum characters in the customer reference of field :61:, the biggest limitation of MT940

The MT940, tag by tag

An MT940 is an ordered sequence of tags. The balances (:60F:, :62F:, :64:, :65:) all use the same compact format: debit/credit mark (C/D) + YYMMDD date + ISO currency code + amount with a decimal comma. Each entry is carried by a :61: (structured data) and :86: (narrative and additional information) pair. The first is standardized; the second is left to each bank.

:20:Message reference · 16x:25:Account (IBAN):28C:Statement no. / sequence · 132/1:60F:Opening balance · C 260709 EUR:61:Entry · 0 to n:86:Narrative · 6×65x · bank-specific:62F:Closing balance · C 260710 EUR1 entry = 1 :61:/:86: paircheck 1: :60F: + Σ signed :61: = :62F::62F:(D) = :60F:(D+1)Field :61: (9 subfields)run together, no separator1 · 6!n value date YYMMDD2 · [4!n] booking date MMDD, no year3 · 2a C / D / RC / RD4 · [1!a] funds code5 · 15d amount, decimal COMMA6 · 1!a3!c S103 | NTRF | Fxxx7 · 16x customer ref, TRUNCATED8 · [//16x] bank ref9 · [34x] details, optionalArithmetic checkSequence checkParser pitfalls16 characters of customer reference: a 35-character SEPA EndToEndId won't fit. That is reason No. 1 to move to camt.053.
TagNameFormat / contentMandatory
:20:Message reference16x (identifier assigned by the sending bank)Yes
:21:Related reference16x (reference of a related message)No
:25:Account identification35x (IBAN or bank/branch/account identifier)Yes
:28C:Statement / sequence number5n[/5n] (e.g., 132/1); flags a missing statementYes
:60F: / :60M:Opening balance1!a6!n3!a15d; F = first, M = intermediate (multi-message statement)Yes
:61:Statement lineComposite field (see breakdown below), 1 per transactionNo (0-n)
:86:Information to account owner6×65x (narrative, counterparties, references); structure specific to each bankNo
:62F: / :62M:Closing booked balanceSame format as :60F:; must equal the opening balance plus the sum of the :61: linesYes
:64:Available balanceValue-dated balance, usable for cash managementNo
:65:Forward available balance1 line per future value dateNo (0-n)
MT940 tags
🔑
Run a systematic integrity check on import: :60F: + Σ of the signed :61: amounts = :62F:, and day D's :62F: must equal day D+1's :60F:. Combined with the :28C: sequence numbers, this ensures that no statement and no entry is missing.

Field :61: broken down

Field :61: packs all the structured information about an entry into one dense line. Its Swift syntax is 6!n[4!n]2a[1!a]15d1!a3!c16x[//16x][34x], a compact notation that only becomes readable once a real line is broken down.

A :61: line broken down subfield by subfield
:61:2607100710C12500,00NTRFPAYOUT-ADYEN-42//BNK7593012

260710            1. Value date (6!n, YYMMDD)          -> July 10, 2026
0710              2. Entry date (4!n, MMDD, optional)  -> 07/10; the year is implicit
C                 3. Debit/credit mark (2a): C credit, D debit,
                     RC/RD reversal of credit/debit
(absent)          4. Funds code (1!a): 3rd letter of the
                     currency code, rarely used
12500,00          5. Amount (15d): decimal comma
                     required, NO thousands separator
NTRF              6. Transaction type (1!a3!c):
                     N + Swift-defined code (TRF here)
PAYOUT-ADYEN-42   7. Reference for the account owner (16x):
                     "NONREF" if the bank has none
//BNK7593012      8. Bank reference ([//16x])
(next line)       9. Supplementary details ([34x]), optional
CodeMeaning
NTRFTransfer
NDDTDirect debit (charged to the account)
NCHGCharges and fees
NCHKCheck
NSTOStanding order
NRTIReturned item / unpaid
NINTInterest
NFEXForeign exchange transaction
NMSCMiscellaneous, the catch-all category
Most common N + code transaction types
⚠️
Three :61: pitfalls
(1) The MMDD entry date has no year. Across the December 31 to January 1 rollover, the year must be inferred from the value date, a classic source of bugs in home-grown parsers. (2) The amount uses a decimal comma, not a period, so any import configured for an English-language locale misreads it. (3) The customer reference is capped at 16 characters, so a 35-character SEPA EndToEndId does not fit. That limit is the number one reason to migrate to camt.053.

A complete annotated MT940

An e-commerce merchant's statement for July 10, 2026: two PSP payouts credited, plus a supplier direct debit and bank charges debited. Lines starting with # are teaching annotations, added here for readability; they do not appear in the actual file.

Full MT940, statement for July 10, 2026
# FIN network header (simplified): present if the message goes over Swift,
# absent when the MT940 is delivered as a file via EBICS / SFTP.
{1:F01BNPAFRPPAXXX0000000000}{2:O940AGRIFRPPXXXN}{4:
:20:AC940260710-0132
# :20: unique message reference, assigned by the sending bank
:25:FR7630004008120002345678928
# :25: account concerned (here, the IBAN)
:28C:132/1
# :28C: statement no. 132 of the year, page 1 -> sequence check
:60F:C260709EUR98425,12
# :60F: opening balance: Credit, July 9, 2026, EUR, 98,425.12
:61:2607100710C12500,00NTRFPAYOUT-ADYEN-42//BNK7593012
:86:/ORDP/ADYEN N.V./REMI/SETTLEMENT BATCH 42 ACME FR
# Entry 1: Adyen payout of 12,500.00, credited. The :86: identifies the
# ordering party (/ORDP/) and the remittance info (/REMI/) - bank-specific coding.
:61:2607100710C8420,00NTRFSTRIPE-PO-1PAB77//BNK7593013
:86:/ORDP/STRIPE TECHNOLOGY EUROPE/REMI/STRIPE PAYOUT
# Entry 2: Stripe payout of 8,420.00. The customer reference (16x max)
# was truncated: the full identifier is po_1PabQ2KiAcme7731.
:61:2607100710D1840,50NDDTRENT-2026-07//BNK7593044
:86:/MARF/UMR-FONCDOCKS-0042/CRED/FR12ZZZ556677/REMI/RENT JULY
# Entry 3: SEPA direct debit, debited. /MARF/ = mandate reference (UMR),
# /CRED/ = SEPA creditor identifier (SCI).
:61:2607100710D25,00NCHGNONREF//BNK7593101
:86:ACCOUNT MAINTENANCE FEE JULY 2026
# Entry 4: bank charges, NCHG, no customer reference -> NONREF.
:62F:C260710EUR117479,62
# :62F: closing balance: 98,425.12 + 12,500.00 + 8,420.00 - 1,840.50 - 25.00
:64:C260710EUR117479,62
# :64: available balance by value date (identical here: everything is value-dated today)
:65:C260711EUR117479,62
# :65: forward balance for July 11
-}
  • Check 1 (arithmetic): 98,425.12 + 12,500.00 + 8,420.00 − 1,840.50 − 25.00 = 117,479.62 = :62F:. ✔
  • Check 2 (sequence): statement 132/1 follows the previous day's 131/x, and its :60F: equals the previous day's :62F:.
  • Check 3 (matching): PAYOUT-ADYEN-42 matches batch 42 in the Adyen settlement report. The truncated Stripe reference forces a fallback match on amount + date.

The BIC: identifying banks

The BIC (Business Identifier Code, ISO 9362) identifies each institution on the Swift network and in SEPA messages. It comes in an 8-character version (BIC8, the institution) and an 11-character version (BIC11, with a branch code).

PositionsContentExampleNote
1-4Institution codeBNPAAssigned by Swift
5-6ISO 3166 country codeFR
7-8Location codePPA 0 in position 8 indicates a test BIC
9-11Branch code (optional)XXXXXX or blank = head office / all branches
Anatomy of a BIC: BNPAFRPPXXX

In back-office systems, the BIC shows up in FIN headers, in counterparty details (RltdAgts in camt messages), and in bank channel configuration. Since SEPA Regulation 260/2012, the IBAN alone is enough for credit transfers and direct debits within the EU (“IBAN only”), but the BIC is still essential for multi-bank setups and international payments.

ISO 20022 migration: CBPR+ and the future of MT940

The CBPR+ program (Cross-Border Payments and Reporting Plus) is moving Swift cross-border payments from MT messages to MX (ISO 20022) messages. Coexistence began in March 2023. Category 1 and 2 MTs were retired from interbank FIN traffic in November 2025, ending coexistence for those two categories.

2004
ISO 20022 published
A universal financial messaging standard with XML syntax and a common data dictionary.
2008
SEPA adopts ISO 20022
SEPA credit transfers and direct debits use pain/pacs/camt from day one.
March 2023
CBPR+ and T2 go live
MT/MX coexistence begins for cross-border payments; the Eurosystem's T2 moves to full ISO 20022.
November 2025
Coexistence ends for categories 1 and 2
MT101, MT103, MT202, and others no longer travel between banks on FIN; pacs.008, pacs.009, and pain.001 replace them.
2026
Category 9 lives on
MT940/941/942/950 are still accepted for cash reporting, with no announced cutoff date, even as the move to camt.052/053/054 speeds up.
🔑
The back-office impact, and its limits
The MT940 files that banks deliver keep working, because the end of MTs applies only to interbank traffic in categories 1 and 2. Rich data (the full EndToEndId, structured party details, BTC bank transaction codes) is carried only in camt messages. Sticking with MT940 therefore means accepting truncated references and weaker matching, which drive up exception volumes. In 2026, the sensible target is camt.053 as the primary feed, with MT940 as a fallback.

Cascading truncation is the information a payment loses when it changes format along the way. A transfer received as a data-rich pacs.008 may be reported in a pared-down MT940 that has no room for long references or structured party data. Banks maintain MX-to-MT mapping tables that document this data loss (the CBPR+ data truncation concept), which weighs in favor of receiving statements in ISO 20022.