ediverse Explore the platform

Spotlight PEPPOL BIS Billing 3.0 The EU e-invoicing mandate is here — France Sept 2026, Belgium Jan 2026, Germany 2025.

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

CodeSemantics
ACCPAccepted Customer Profile (pre-receipt validation).
ACTCAccepted Technical Validation.
ACSPAccepted Settlement In Process.
ACSCAccepted Settlement Completed.
RJCTRejected.
PARTPartially Accepted (mixed in the batch).
PDNGPending (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 pain-002-reject-AC01.xml
<?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.
  • pain.001 — initial credit transfer.
  • pain.008 — initial direct debit.
  • pacs.002 — FI to FI equivalent.
  • camt.054 — credit/debit notification.