Payment Exceptions & Investigations
Overviewโ
Payment exceptions are transactions that cannot be processed automatically and require manual intervention by operations staff. They arise from technical errors, data quality issues, unmatched payments, compliance holds, or network failures.
Effective exception management is critical โ unresolved exceptions represent financial risk, regulatory exposure, and customer dissatisfaction.
Types of Payment Exceptionsโ
| Type | Cause | Owner |
|---|---|---|
| Unmatched Inbound | Creditor account not found | Operations |
| Sanction Hold | Potential match on watchlist | Compliance |
| Fraud Hold | High fraud score | Fraud team |
| Duplicate Payment | Same payment submitted twice | Operations |
| Amount Mismatch | Payment amount doesn't match expected | Operations |
| Format Error | Invalid field values, missing mandatory fields | Tech/Operations |
| Settlement Failure | Network or counterparty settlement rejection | Operations |
| Timed-Out Payment | No confirmation received within SLA | Operations |
| Suspense Account Item | Funds received, account unidentifiable | Operations |
| Return Not Applied | pacs.004 received but original not found | Operations |
| Balance Discrepancy | Statement balance doesn't reconcile | Finance/Operations |
| FX Rate Dispute | Incorrect exchange rate applied | Treasury/Ops |
Exception Lifecycleโ
Exception Raised (auto or manual)
โ
โผ
Categorise & Prioritise
โโโ HIGH: Regulatory (sanctions) โ Compliance team
โโโ HIGH: Large amount > threshold โ Senior ops
โโโ MEDIUM: Unmatched inbound โ Ops queue
โโโ LOW: Minor format warning โ Batch ops
โ
โผ
Assign to Owner / Queue
โ
โผ
Investigate
โโโ Check payment details
โโโ Contact counterparty bank (SWIFT gpi, phone)
โโโ Contact customer
โโโ Check upstream systems
โ
โผ
Resolve
โโโ Apply to correct account
โโโ Return funds (pacs.004)
โโโ Resubmit corrected payment
โโโ Write off (if unrecoverable, within authority)
โโโ Escalate (if above resolution authority)
โ
โผ
Close & Log
(outcome, root cause, resolution time)
Unmatched Inbound Payments (Suspense)โ
The most common exception โ an inbound payment arrives but the creditor account cannot be identified:
Inbound pacs.008 received
โ
โผ
Account lookup fails:
โโโ Invalid BSB + account number
โโโ Account closed
โโโ PayID not registered
โโโ Account in different currency
โ
โผ
Funds credited to SUSPENSE ACCOUNT
(internal holding account โ not customer money yet)
โ
โผ
Exception raised in Ops queue
โ
โผ
Operations team investigates:
โโโ Check if account recently closed โ identify new account
โโโ Check if CRN/reference matches known customer
โโโ Contact sending bank for more details
โโโ Contact potential beneficiary
โ
โโโ MATCH FOUND: Transfer from suspense โ customer account
โ Send camt.054 to customer
โ
โโโ NO MATCH after SLA: Return via pacs.004
Reason code: AC01 / AC04
Suspense SLAsโ
| Priority | SLA | Action on Breach |
|---|---|---|
| > $100,000 | 24 hours | Escalate to senior ops manager |
10,000โ100,000 | 3 business days | Team lead review |
| < $10,000 | 5 business days | Standard ops handling |
| Any amount after 10 days | Mandatory return | Regulatory obligation |
Sanction Holdsโ
When a payment hits a potential sanctions match:
Payment held by sanctions engine
โ
โผ
Compliance analyst receives alert
โ
โผ
Review:
โโโ Is this a true match or false positive?
โโโ Name similarity? Address? Entity type?
โโโ Check all aliases and related entities
โโโ Consult legal/compliance if uncertain
โ
โโโ FALSE POSITIVE:
โ Document decision + rationale
โ Release payment
โ Update screening rules if needed
โ
โโโ TRUE MATCH (CONFIRMED HIT):
BLOCK payment permanently
Freeze account (if customer is sanctioned)
File report with AUSTRAC / OFAC / OFSI
DO NOT tip off the customer
Retain records (7 years)
Critical: Sanctions holds must never be resolved by simply releasing the payment without compliance review. The payment must be permanently blocked if it's a true hit.
Timed-Out / Unconfirmed Paymentsโ
When a payment is submitted but no pacs.002 confirmation arrives:
Payment submitted to NPP/SWIFT at T+0
โ
No pacs.002 within SLA:
NPP: 60 seconds
RTGS: 15 minutes
SWIFT: 24 hours (business day)
โ
โผ
Exception raised: UNCONFIRMED PAYMENT
โ
โผ
Investigate:
โโโ Check NPP/SWIFT tracking (gpi, UETR)
โโโ Query network operator
โโโ Check if duplicate already received
โโโ Contact counterparty bank directly
โ
โโโ CONFIRMED SETTLED:
โ Apply settlement to internal records
โ Close exception
โ
โโโ CONFIRMED REJECTED:
โ Reverse debit posting
โ Notify customer
โ
โโโ STILL UNKNOWN after 2 business days:
Treat as failed
Reverse debit
Notify customer
Pursue recovery if funds confirmed gone
Exception Priority Matrixโ
| Severity | Criteria | Response SLA | Escalation |
|---|---|---|---|
| P1 Critical | Regulatory hold (sanctions), large systemic failure | 1 hour | Compliance Director / CTO |
| P2 High | > $500K unresolved, customer complaint, potential fraud | 4 hours | Ops Manager |
| P3 Medium | > $10K unmatched, settlement fail | 1 business day | Team Lead |
| P4 Low | < $10K unmatched, format warning | 3 business days | Standard queue |
Exception Metrics (KPIs)โ
| Metric | Formula | Target |
|---|---|---|
| Exception Rate | Exceptions / Total payments | < 0.1% |
| STP Rate | Payments processed without exception / Total | > 99.9% |
| Avg Resolution Time | Time from raise to close | < 4h (P1), < 8h (P2) |
| Suspense Aging | Items > 5 days in suspense | 0 |
| False Positive Rate | Sanctions false positives / total alerts | < 80% |
| Repeat Exceptions | Same root cause recurring | Trending down |
Java Spring Implementationโ
@Service
public class ExceptionManagementService {
public PaymentException raise(
String paymentId,
ExceptionType type,
String reason) {
PaymentException exception = PaymentException.builder()
.paymentId(paymentId)
.type(type)
.reason(reason)
.status(ExceptionStatus.OPEN)
.priority(determinePriority(type, paymentId))
.raisedAt(Instant.now())
.assignedQueue(routeToQueue(type))
.build();
exceptionRepository.save(exception);
// Alert operations team
opsAlertService.alert(exception);
// If P1/P2 โ page on-call ops
if (exception.getPriority().isCritical()) {
oncallService.page(exception);
}
return exception;
}
public void resolve(
String exceptionId,
ResolutionAction action,
String resolvedBy,
String notes) {
PaymentException exception = exceptionRepository.findById(exceptionId)
.orElseThrow();
switch (action) {
case APPLY_TO_ACCOUNT -> applyToAccount(exception);
case RETURN_FUNDS -> initiateReturn(exception);
case RESUBMIT -> resubmitPayment(exception);
case WRITE_OFF -> {
authorisationService.checkWriteOffAuthority(
resolvedBy, exception.getAmount());
writeOffService.writeOff(exception);
}
}
exception.setStatus(ExceptionStatus.CLOSED);
exception.setResolvedAt(Instant.now());
exception.setResolvedBy(resolvedBy);
exception.setResolutionNotes(notes);
exceptionRepository.save(exception);
auditService.logResolution(exception);
}
}
public enum ExceptionType {
UNMATCHED_INBOUND,
SANCTION_HOLD,
FRAUD_HOLD,
DUPLICATE_PAYMENT,
SETTLEMENT_FAILURE,
TIMEOUT,
FORMAT_ERROR,
AMOUNT_MISMATCH,
SUSPENSE_ITEM,
RETURN_NOT_APPLIED
}
Root Cause Analysis (RCA)โ
After resolving exceptions, capture root cause to prevent recurrence:
| Root Cause Category | Example | Prevention |
|---|---|---|
| Data quality | Invalid BSB submitted by customer | Add BSB validation in UI |
| System bug | Duplicate submission on timeout retry | Implement idempotency keys |
| Configuration | Stale sanctions list not updated | Automate list refresh |
| Counterparty | Other bank sent wrong account | Improve Confirmation of Payee |
| Process gap | No SLA monitoring for suspense | Add automated aging alerts |
Related Conceptsโ
- inbound.md โ Unmatched inbound is the most common exception
- sanction.md โ Sanction holds
- fraud.md โ Fraud holds
- reconciliation.md โ Exceptions surfaced through reconciliation
- payment_return.md โ Resolution via pacs.004 return
- debit_reversal.md โ Resolution via debit reversal