ISO 20022 pain.002 Payment-Status Report Parser
Turn your bank's pain.002 acknowledgements into live payment-batch statuses in Odoo — pure file parser, BYOK, no bank transmission
pain.002 is the ISO 20022 CustomerPaymentStatusReport
message your bank returns to acknowledge a payment-initiation file
(pain.001 credit transfer or pain.008 direct debit)
you previously submitted. This app reads those
pain.002.001.xx files, matches each acknowledgement back to the
payment batch you sent, and writes every transaction's
accepted / rejected / settled status — with the bank's
reason code — onto the matching batch line. No more opening raw XML to
find out which payment the bank bounced.
What it does
Version-independent parser
Reads every published pain.002 version (.001.02 through
.001.12) by matching ISO 20022 elements on their local
name, so a change of message version never breaks the import.
Three status levels
Captures the group status (GrpSts), the per-payment-information
status (PmtInfSts) and the per-transaction status
(TxSts). Each transaction inherits the most specific status
that applies to it — exactly how banks layer their reports.
Reason codes, decoded
Every rejection carries an ISO 20022 ExternalStatusReason1Code
(e.g. AC01 incorrect account, AM04 insufficient
funds) plus the bank's free text. The app decodes the code to a readable
label and shows it right on the line.
Batch matching
Acknowledgements are matched to your local payment batch on the original message id the bank echoes back, then each transaction is linked to its batch line by End-to-End id, Instruction id or UETR.
How it works
1. Register the batch
Record the payment file you sent — its original message id and the lines it contained (End-to-End id, amount, counterparty). Optionally link each line to its Odoo payment.
2. Download & import
Download the pain.002 file your bank returns and upload it. The app parses it and matches it back to the batch automatically.
3. Apply the statuses
Apply the acknowledgement: every batch line is updated to accepted, rejected or settled, and rejected lines flag their linked payment with the bank's reason.
Status codes handled
| Code | Meaning | Bucket |
|---|---|---|
ACTC | Accepted Technical Validation | Accepted |
ACCP | Accepted Customer Profile | Accepted |
ACSP | Accepted Settlement In Process | Accepted |
ACSC | Accepted Settlement Completed | Settled |
ACWC | Accepted With Change | Accepted |
PDNG / RCVD / PART | Pending / Received / Partially Accepted | Pending |
RJCT | Rejected | Rejected |
CANC / BLCK | Cancelled / Blocked | Rejected |
Key features
- Reads pain.002.001.02 – pain.002.001.12 regardless of namespace version.
- Group, payment-information and transaction status levels with automatic inheritance.
- Full ISO 20022 status reason code table (AC01, AM04, MD01, FF01 and more), decoded to readable labels.
- Matches each acknowledgement to its payment batch on the original message id; links transactions by End-to-End id, Instruction id or UETR.
- Writes accepted / rejected / settled status straight onto the batch lines and rolls the batch up to a single verdict.
- Settlement follow-ups promote accepted lines to settled as later pain.002 files arrive.
- Rejected lines post a note on the linked Odoo payment with the bank's reason.
- Stored, searchable status buckets — filter batches and reports by “with rejections”, “pending” or “final”.
- One-step import wizard: upload, parse, match and apply in a single action.
BYOK — you stay in control
This is a pure file parser. You download the pain.002 from your own bank channel (portal, EBICS, SFTP) and upload it here; the app never connects to your bank and never holds your banking credentials. It generates no payment files and transmits nothing — it only reads the status report your bank already produced.
Compatibility
Odoo 18.0 and 19.0 · Community and Enterprise · depends only on the base account module.
Screenshots
Payment Batches
Import Pain 002
Status Reports
Transaction Statuses
Update date: 2026-07-02