What a Borderless Banking App Needs From Payment Data

21 September 2026
•
9
min read

A banking app that works perfectly at home can fall apart on the first foreign payment. The domestic feed works because the same merchants repeat week after week: the supermarket, the transport operator, the coffee place near the office. The moment a customer lands abroad and taps their card, that repetition disappears, and the app has to answer a harder question from a single transaction record. A borderless banking app is the answer.  

This is a build guide for what the data has to carry, and what the app can show once it does.

The question the app has to answer abroad

Open the app after a first payment in a new country and the customer expects the same thing they get at home: a name they recognise, a category that makes sense, a place they can picture. The domestic feed earns its trust quietly, because the merchant set is small and familiar, and the app has seen each name hundreds of times.

Abroad, none of that history helps, but the problem is not that the record is empty. The clearing message already carries a merchant descriptor, a terminal ID, a card acceptor ID, a merchant city and country, and a merchant category code. The problem is that this raw material is not good enough to put on a screen. The descriptor is not the brand, the category code is very broad and often wrong, and the city is a data string rather than a place. So, the useful way to think about an app that travels well is not as a feature list but as a chain: one transaction record, resolved from noisy inputs into clean ones, and then everything those clean fields support.

Why the raw descriptor is not enough

The merchant category code looks like a solution and mostly isn't. The MCC is set by the acquirer when the merchant is onboarded and rarely revisited, so it drifts out of date as businesses change. Catch-all codes absorb whatever does not fit cleanly, which means a large share of transactions land in generic categories. And even when the MCC is right, it identifies a type of business, never a brand: it will tell you a payment was to a restaurant, never which restaurant. A spending feed built on MCC alone is a feed of categories without names.

Raw descriptors and IBANs that trigger disputes, resolved by Tapix into named merchants with logos.

Location has the same problem. It arrives as a city data string, not coordinates and not a venue, so it can anchor a transaction to a country but not drop a pin the customer recognises. Turning "BEY LB" into a mappable point in Beirut is purely enrichment work.

The hardest case is the payment facilitator. When a customer pays a small merchant through a payfac like PayPal, SumUp, Zettle or Square, the descriptor leads with the facilitator's prefix, and the underlying merchant is buried behind it or missing altogether. This is where the real naming problem sits: the string names the data fasade, not the café. Getting to the café is the core of the work.

Why coverage behaves differently outside the home market

At home, recognition rests on repetition. Abroad, it rests on database breadth, and that is a different problem. A domestic merchant database only needs the merchants a bank's own customers actually visit, and a small set of high-frequency names covers most of the feed. This is the familiar Pareto pattern: a fifth of the merchants account for most of the transactions, so a modest database looks impressive at home.

That pattern is what stops helping abroad. A traveller's spending is the long tail: a café in one city, a museum in another, a car park, a pharmacy, a local supermarket chain the customer has never used before and never will again. Volume of transactions does not rescue you here, because the merchants a traveller hits are the ones outside the frequent set. What matters instead is how many markets the database genuinely covers, and how deeply.

There is a second, quieter problem. Payment terminals do not sit still. Around a quarter of terminals are replaced each year, on a three-to-four-year lifetime, which means the mapping between a terminal identifier and the merchant behind it keeps changing. Coverage is not a number you reach once. A merchant database that was accurate last quarter degrades unless it is refreshed, which is why an evaluation should treat coverage as a live figure.

Which leaves a bank two ways to get it. Build the foreign merchant database in-house and own the market breadth, the local-script names, the descriptor matching, and the terminal-churn refresh cycle as a permanent commitment. Or source it from an enrichment partner whose whole business is keeping that layer current across markets. For most banks the foreign feed is not where the in-house effort pays off, and it is the merchant-data problem that decides whether the app works abroad at all.

What the customer wants to see on a foreign payment

Four resolved fields carry the recognition. The merchant name, cleaned from the descriptor to the brand the customer knows. The logo, so the eye finds the transaction before the reader does. The category, resolved beyond the broad MCC to something specific enough to be useful in a summary. And the location, lifted from a city string to a point on a map. Together these turn an anonymous line into something the customer recognises at a glance.

Raw card payment resolved by Tapix into Starbucks with logo, category, contact and map location.

Localisation is the part that only surfaces abroad, and it is easy to get the concept wrong. In an Arabic-language app, ماكدونالدز is a transliteration of McDonald's, and it is the correct thing to display. The real distinction is not between script and transliteration; it is between a merchant's registered local name and a machine transliteration generated on the fly from the descriptor. The registered name is reliable, the machine transliteration is not. Many merchants have no registered local-script name at all, and for those, falling back to the Latin brand is correct behaviour. What a data layer has to do is hold the registered local name where it exists and know when to fall back where it doesn't.

The difference is easiest to see in one before and after. In Riyadh, a payment arrives with a descriptor close to SumUp*Cafe 04378 RUH SA. Resolved, the same payment reads as a named café with its logo, a specific Food & Drink category, a location pin in the right district, and, in an Arabic interface, the café's registered Arabic name where one exists.

The trip view and how to build it

The feature travellers value most is the one they never have to set up. When each foreign payment carries a clean merchant, a category, a date, and a location, the app can group a set of transactions into a trip on its own: this cluster of payments, in this country, across these dates, adds up to this total, with this daily average. The customer opens the app after a week away and finds a spending summary of the whole trip without tagging a single line.

Revolut trip summary grouping foreign payments by country and dates, with total and daily average.

To build it, start from the resolved record and cluster on two axes the record already gives you, country and date range, then roll up the total and the daily average from the categories underneath. The grouping logic is simple. The work is making sure the records feeding it are clean, because trip grouping is derived data, and derived data inherits every mistake in the layer beneath it.

That is also where it breaks, so it is worth knowing the edge cases before they reach a customer. If half the payments on a trip resolve and half arrive as unresolved descriptors, the app does not throw an error. It shows a trip that is missing days, a total that is too low, and a set of unknown lines the customer cannot place. The summary looks finished but is wrong, which is worse than showing nothing, because the customer trusts it.  

Cash abroad

Cards do not cover a trip end to end, and travellers still reach for cash, so a borderless app usually needs an ATM-finder module. It is a different data set from merchant enrichment, with its own coverage, and it belongs in the app as its own component: nearest machines on a map, each with operator, distance, fees and accessibility, so the customer can choose before walking rather than discover the cost at the keypad.

Map of Prague showing ATMs dominated by a single non-bank operator.

The pricing detail that matters most is that on a foreign-currency card, the operator fee and dynamic currency conversion (DCC) together can add as much as 12% to a single withdrawal, and which machine the customer lands at is largely luck of the network: in Prague, non-bank operators run 87% of the machines at the main station and more than 63% in the historical centre, and independents are 75.6% of the London network against 20.5% in Amsterdam, where the big three merged their machines into Geldmaat.  

See the full picture in the Prague ATM analysis.

The business case and where the data comes from

The reason to build any of this is not only experience, it is cost. Unrecognised foreign descriptors are a direct driver of contact-centre volume: a customer who does not recognise a line calls to ask, or files an "I don't recognise this" dispute, and both land on teams the bank pays for. Every foreign payment resolved to a name the customer knows is a call and a dispute that never happens. That is the internal case for enrichment, and it usually outweighs the UX argument on its own.

Given that, the sourcing question is not whether to buy but how to choose, and the best practice for integrating an enrichment API treats the provider as a structural layer with an update mechanism, not a one-off data drop. Five checks separate a provider that will hold up abroad from one that looks good in a home-market demo. First, foreign coverage: not the headline market count, but recognition rates on merchants outside the provider's strongest regions. Second, localised names: whether registered local-script names are held where the app language needs them. Third, ATM data: whether cash-machine location, operator, and fee information are available, remembering that ATM coverage is a separate footprint from merchant coverage and the two figures should never be conflated. Fourth, response time: whether enrichment is fast enough to run inline within the authorisation budget. Fifth, confidence and fallback: whether the provider returns a confidence signal and a clean descriptor to fall back on, rather than forcing a guess.

One check sits outside the data quality itself and procurement asks it first: where is the data processed, and does it leave the EEA? Third-party processing, outsourcing rules and DORA obligations make the answer material, and it belongs in the build-or-buy decision from the start. The only reliable way to test the rest is a proof of concept on the bank's own foreign-transaction sample.  

A useful vendor comparison is a good starting point, but nothing substitutes for running your own tail of transactions through it.

Tapix covers these checks. It resolves merchant name, logo, category and location for foreign transactions through a single API, holds ATM data as a separate module covering most of Europe plus Singapore, Dubai, Colombia and Egypt, and covers 112+ active markets for merchant enrichment. Whether you source the data here or elsewhere, those checks are what a borderless banking app is built on: an app that works the same abroad as it does at home, because the record underneath it does.

FAQs

What is a borderless banking app?

A borderless banking app is a mobile banking app that behaves the same way abroad as it does at home. Foreign transactions arrive resolved to a recognisable merchant name, category and location, so the customer reads their spending in another country as easily as their spending on home turf. The term describes the experience, not a separate product: it depends entirely on the quality of the underlying transaction data.

What fields does a banking app need to display a foreign transaction?

At minimum, four: a clean merchant name, a merchant logo, a category, and a location. The raw string that arrives from a foreign terminal carries none of these in usable form, so each has to be resolved from the transaction record. Where the app runs in a non-Latin language, a localised merchant name in the local script is a fifth requirement.

How do banks show merchant names in the local script?

The merchant has to be held in the enrichment database in both its international form and its local-script form, attached to the same record. The app then renders whichever the interface language calls for. This is different from translating the name on the fly, which produces unreliable results, so it is worth confirming with a data provider that local-script names are stored.

What data does a trip spending summary need?

A trip summary is derived from individual transactions, so it needs each payment on the trip to carry a resolved merchant, a category, a date and a location. From those, the app groups payments by country and date range and calculates a total and a daily average. If a share of the transactions is unresolved, the summary silently understates the total and shows gaps, which is why recognition rates on foreign merchants matter more than the feature itself.

How can a bank show ATM fees before a withdrawal abroad?

The app needs ATM data that includes the operator surcharge, alongside the machine's location and operator. That surcharge is displayed before the customer withdraws, kept separate from the bank's own foreign-transaction pricing and from any currency-conversion offered at the machine. Showing the operator fee honestly, and flagging the machine's conversion prompt, lets the customer choose the cheapest option.

back to top arrow
×
Modal Image