Skip to main content

pacs.008 — FIToFICustomerCreditTransfer

Overview

pacs.008 is the interbank credit transfer message in the ISO 20022 standard. It is sent between Financial Institutions (FIs) to move funds on behalf of a customer. This is the primary payment message flowing through clearing and settlement networks.

  • Full name: FIToFICustomerCreditTransferV10
  • Namespace: urn:iso:std:iso:20022:tech:xsd:pacs.008.001.10
  • Direction: Debtor Bank → (Intermediary Banks) → Creditor Bank
  • Triggered by: pain.001 processing at debtor bank

Message Structure

pacs.008
├── GrpHdr (Group Header) ← 1..1
│ ├── MsgId Unique message ID
│ ├── CreDtTm Creation timestamp
│ ├── NbOfTxs Number of transactions
│ ├── SttlmInf Settlement Information
│ │ ├── SttlmMtd Settlement method (INDA/INGA/COVE/CLRG)
│ │ └── SttlmAcct Settlement account (if applicable)
│ └── InstgAgt / InstdAgt Instructing / Instructed Agent

└── CdtTrfTxInf (Credit Transfer) ← 1..n
├── PmtId
│ ├── InstrId Instruction ID (assigned by sender)
│ ├── EndToEndId End-to-End ID (from pain.001)
│ └── TxId Transaction ID (unique within chain)
├── IntrBkSttlmAmt Interbank Settlement Amount
├── IntrBkSttlmDt Interbank Settlement Date
├── SttlmPrty Settlement Priority (HIGH/NORM)
├── InstdAmt Original instructed amount
├── XchgRate Exchange rate (if FX involved)
├── ChrgBr Charge Bearer (DEBT/CRED/SHAR/SLEV)
├── Dbtr Debtor details
├── DbtrAcct Debtor account
├── DbtrAgt Debtor Agent (sending bank)
├── CdtrAgt Creditor Agent (receiving bank)
├── Cdtr Creditor details
├── CdtrAcct Creditor account
├── Purp Purpose of payment
└── RmtInf Remittance info (passed through)

Settlement Methods (SttlmMtd)

CodeNameDescription
INDAInstructed AgentCreditor bank settles via its account at debtor bank
INGAInstructing AgentDebtor bank settles via its account at creditor bank
COVECover MethodSeparate cover payment sent via correspondent bank
CLRGClearing SystemSettled through a central clearing system (e.g., NPP, HVPS)

Charge Bearer (ChrgBr)

CodeMeaning
DEBTAll charges paid by debtor (sender)
CREDAll charges paid by creditor (receiver)
SHARShared — each party pays their own bank charges
SLEVService Level determines charge allocation

Payment ID Chain

Customer creates:    EndToEndId = "CUS-REF-20240101-001"
Debtor Bank adds: InstrId = "DB-INSTR-001"
TxId = "TXID-UUID-001"

These IDs travel unchanged through:
pain.001 → pacs.008 → camt.054
→ pacs.002 (status)
→ pacs.004 (return)

pacs.008 in Multi-Hop / Cover Payments

Debtor Bank ──[pacs.008]──► Correspondent Bank ──[pacs.008]──► Creditor Bank
└──────────────────[pacs.009 Cover]────────────────────►

In cover method (COVE), two parallel flows occur:

  • Payment flow: pacs.008 carries payment details to creditor bank
  • Cover flow: pacs.009 carries the actual funds via correspondent

Validation Checklist

  • MsgId is globally unique
  • NbOfTxs matches actual count of CdtTrfTxInf
  • IntrBkSttlmDt is a valid business date
  • EndToEndId preserved from original pain.001
  • Creditor account is valid (format check)
  • Sanctions screening passed
  • Duplicate detection (same TxId not processed twice)
  • IntrBkSttlmAmt currency is supported

MessageRelationship
pain.001Upstream initiator
pacs.002Payment status report (ACK/NACK/RJCT/ACCP)
pacs.004Payment return (if creditor bank rejects)
pacs.009Cover payment (FI-to-FI, no customer details)
camt.054Account notification to creditor
camt.053End-of-day statement

Real-Time vs Batch

ScenarioNotes
NPP (AU)Single pacs.008 per transaction, sub-second processing
SWIFTBatch or single, same-day or next-day settlement
RTGSSingle high-value, real-time gross settlement
ACH/DEBatched, processed in clearing windows

Java Spring Implementation Notes

@Component
public class Pacs008Builder {

public FIToFICustomerCreditTransferV10 build(PaymentOrder order) {
var msg = new FIToFICustomerCreditTransferV10();

// Group Header
var grpHdr = new GroupHeader93();
grpHdr.setMsgId(idGenerator.nextMsgId());
grpHdr.setCreDtTm(XMLGregorianCalendarUtil.now());
grpHdr.setNbOfTxs("1");
grpHdr.setSttlmInf(buildSettlementInfo(order));
msg.setGrpHdr(grpHdr);

// Transaction
var tx = new CreditTransferTransaction50();
tx.setPmtId(buildPaymentId(order));
tx.setIntrBkSttlmAmt(buildAmount(order));
tx.setDbtr(buildDebtor(order));
tx.setCdtr(buildCreditor(order));
tx.setRmtInf(buildRemittanceInfo(order));

msg.getCdtTrfTxInf().add(tx);
return msg;
}
}

Failure Scenarios

ScenarioResponse MessageKey Code
Creditor account not foundpacs.002 RJCTAC01
Duplicate transactionpacs.002 RJCTAM05
Sanction matchpacs.002 RJCTCH16
Settlement failurepacs.002 RJCTAG01
Creditor bank offlinepacs.002 RJCTREAS