Payments Applications
The Customer Asks One Question.
Your Systems Hold Five Partial Answers.
Payments application engineering built around the state of a payment: modelled properly, including the state where nobody knows, with retries that cannot double-pay and exceptions treated as the real workload.
Did it go. That is the only question a customer asks about a payment, and it is harder to answer than it sounds. The channel accepted it, the account was debited, the message was submitted, the rail acknowledged it, value moved, and each of those is a different fact held in a different place.
The problem
Seven states, and one of them is unknown
A payment moves through a sequence of states that mean different things, are known by different systems at different times, and are routinely collapsed into two words on a screen.
Status is collapsed into sent or failed
So the customer is told something the system does not know.
Unknown is not a state in the model
And a timeout gets recorded as one of the other two.
Retries are not safe
Which turns a recoverable timeout into a duplicate payment.
Channels integrate to rails directly
So each new channel repeats the whole integration.
Exceptions are handled off-system
In a mailbox, a spreadsheet and somebody’s knowledge.
Reconciliation is end-of-day and manual
So a break is found hours after it could have been fixed.
Cut-off is not visible to the customer
They submit, and discover tomorrow that it was tomorrow.
Structured message data is truncated on arrival
Discarding the richness the migration was for.
Ask what your system does when a submission times out. Not what it displays, what it does. Does it mark the payment unknown, enquire, and resolve to a single outcome. Or does it mark it failed, leaving a payment that may have been made, and allow a retry that may duplicate it. The answer takes one conversation with an engineer, and it is the most consequential design property of a payments application. Everything else on this page is easier than fixing this one afterwards.
Our approach
Design the lifecycle and the exceptions before the happy path
A payments application is specified around successful payments and spends its operational life on the ones that are not. The returns, the rejects, the recalls, the duplicates, the misdirected and the unapplied are a small share of volume and most of the work, most of the support contact and most of the operational risk.
Designing them last means designing them into a system whose state model and data structures were built for success, which is why exception handling in most estates lives in a mailbox and a spreadsheet.
Step 1
Map the payment journeys and the rails in scope
Step 2
Design the state model first, including unknown
Step 3
Establish idempotency and reference discipline
Step 4
Design the exception taxonomy and its workflows
Step 5
Design cut-off, calendar and value dating explicitly
Step 6
Integrate rails, processors and hubs behind one orchestration layer
Step 7
Integrate the controls your risk functions require
Step 8
Build status enquiry and customer-visible status
Step 9
Build reconciliation as a continuous control
Step 10
Test the failure paths deliberately, including timeouts
Step 11
Deploy with observability on state transitions
Step 12
Monitor success, latency, exceptions and breaks separately
Ask for your payment exceptions grouped by root cause rather than by type. Type tells you what happened. Cause tells you what to fix. In most institutions exceptions are reported by type, the cause is held in free text or in an operator’s head, and the top few causes account for the large majority of volume. Categorising one month of exceptions by cause is a few days of work and it usually produces an engineering backlog that pays for itself within a quarter.
What we build
Initiation, orchestration, status and everything that goes wrong
Grouped by what each part is responsible for. The orchestration layer is what stops every channel having its own integration to every rail, which is the structural problem in most payments estates.
Initiation and experience
Payment initiation across channels, with the same validation, limits and controls applied wherever the instruction originates
Beneficiary management, verified, reused and maintained rather than retyped
Recurring and scheduled payments, including the amendment and cancellation paths that are usually underbuilt
Bulk and file-based payments, including partial failure handling, which is covered in section 5
Customer-visible payment status, which is the feature that removes the most contact
Orchestration and routing
A payment orchestration layer owning the lifecycle, so a channel integrates once and a new rail is an addition rather than a programme
Routing by rail, cost, speed and availability, under rules your payments function owns
Idempotency and reference management end to end, as described in section 2
Cut-off, calendar and value dating modelled as data, including non-working days per currency and market
Limit and entitlement enforcement, including the multi-user approval flows described on our Digital Banking Platforms page
Processing and exceptions
Transaction processing workflow with explicit state transitions and an audited history of each one
Exception management across returns, rejects, recalls, duplicates, misdirected and unapplied items, as cases rather than emails
Enquiry and investigation support, including status enquiry to every integrated party
Automated resolution where the category genuinely allows it, with the rest routed to a named owner
Reconciliation and visibility
Three-way reconciliation across your ledger, the rail or processor and the counterparty position, as a continuous control
Break investigation workflow with ageing and ownership, on the discipline described on our Operational & Financial Analytics page
Payment dashboards covering volume, success, latency, exceptions and breaks, by rail and by channel
An agent-facing view that can state plainly whether a payment is pending, failed, returned, repaired or complete, since the contact centre answers this question more often than anybody
Payment APIs for internal and partner consumption, versioned, on the API discipline described on our Digital Banking Platforms page
Where this gets used
Eight workloads, and the property that decides each one
The third column is the point of the table. These are usually served by one payments capability and each one is shaped by a different property of the rail or the instruction.
| Workload | What it depends on | The property that decides the design |
|---|---|---|
| Domestic payments | The rail and its cut-off behaviour | Whether value movement is revocable |
| Real-time payments | Immediate, irrevocable settlement | Every control must be pre-submission |
| Cross-border payments | Correspondents, currency, intermediaries | Status is partial for longer, sometimes days |
| Business payments | Multi-user approval and limits | Entitlement and mandate, not the payment |
| Bulk and file payments | A file with many instructions | Partial failure within a single submission |
| Recurring payments | A standing instruction over time | Amendment, failure and the long tail of changes |
| Collections | Pulling rather than pushing funds | Mandates, returns and representment |
| Exception management | Everything above, when it fails | The taxonomy, and whether it is a case |
How it is built
Reconciliation is three-way, and it is a control rather than a report
Payment reconciliation is usually described as matching the ledger to a statement. In practice three records of the same payment exist and all three have to agree: your own position, the rail or processor’s record, and what the counterparty or customer believes happened.
A difference between any pair is a different kind of problem with a different owner, which is why a single reconciliation report rarely resolves anything.
An orchestration layer owning payment state, with every transition recorded and queryable, which is the foundation for everything else here
Rail, processor and payment hub integration behind that layer rather than per channel
Core banking integration for the accounting entries, on the patterns described on our Banking Data Platform Engineering page
Message handling that retains the original message as received, including the structured content described in section 4
Event-driven propagation of state changes to channels, notifications and downstream systems, so status is pushed rather than polled
Three-way reconciliation running continuously rather than at end of day, because a break found at four in the afternoon can still be fixed
Screening and fraud controls integrated in the path your risk functions specify, in the position they specify
And observability on state transitions and ageing, so a stuck payment is detected before a customer reports it
Ask who notices first when a payment gets stuck. If the honest answer is the customer, then the institution has no state ageing and the first signal of any payments incident is a complaint. Expected durations per state are straightforward to define, the data is already there in the transitions, and the difference is between finding out at ten in the morning from a dashboard or at two in the afternoon from a contact centre escalation. On payments, those are very different days.
Governance
We integrate the controls. We do not design them.
Which payment regulations, scheme rules, operational resilience expectations and data protection requirements apply, where controls must sit in the payment path, and what authorisation is required are determined by your payments, compliance, legal, risk and security functions, based on your operating markets and your scheme memberships. We do not interpret those requirements and this page does not state which apply to you.
Technology supports a payments control framework. It does not independently establish one, and no platform makes a payment compliant.
Authorisation and integrity
- Transaction authorisation implemented to your security function’s standards, with strength proportionate to the instruction
- Entitlement and limits enforced server side on every instruction, never inferred from the channel
- Instruction integrity protected end to end, so an authorised payment cannot be altered between approval and submission
- Idempotency and duplicate prevention treated as controls rather than as engineering conveniences, since a duplicate payment is a loss event
Control integration
- Fraud controls integrated in the position and within the latency your fraud function specifies, with the detection itself covered on our Fraud Detection & Analytics page
- Sanctions and screening integrated where your compliance function requires, with the handling of a hit defined by them
- A documented position on any control that cannot run within an immediate rail’s latency, approved as a risk acceptance
- Segregation between those who initiate, approve and release, enforced by the system rather than by practice
Data and audit
- Payment data protected in transit and at rest, with card data handled under your scope determination
- The original message retained as received, which serves both investigation and the richness argument in section 4
- Audit trails over every state transition, approval, exception decision, override and release
- Retention per your records policy, which for payment evidence frequently exceeds what engineering teams assume
Resilience
- Availability objectives per rail and per journey, recognising that a payments outage is a different class of event to a reporting outage
- Defined behaviour when a rail, processor or control service is unavailable, including whether payments are queued or rejected, which is a business decision
- Recovery that cannot create duplicates, which is where idempotency and resilience meet
- Incident response rehearsed with the operations and payments teams rather than documented
Keeping it reliable
Success rate is not one number and latency is not an average
Payments reporting leads with a success rate and an average processing time. Both conceal the thing worth knowing: which rail, which channel, which payment type, and what the slowest few per cent looked like, because that is where the complaints come from.
| Failure | How it presents |
|---|---|
| A payment is stuck in a state | Nothing fails, and nothing completes |
| A timeout became a duplicate | Two payments, one instruction, one complaint |
| Unknown states accumulating | Resolved manually, slowly, without a process |
| One rail degraded | Aggregate success healthy, one route failing |
| Exception volume up on one cause | Reported by type, so the cause stays hidden |
| Reconciliation breaks ageing | Carried forward each day as normal |
| Beneficiary errors causing returns | Avoidable failures validated too late |
| Structured message data truncated | Migration complete, richness gone |
Outcomes
Payments that resolve to one known outcome
The outcomes below follow from three choices: model payment state honestly including unknown, make every operation safe to retry, and design exception handling as the product rather than the edge case.
More reliable payment experiences, measured as payments that resolve to a single known outcome without human involvement
Transaction visibility for the customer, which removes the largest category of payment contact
Fewer manual exceptions, achieved by fixing the top root causes rather than by resourcing the queue
Duplicates prevented structurally rather than detected afterwards
Stronger integration, with one orchestration layer rather than a connection per channel per rail
Reconciliation breaks that are found early, aged and owned
Scalable payment operations, where a new rail or channel is an addition rather than a programme
Ask us what happens when a payment times out.
We will take one payment type and establish four things: whether the state model includes unknown and how it resolves, whether every operation is safe to retry, what the top three exception causes are, and whether anything downstream uses the structured content of your messages. You get the findings whether or not we build anything.
Why choose CaliberFocus for Payments Applications?
CaliberFocus builds payments applications that model the state of a payment honestly, including the state where nobody knows, make every operation safe to retry, and treat exceptions as the real workload. We put one orchestration layer between channels and rails, reconcile three ways continuously, and keep structured message data intact.
- Payment state modelled explicitly, including unknown
- Idempotent operations so a retry can never pay twice
- Exception handling designed as cases, reported by root cause
- Continuous three-way reconciliation across ledger, rail and counterparty
Security & Compliance
