SWIFT ISO 20022 and CBPR+, after the coexistence window closed
Published 5 August 2026
10 min read
swift iso 20022
CBPR+ is not a message format. It is the set of rules that says how ISO 20022 messages must be populated for cross border payments and reporting between banks, and it is the reason two banks on opposite sides of the world can agree on what a field means.
Why a usage guideline was necessary at all
ISO 20022 is deliberately broad. Left unconstrained, two banks could implement the same pacs.008 in ways that are both valid and mutually useless. CBPR+ narrows it: which elements are mandatory, how parties are structured, what may appear in remittance information, and how identifiers must be carried so they survive the chain.
The operational consequence is that a field being present is no longer the only question. The question is whether it is populated the way the guideline requires, because that is what downstream automation is built against.
This console matches the first rows a side. It left out
statement
and
ledger
.
Nothing in the rows left out is counted below.
To run a full file,
.
8 exact ·
1 under tolerance ·
24 rows
Break
Amount
Difference and suggested action
Classification
BRK-001
Aged 0d
$219,105.40
2026-09-03 · both sides
REF//FX/SPOT/7741 · INTERBANK FX DESK
Amount differs by 164.80 USD (0.075%)
Re-price the ledger leg on the correspondent rate source for the value date and post 164.80 USD to FX variance.
FX RATE SOURCE
→ Treasury Ops
BRK-002
Aged 4d
$187,650.00
2026-08-30 · ledger
PAY/90012/R · KESTREL LOGISTICS
Posted in the ledger, not on the statement
Trace the posting to its instruction, repair the reference and re-present it, or reverse it if the payment was returned.
MISSING REFERENCE
→ Payments Ops
BRK-003
Aged 0d
$123,760.00
2026-09-03 · both sides
REF//TRF/554121 · HALCYON TRADING
Statement 61,880.00 vs ledger 123,760.00 (50% short)
Split the ledger posting and match the settled leg; leave the residual 61,880.00 USD open against the same reference.
PARTIAL SETTLEMENT
→ Payments Ops
BRK-004
Aged 0d
$3,410.00
2026-09-03 · statement
REF//CHG/Q3FEES · CORRESPONDENT CHARGES
On the statement, nothing in the ledger
Post 3,410.00 USD to the charges account for the period and add it to the standing accrual so it stops surfacing as a break.
FEE NOT ACCRUED
→ Finance
·
·
Audit note:
→
Everything matched under these tolerances.
Tighten the date or amount tolerance to see the breaks it was absorbing.
Correspondent statement
camt.053 · NOSTRO USD
Value date
Reference
Amount
Counterparty
2026-09-02
REF//NONREF/2026090301
1,284,500.00
ACME MANUFACTURING
2026-09-02
REF//INV/88231
96,400.00
NORDVEST SHIPPING
2026-09-03
REF//TRF/554120
452,180.25
HALCYON TRADING
2026-09-03
REF//FX/SPOT/7741
218,940.60
INTERBANK FX DESK
2026-09-01
REF//SEPA/33421
74,220.00
LINDQVIST AS
2026-09-03
REF//CHG/Q3FEES
3,410.00
CORRESPONDENT CHARGES
2026-09-03
REF//TRF/554121
61,880.00
HALCYON TRADING
2026-09-02
REF//PAY/90012
187,650.00
KESTREL LOGISTICS
2026-09-02
REF//INV/88245
242,015.00
BRIGHTLINE FOODS
2026-09-03
REF//TRF/554133
18,905.50
MERIDIAN PARTS
2026-09-01
REF//PAY/90044
505,300.00
VANTAGE ENERGY
2026-09-03
REF//INV/88260
132,640.75
ORION TEXTILES
Internal nostro ledger
Core banking export
Value date
Reference
Amount
Counterparty
2026-09-02
NONREF/2026090301
1,284,500.00
ACME MANUFACTURING
2026-09-02
INV/88231
96,400.00
NORDVEST SHIPPING
2026-09-03
TRF/554120
452,180.25
HALCYON TRADING
2026-09-03
FX/SPOT/7741
219,105.40
INTERBANK FX DESK
2026-08-31
SEPA/33421
74,220.00
LINDQVIST AS
2026-09-02
PAY/90012
187,650.00
KESTREL LOGISTICS
2026-09-03
TRF/554121
123,760.00
HALCYON TRADING
2026-08-30
PAY/90012/R
187,650.00
KESTREL LOGISTICS
2026-09-02
INV/88245
242,015.00
BRIGHTLINE FOODS
2026-09-03
TRF/554133
18,905.50
MERIDIAN PARTS
2026-09-01
PAY/90044
505,300.00
VANTAGE ENERGY
2026-09-03
INV/88260
132,640.75
ORION TEXTILES
Matched pairs are tinted on both sides. Breaks carry the brass left rule and appear in the worklist.
Sample data only. Matching runs in your browser; classification is written by the model when you press Run.Matching done in your browser. Writing classifications…Classifications written by the model on this run. Decision support, not a compliance determination.The classification model was unavailable, so the built-in rule classifier wrote these. Same matching, same numbers.This console classifies up to 12 runs a minute and this run went over, so the built-in rule classifier wrote these. Same matching, same numbers. Wait a minute for the model, or
.
The model wrote the first 8 classifications.
The rule classifier wrote the rest ().
March 2023: coexistence begins on the SWIFT network. Banks may send MT or MX for cross border payments and reporting.
Through 2023 and 2024: major market infrastructures migrate, and enhanced data becomes normal on domestic rails in several jurisdictions.
November 2025: the coexistence window for cross border payments and reporting categories closes on FIN.
After: MX is the network standard for those flows, while MT persists in domestic schemes, internal interfaces, older bilateral arrangements and every archive you own.
Check the current SWIFT and market infrastructure guidance for your corridors before making a plan from any timeline, including this one. Deadlines move, and local schemes run their own.
What changed in the exception queue
Two things got better and one got worse. Structured parties reduced the repairs caused by address formatting, and a surviving end to end id turned a class of fuzzy matches into exact ones. What got worse, at least temporarily, is the variety: a bank now reconciles MX from most correspondents, MT from some domestic flows, and translated messages from a few legs where an intermediary sat in the middle. Variety is exactly what a rigid reconciliation tool handles badly.
Case
Before
Now
Cross border credit transfer
MT103, narrative references
pacs.008 under CBPR+, structured references
Statement
MT940 end of day
camt.053, with camt.052 or camt.054 intraday
Return
MT103 with a narrative reason
pacs.004 with a coded reason tied to the original
Cancellation
MT192 free text request
camt.056 with a structured case
Investigation
Email and MT19x
Structured case messages, where both parties support them
Swipe the table sideways to read every column.
Three failures that still generate breaks
01Truncation at an intermediary. A leg that passes through a system with MT-era field sizes loses structured content, and the receiving bank gets a payment that no longer matches its instruction cleanly.
02Local population habits. A correspondent populates a permitted field in a way your rules did not anticipate. Not invalid, just different, and it produces a steady trickle of unmatched items until someone encodes it.
03Internal flattening. The message arrives correct and a system inside your bank strips it before reconciliation sees it. This is the most common and the most fixable.
What CBPR+ actually constrains
The guideline works by narrowing choices. Where the base standard permits a party to be identified several ways, CBPR+ says which ones are acceptable between banks. Where remittance information could be free text or structured, it says when each is allowed and how long it may be. Where an identifier could be omitted, it makes it mandatory so that the chain has something to carry.
Structured party data: name and postal address as components, with rules on which components are required for which party role.
Identifier carriage: the end to end id and the uetr are expected to travel unchanged, which is what makes tracking and exact matching possible.
Charges: a coded charge bearer plus explicit charge records, rather than a difference the receiver has to infer.
Return and cancellation handling: coded reasons tied to the original message instead of narrative explanations.
Character sets and lengths: constrained so that a message accepted by one bank is not rejected by the next.
For an operations team the practical reading is that CBPR+ turned a set of conventions into something you can write a rule against. A field that is mandatory can be a matching key. A field that is optional cannot, and a rule that assumes it will always be there produces a slow trickle of unexplained breaks.
The uetr, and why tracking changed the conversation
The unique end to end transaction reference is a single identifier assigned at the start of a payment and carried by every bank in the chain. It is what makes it possible to ask where a payment is and get an answer rather than a series of emails. For reconciliation it does something quieter but just as useful: it gives an investigation a spine. When an item is unmatched and the counterparty is asked about it, the question is about one identifier rather than about an amount and a date that could describe several payments.
It is worth being clear about what it does not do. A uetr identifies the payment through the chain. It does not guarantee that the originator reference your customer cares about survived, and it is not always present on the statement entry your reconciliation reads. Whether it reaches the statement depends on the reporting bank, which is exactly the kind of thing worth checking per correspondent rather than assuming.
Coexistence left an inventory problem
The end of the coexistence window changed what travels on the network. It did not change what sits inside a bank. Almost every institution now has some mixture of the following, and the mixture is the real migration state.
Source
Likely shape today
What the reconciliation needs
Cross border correspondents
MX under CBPR+
Rules using structured references and the end to end id
Domestic schemes
Varies by country, some still MT based
Per source parsing, not a global assumption
Internal payment engine
Often a canonical format older than the migration
A feed that preserves the original structure
Card and ATM settlement
Scheme specific files, unaffected by the migration
A separate parser and its own tolerances
Historic archive
MT for anything before the cutover
Read capability retained for investigations
Swipe the table sideways to read every column.
The mistake worth avoiding is treating format as a property of the bank rather than of the source. A reconciliation configured with one global assumption will be wrong for at least two of the rows above on any given day.
Translation, and the quiet damage it does
During coexistence, network level translation let an MX message reach a bank that could only read MT, and the reverse. Translation is lossy in one direction by definition: a structured address with six components cannot be carried by a field that holds four lines of thirty five characters without something being discarded or truncated.
The damage is quiet because the payment still settles. What arrives is a payment with a shortened name, a truncated reference or a missing structured block, and it settles perfectly well. The cost appears two steps later, when the item does not match cleanly and a person has to work out which of three candidate ledger entries it belongs to. If your break population has a stubborn seam of missing reference items concentrated on a few correspondents, translation somewhere in the chain is the first thing to check.
A migration checklist that is actually about reconciliation
01List your sources and record the actual format each one sends today, verified from a real file rather than from a project document.
02For each source, confirm whether the end to end id and the uetr reach the statement entry, because that decides whether exact matching is available.
03Confirm your ingestion reads to transaction level inside batched entries, not just to entry level.
04Check whether any internal system rewrites references between instruction and reconciliation.
05Keep MT parsing and MT archive reading in support, and make that an explicit decision rather than an oversight.
06Classify breaks by cause and review the distribution monthly, per correspondent, so a population problem is visible while it is still small.
Reject, return and cancellation are three different things
These three words are used loosely in conversation and mean quite different things in a message flow, which matters because each produces a different reconciliation outcome. A reject happens before settlement: the message failed validation or a check, and no money moved. A return happens after settlement: money moved and is being sent back, which means there are two settlements to account for and two entries on the account. A cancellation is a request, not an outcome: one bank asks another to stop or recall a payment, and the answer may be no.
The reconciliation consequences follow directly. A reject should remove an expected item, not create a break. A return should be tied to its original so the account shows a matched pair with a reversal rather than two unexplained entries. A cancellation request should create a pending state on the original item, so that an item under investigation is visibly under investigation rather than simply unmatched. Structured status and reason codes make all three of these automatic; narrative explanations make all three of them manual.
Event
Money moved
Correct reconciliation handling
Reject before settlement
No
Cancel the expected item, no break raised
Return after settlement
Yes, twice
Reversal tied to the original, matched as a pair
Cancellation request
Not yet decided
Original item flagged pending, aged, awaiting response
Recall accepted
Yes, returned
Same as a return, with the case reference attached
Recall refused
No change
Pending state cleared, original item stands
Swipe the table sideways to read every column.
Structured addresses, the deadline that caught people out
The move away from unstructured party address data is the requirement that generated the most late work in this migration, and the reason is that the data does not live in the payments stack. It lives in customer records that were captured years ago, often as free text in a single field, sometimes with the building number and street in an order no parser will reliably separate. A payments team can do nothing about that on its own, and the remediation belongs to whoever owns the customer master.
The reconciliation consequence is worth stating plainly, because it is usually missed. Party data that was previously a display field becomes a field that can carry a matching key and that can also cause a rejection. Both directions matter: a payment that stops for a malformed address is a repair, and a payment that carries a well-structured party is a payment that can be matched on something more reliable than a free-text narrative.
What coexistence taught, and what to keep
The lasting lesson of the coexistence period is that format is an attribute of a source rather than a property of the bank. Institutions that built on that assumption absorbed each cutover as a configuration change. Institutions that treated the migration as a state to be reached found that the date arrived while several internal interfaces, domestic schemes and every archive they held were still on the old format, and the gap was filled with translation layers that nobody planned and few documented.
That is worth keeping, because this is not the last format change. Retaining the ability to parse what a source actually sends, rather than what the roadmap says it should send by now, costs very little when it is designed in and is expensive to retrofit under a deadline.
What to expect, honestly
Structured data improves matching where it survives the whole chain, and it makes very little difference where it does not. That is why two banks running the same migration can report completely different results without either of them being wrong. The variable is not the standard, it is how many hops preserve it, and how much of the structure the receiving bank actually reads. Both of those are within your control in a way that a correspondent behaviour is not, which is where the work is worth putting.
What to do about it
Measure breaks by cause, not by count. If the classification vocabulary distinguishes a missing reference from a fee difference from a timing difference, the pattern in the data tells you which correspondent, which corridor and which internal interface to fix. That is a reconciliation capability before it is a payments project, which is why ISO 20022 payment automation tends to be funded out of the migration budget and paid back out of the operations budget.
Create an account, and we will email you how onboarding works and what a first source connection looks like. The Reconciliation Break Resolver is open to try right now, on sample data, without an account.
Creating an account with the button above needs no card; paid plans are paid on our payment processor's secure page. Sample data only in the demo. BankAutomation is operations software, not a regulated service.