pain.002 — Customer Payment Status Report
Creditor bank reply to a pain.001 or pain.008. Confirms acceptance, rejects, or indicates partial status. Cornerstone of cross-bank payment tracking.
Purpose and place in the flow
pain.002 is the status report. A corporate sends a pain.001 to its bank; minutes or hours later, the bank replies with a pain.002 indicating for each transaction in the pain.001: accepted, rejected, in progress.
XML structure
Three hierarchical levels:
- OrgnlGrpInfAndSts — status at the Group level (the entire pain.001).
- OrgnlPmtInfAndSts — status at the PaymentInformation level.
- TxInfAndSts — per-transaction status.
Status codes
| Code | Semantics |
|---|---|
ACCP | Accepted Customer Profile (pre-receipt validation). |
ACTC | Accepted Technical Validation. |
ACSP | Accepted Settlement In Process. |
ACSC | Accepted Settlement Completed. |
RJCT | Rejected. |
PART | Partially Accepted (mixed in the batch). |
PDNG | Pending (manual review). |
Reason codes
Most frequent StsRsnInf/Rsn/Cd codes:
AC01— IncorrectAccountNumber.AC04— ClosedAccountNumber.AC06— BlockedAccount.AM04— InsufficientFunds.BE05— UnrecognisedInitiatingParty.RR01— MissingDebtorAccountOrIdentification.
Example: rejected credit transfer
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.002.001.10">
<CstmrPmtStsRpt>
<GrpHdr>
<MsgId>STS-ACME-20260518-001</MsgId>
<CreDtTm>2026-05-18T11:00:00+02:00</CreDtTm>
<InitgPty><Nm>BNP Paribas</Nm></InitgPty>
</GrpHdr>
<OrgnlGrpInfAndSts>
<OrgnlMsgId>ACME-PMT-20260518-001</OrgnlMsgId>
<OrgnlMsgNmId>pain.001.001.09</OrgnlMsgNmId>
<OrgnlCreDtTm>2026-05-18T09:00:00+02:00</OrgnlCreDtTm>
<OrgnlNbOfTxs>3</OrgnlNbOfTxs>
<OrgnlCtrlSum>15000.00</OrgnlCtrlSum>
<GrpSts>PART</GrpSts>
</OrgnlGrpInfAndSts>
<OrgnlPmtInfAndSts>
<OrgnlPmtInfId>ACME-PMT-PI-001</OrgnlPmtInfId>
<OrgnlNbOfTxs>3</OrgnlNbOfTxs>
<OrgnlCtrlSum>15000.00</OrgnlCtrlSum>
<PmtInfSts>PART</PmtInfSts>
<TxInfAndSts>
<OrgnlEndToEndId>INVOICE-2026-042</OrgnlEndToEndId>
<TxSts>RJCT</TxSts>
<StsRsnInf>
<Rsn><Cd>AC01</Cd></Rsn>
<AddtlInf>IBAN does not exist at debtor bank</AddtlInf>
</StsRsnInf>
<OrgnlTxRef>
<Amt><InstdAmt Ccy="EUR">5000.00</InstdAmt></Amt>
</OrgnlTxRef>
</TxInfAndSts>
</OrgnlPmtInfAndSts>
</CstmrPmtStsRpt>
</Document> Common pitfalls
- Group status=ACCP but transactions=RJCT — check statuses at all levels, not just Group.
- Non-standard reason code — use ISO ExternalStatusReasonCode codes.
- No OrgnlEndToEndId — prevents the client from matching with the original transaction.