Skip to content
ONLINE·BOOKING Q4 2026 ENGAGEMENTS·ONDINE v1.10.1·--:-- UTC
← all work
Data EngineeringAML / CFTBanking

“Where is my payment?”
One trace across 11 countries

A physical network of transparent payment rails connecting banks through a controlled inspection gate

A cross-border payment left one bank, crossed several intermediaries and produced status updates in systems owned by different teams. I worked on the shared data layer that turned those fragments into one real-time journey across 200 corridors.

11
Countries
200
Payment Corridors
1
End-to-End Trace
2
Operational + Client Views

A corporate payment crossed several banks and borders. When it slowed down, the answer to “Where is my payment?” lived in messages spread across local systems and operations teams in 11 countries.

I worked on the data layer that brought those events into one payment timeline across 200 corridors. Operations could investigate an exception from the same trace that clients saw in their tracking view.

00 · IN BRIEF

The case study in 60 seconds

Problem
One cross-border payment produced status, timing and fee information in several systems. Investigating it meant reconstructing the journey by hand.
Intervention
Centralize SWIFT gpi tracking events in a shared data layer and expose one ordered payment history to operational and customer-facing applications.
Scale
11 countries and 200 payment corridors.
Outcome
A payment could be followed in real time by its identifier instead of being chased through email and local tools.
01 · PROBLEM

Following one payment through separate systems

Cross-border payments are not one database update. The sending bank releases an instruction, correspondent banks process their legs, compliance controls can pause it, fees may be deducted and the beneficiary bank confirms the credit. Each participant sees its own part.

SWIFT gpi provides the common thread: the Unique End-to-End Transaction Reference, or UETR. The platform problem was to preserve that thread while events arrived from different countries and systems, then turn it into a timeline an operator could trust.

One trace had to answer four questions

Where is the payment now?

Show the latest confirmed state without erasing the events that led to it.

Where did time accumulate?

Measure each leg separately so a corridor delay is distinguishable from a compliance hold or a downstream bank delay.

What changed the amount?

Retain fee and currency information per leg instead of presenting only the final credited amount.

Who needs the explanation?

Give operations the diagnostic detail they need while exposing a simpler, safe status history to the client.

02 · ARCHITECTURE

Build an event history, not a mutable status field

The useful unit was a payment event keyed by UETR: status, timestamp, participant, corridor and the information available for that leg. Kafka carried event updates; Spark prepared the consolidated history and the views consumed by tracking applications.

The critical choice was append-first. If a new status simply overwrites the previous one, the dashboard can say where the payment is but cannot explain how it got there. An ordered history supports both the current view and the later investigation.

SWIFT gpi payment-tracking architecture from source events to operations and client views
1
1. Ingest
Receive gpi status updates and the internal payment events needed to interpret them.
2
2. Correlate
Join events around the UETR while retaining source identifiers for reconciliation.
3
3. Order
Create a durable timeline and handle late or repeated updates without duplicating a payment leg.
4
4. Enrich
Derive corridor, elapsed time, exceptions and fee visibility from the event history.
5
5. Serve
Publish an operational investigation view and a customer-facing tracking view from the same facts.
03 · EDGE CASES

The hard cases were not the happy-path payments

Late updates
A downstream confirmation can arrive after a newer local event. Processing order cannot be treated as payment order.
Repeated messages
Retries and duplicate delivery must not create a second leg or distort elapsed time.
Partial visibility
No event is not the same as no progress. The interface must distinguish an unknown state from a confirmed delay.
Different audiences
Operations need bank, leg and exception detail. Clients need a clear status without internal control data or ambiguous banking codes.
04 · RESULT

What changed for the people following the payment

Operations and clients now read the same consolidated payment history. Operations kept the bank-by-bank detail needed to investigate exceptions; clients saw the corresponding tracking status.

The distinction: Real-time tracking is not a fast-refreshing page. Every visible status must resolve to an ordered event history that operations can reconcile.
05 · LESSONS

Three design rules survived the project

Keep the UETR at every boundary.

If an internal transformation drops the end-to-end identifier, the trace becomes a set of local records again.

Store state transitions, not only state.

The current status answers the client. The transition history answers operations, audit and incident review.

Design the client view and the operations view together.

They need different detail, but they should never disagree about the underlying payment journey.

What this case study does not claim

The client is anonymized. The 11 countries and 200 corridors describe the project scope, not throughput or latency. No payment values, message volumes, latency percentiles or measured reduction in support contacts are published here. The Swift references explain the service; they do not independently verify this deployment.