An integration layer to evolve the channels without touching the core
A traceable service layer connected the institution's applications to its banking core, without pushing the core's complexity into every new build.
An integration layer to evolve channels without touching the core
A traceable service layer connected the applications with the banking core, without passing its complexity on to every new development.
- Mobile app
- Online banking
- Portals and back office
- REST API with versioned contracts
- One adapter per operation
- A correlation identifier per operation
- Retries with verified state
- Existing system, unchanged
- State is checked before retrying
- Rules and balances remain its own
Your core works, but does every new channel restart the integration?
We can build a service layer that connects your applications to the existing banking system and reduces technical coupling.
The challenge
The banking core held the institution's essential data and operations, and there was no intention of replacing it: it did what it had to do. The problem was a different one. Every new channel integrated against it from scratch.
The team building an application had to learn the banking system's own formats, interpret its response codes and solve validation, error handling and operation tracking on its own. A change in the core forced a review of several consumers at once. A new application rebuilt integrations that already existed in another project, with different criteria.
The most delicate point appeared when an operation did not end with an immediate response. After a connection drop or a timeout, the channel was left without certainty: it did not know whether the request had been rejected, was still in progress, or had been recorded correctly by the core. In a financial environment, repeating an operation without knowing its state is as risky as losing it.
The solution
We built an integration layer between the core and the systems that need to query or record banking information. It works as a stable boundary: channels consume service contracts defined per operation, and specialized adapters translate those requests into the format the core expects.
Six channels are enabled: online banking web, online banking mobile, the branch back office, the call centre, internal systems and third-party integrations. The journey starts when a user initiates a query from any of them. The application sends the request to the service layer, which validates identity, permissions and the presence of mandatory data before touching anything. If the request is valid, the corresponding service applies the integration rules and hands it to the adapter.
The layer publishes twelve operations grouped into four families. Position: balance query, movement query, customer accounts query and receipt query. Transfers: new transfer, status query and operation reversal. Payments: new bill payment and payment query. Products: term deposit query, new term deposit and loan query. Each one has its own contract, version and execution mode, synchronous or deferred.
The adapter transforms the message without exposing that complexity to the channel: it converts fields, codes and structures into the core's model, executes the communication and receives the result. It then normalizes the response, so consuming applications always work with the same contract, regardless of how the core represents the information internally.
When the operation completes successfully, the channel receives a functional response it can show the user. When it is interrupted, the integration keeps the identifier and the state of the exchange. Instead of blindly repeating the request, the support team checks which stage it reached and verifies the result against the core before deciding whether a retry is warranted.
Every operation is tied to a correlation identifier. From the tracking view, the authorized team can check the reception time, the originating channel, the invoked service, the state and the technical result. Sensitive data is protected: the trace exists to diagnose an incident, not to become a parallel copy of banking information.
This design also changes how a channel is added. The team building an application does not implement communication with the core again: it consumes the services already published and focuses on the experience and the rules of its own product. If the core changes, the adaptation is resolved in one place instead of in every consumer.
Platform architecture
The architecture separates five responsibilities: consuming channels, the access and security point, the integration services, the specific adapter and the core. That division is what prevents external contracts from reproducing the banking system's internal structures, which is exactly the coupling the project set out to remove.
Synchronous operations traverse the layer and return a normalized response to the channel. Those requiring deferred processing keep a queryable state and a unique identifier. Treating each interaction according to its real behaviour is what makes it possible to avoid indiscriminate automatic retries on financial operations.
Observability follows the whole journey. Technical events record the request's progress and make it possible to relate what happened in the channel with the actual invocation against the core. Support can investigate a single operation without walking through the isolated logs of four different systems.
The core remains the system responsible for processing and confirming banking operations. The layer does not duplicate that responsibility: it controls the exchange, translates the contracts and presents a stable interface for everything that evolves around it.
The implementation
We started by identifying the priority operations and documenting, for each one, its inputs, responses, validations and possible error states. Before adding the first channel we defined the integration contracts and built reproducible test cases, to confirm that the new layer interpreted the core exactly as the existing processes did.
The rollout was progressive, and that was the design decision that mattered most. Each operation was validated end to end before the next one was added: correct responses, functional rejections, timeouts and recovery from communication failures. That allowed the integration to evolve without demanding a core replacement or a simultaneous migration of every channel.
The result is an architecture where the core keeps its transactional role and new developments rely on a controlled, traceable interface. The institution adds services around the core without turning every digital initiative into an integration project that starts over.
Frequently asked questions
How do you prevent a retry from duplicating a banking operation?
Each request carries its own identifier and the integration stores the state it reached. After a drop, the team first verifies against the core whether the operation was recorded, and only then decides whether to retry. Indiscriminate automatic retries are not applied to financial operations.
Does the core have to be replaced to add digital channels?
No. The core keeps processing and confirming banking operations. The layer handles contracts, input validation, transformation, communication and traceability, and publishes a stable interface for the applications built around it.
What happens when the core changes a format or a response code?
The change is absorbed by the adapter, the only component that knows the banking system's internal model. Channels keep consuming the same contract and need no new version or redeployment.
Can it be implemented in stages without disrupting operations?
Yes, and that is the recommended approach. Operations are prioritized by channel and by risk, and each circuit is validated end to end before the next one is added, including functional rejections and timeouts.
Does the integration layer store banking information?
It does not replicate the core's database. It records the technical data of the exchange so an incident can be diagnosed, with sensitive fields protected. The trace exists to reconstruct what happened to an operation, not to query balances or movements.
How is a rejected operation diagnosed?
Through the correlation identifier, which links the channel request, its transformation, the communication with the core and the result. A single view shows at which stage it stopped and with which technical response, without cross-checking logs from several systems.
Why you will not see the client name
We work under non-disclosure agreements: we do not publish company names, commercial data, or technical details that could compromise our clients' operations. The metrics in this case study are real and validated with them. Need more detail to evaluate us? We can expand on it under NDA.